我的情况是这样的:我正在为一门操作系统课程编写UNIX|.我完成了我的实现;然而,我注意到我不确定地通过了测试用例.所讨论的测试用例的形式如下:

    def test_no_orphans(self):
        self.assertTrue(self.make, msg='make failed')
        subprocess.call(('strace', '-o', 'trace.log','./pipe','ls','wc','cat','cat'))
        ps = subprocess.Popen(['grep','-o','clone(','trace.log'], stdout=subprocess.PIPE)
        out1 = subprocess.check_output(('wc','-l'), stdin=ps.stdout)
        ps.wait()        
        ps.stdout.close()
        ps = subprocess.Popen(['grep','-o','wait','trace.log'], stdout=subprocess.PIPE)
        out2 = subprocess.check_output(('wc','-l'), stdin=ps.stdout)
        ps.wait()  
        ps.stdout.close()
        out1 = int(out1.decode("utf-8")[0])
        out2 = int(out2.decode("utf-8")[0])
        if out1 == out2 or out1 < out2:
            orphan_check = True
        else:
            orphan_check = False
        self.assertTrue(orphan_check, msg="Found orphan processes")
        subprocess.call(['rm', 'trace.log'])
        self.assertTrue(self._make_clean, msg='make clean failed')

在查阅有关日志(log)后,我发现:

clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f04174ad850) = 1330
close(4)                                = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=1330, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
pipe([4, 5])                            = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f04174ad850) = 1331
close(5)                                = 0
close(3)                                = 0
pipe([3, 5])                            = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f04174ad850) = ? ERESTARTNOINTR (To be restarted)
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=1331, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f04174ad850) = 1332
close(5)                                = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=1332, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
close(4)                                = 0
pipe([4, 5])                            = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f04174ad850) = 1333

具体地说,排在ERESTARTNOINTR (To be restarted)位的队伍让我失败了.在我的教授帮助我调试后,我向负责这项任务的助教报告了这一点,并说这可能是测试用例中的错误.

我想知道为什么正好clone()会失败,因为fork()似乎用一个很好的C包装器为我们处理了这个问题.我还想知道这里到底发生了什么,还有为什么系统调用似乎总体上似乎有incompleteresumed的状态,因为我的操作系统教授说他对此了解不多,他基本上说这可能是"内核中的竞争条件".

推荐答案

clone(2)的手册页显示在以下情况下返回ERESTARTNOINTR

系统调用被信号中断,将重新启动.(只有在跟踪期间才能看到这一点.)

提供的日志(log)中失败的clone系统调用被PID 1331的SIGCHLD信号中断.

C++相关问答推荐

当我try 计算一个多项时,看到segfault.我做错了什么?

有什么方法可以检测SunOS上的SparcWorks吗?

错误:C中需要参数声明符

Ebpf内核代码:permission denied:invalid access to map value

数据包未从DPDK端口传输到内核端口

ZED for SDL上的C语言服务器

如何使用低级C++写出数值

在C++中头文件中声明外部 struct

拥有3x3二维数组并访问数组[1][3]等同于数组[2][0]?

试图从CSV文件中获取双精度值,但在C++中始终为空

预先分配虚拟地址空间的区域

这个计算C中阶乘的函数正确吗?

将变量或参数打包到 struct /联合中是否会带来意想不到的性能损失?

C代码可以在在线编译器上运行,但不能在Leetcode上运行

C程序向服务器发送TCPRST

我可以创建适用于不同endian的 colored颜色 struct 吗?

将 struct 数组写入二进制文件时发生Valgrind错误

生成一个半RNG,结果用C表示(无随机/随机)

如何为avr atmega32微控制器构建C代码,通过光电二极管捕获光强度并通过串行通信传输数据

如何向 execl 创建的后台程序提供输入?