在linux平台上收获C时丢失子进程
获取子进程的数量是否有任何限制? 假设我的系统运行一个父进程和500多个子进程 父级正在阻塞模式下执行waitpid(-1,状态,0)。 有时我确实看到了-1在linux平台上收获C时丢失子进程,c,linux,fork,C,Linux,Fork,获取子进程的数量是否有任何限制? 假设我的系统运行一个父进程和500多个子进程 父级正在阻塞模式下执行waitpid(-1,状态,0)。 有时我确实看到了-1 如果500个子进程同时完成并将其状态报告给父进程,是否会错过子进程?当系统调用返回错误时(例如waitpid返回-1),如果需要确定发生了什么错误,请咨询errno(通常通过peror) 根据我的系统上的man 2 waitpid,可能的错误非常有限: ECHILD:pid指定的进程不存在或不是调用进程的子进程。(如果将SIGCHLD的
如果500个子进程同时完成并将其状态报告给父进程,是否会错过子进程?当系统调用返回错误时(例如
waitpid
返回-1
),如果需要确定发生了什么错误,请咨询errno
(通常通过peror
)
根据我的系统上的man 2 waitpid
,可能的错误非常有限:
:pid指定的进程不存在或不是调用进程的子进程。(如果将ECHILD
的操作设置为SIGCHLD
另请参见Linux注释中关于线程的部分,则可能会发生这种情况。)SIG\u IGN.
:EINTR
未设置,捕获到未阻塞信号或WNOHANG
;见信号(7)SIGCHLD
:选项参数无效EINVAL
EFAULT
。这似乎是基于您所说的代码的情况。[1]
应该是
waitpid(-1,&status,0)
如果您说错了,或者在解决此问题后仍然出现错误,则有两种可能:
- 这个过程没有子进程。它可能创造的任何孩子都已经收获了
- 您设置了一个信号处理程序,当您等待一个孩子结束时,一个信号传入。只需再次调用
waitpid
gcc
,我使用-Wall-Wextra-pedantic
不,不应该有这样的情况。当它返回
-1
时,什么是errno
?请注意,您可能会得到一个中断的系统调用。当系统调用返回-1
时,您应该使用peror()
打印原因。errorno是10,这是ECHILD。您确定返回ECHILD时还有更多的孩子活着吗,或者,这是否可能发生在最后一个孩子收割后?您确定这些孩子仍然有您作为他们父母的流程(例如,他们没有双重分叉)?可以插入测试来证明它吗?基于快速测试,如果waitpid
的第二个参数是错误指针,它将返回-1
,并将errno
设置为EFAULT
,而不是segfault。这是另一种可能性,所有传递给waitpid的参数都是正确的。没有设置信号处理程序。我有大约1500个正在运行的子进程。它们同时退出并向父级报告其状态。父对象正在无限循环中执行waitpid调用。那么,在收割时是否会遗漏一些进程?所有子进程都是由同一父进程创建的?如果某个进程“收获时丢失”,那将是一个严重的内核错误。@nik,不,这是不可能的。//你说你在无限循环中调用waitpid
。您认为在第1501次调用waitpid
时会发生什么?(顺便说一句,一次创建这么多的子对象有点傻。)Re“我不明白waitpid()
如何导致SIGSEGV
”,啊,是的,在我描述的情况下,它返回EFAULT
。当我把它写得太多的时候,感觉不对劲。修好了。
waitpid(-1,&status,0)