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
...
有什么建议吗?
答案 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的手册页。