0
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
...

有什么建议吗?

4

2 回答 2

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 的手册页。

于 2013-03-06T16:52:21.103 回答
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.
于 2012-12-13T05:35:57.143 回答