为什么在孩子终止之前不会等待阻止?

时间:2012-12-13 05:28:19

标签: linux clone

void *stack;
stack = malloc(STACK_SIZE);
if (-1 == clone(child_thread, stack + STACK_SIZE, 0, NULL)) {                                                                                                                                                                           
    perror("clone failed:");
}   
while(waitid(P_ALL, 0, NULL, WEXITED) != 0){ 
    perror("waitid failed:");
    sleep(1);
}   

手册说:

  

如果孩子已经改变状态,那么这些呼叫将返回   立即。否则它们会阻塞,直到孩子改变状态

但实际上它会立即返回:

waitid failed:: No child processes
waitid failed:: No child processes
...

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您正在使用PID选项。在手册页中进一步了解:

以下特定于Linux的选项适用于已创建的子项        使用clone(2);它们不能与waitid()一起使用:

   __WCLONE
          Wait  for "clone" children only.  If omitted then wait for "non-
          clone" children only.  (A "clone" child is one which delivers no
          signal, or a signal other than SIGCHLD to its parent upon termi-
          nation.)  This option is ignored if __WALL is also specified.

   __WALL (Since Linux 2.4) Wait for  all  children,  regardless  of  type
          ("clone" or "non-clone").

   __WNOTHREAD
          (Since  Linux  2.4) Do not wait for children of other threads in
          the same thread group. This was the default before Linux 2.4.

答案 1 :(得分:1)

我不知道你要在这里完成的具体细节,但是通过以下方式使用waitid可能会有所帮助:

#include <sys/types.h>
#include <sys/wait.h>

...

siginfo_t signalInfo;
waitid(P_ALL, 0, &signalInfo, WEXITED | WSTOPPED | WNOWAIT | WNOHANG);

然后在signalInfo中检查以下内容,以了解孩子退出时发生了什么:

signalInfo.si_signo : For Signal Number
signalInfo.si_code : Usually SIGCHLD
signalInfo.si_errno) : Any error code set
signalInfo.si_status : For exit code of the child code

注意:使用WNOWAIT会使操作系统保留子进程资源的使用,即使它被终止也是如此。您可能/可能不会使用此选项。如果这样做,则必须在没有WNOWAIT选项的情况下再次显式调用waitid。

参考:有关详细信息,请参阅waitid的手册页。