在linux平台上收获C时丢失子进程

在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,状态,0)。 有时我确实看到了-1


如果500个子进程同时完成并将其状态报告给父进程,是否会错过子进程?

当系统调用返回错误时(例如
waitpid
返回
-1
),如果需要确定发生了什么错误,请咨询
errno
(通常通过
peror

根据我的系统上的
man 2 waitpid
,可能的错误非常有限:

  • ECHILD
    :pid指定的进程不存在或不是调用进程的子进程。(如果将
    SIGCHLD
    的操作设置为
    SIG\u IGN.
    另请参见Linux注释中关于线程的部分,则可能会发生这种情况。)

  • EINTR
    WNOHANG
    未设置,捕获到未阻塞信号或
    SIGCHLD
    ;见信号(7)

  • 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)