【问题标题】:Why doesn't waitid block until child terminates?为什么 waitid 不阻塞,直到孩子终止?
【发布时间】:2012-11-30 23:16:20
【问题描述】:
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
...

有什么建议吗?

【问题讨论】:

  • child_thread() 函数有什么作用?
  • @Joachim Isaksson,sleep(20) 然后退出。

标签: linux clone


【解决方案1】:

您正在使用 PID 选项。进一步查看手册页:

以下特定于 Linux 的选项适用于创建的子级 使用克隆(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.

【讨论】:

  • 您还在使用waitid,还是注意到这些选项不适用于waitid?您需要使用 waitpid。
  • 我用waitid替换了waitpid,但还是没有运气:(
  • 那么,你在做 waitpid(-1, NULL, __WALL)?
  • 是的,我做了waitpid(P_ALL, NULL, __WALL);,对你有用吗?
【解决方案2】:

我不知道您在此处尝试完成的具体操作,但通过以下方式使用 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 手册页。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 2014-11-18
    • 2021-05-19
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    相关资源
    最近更新 更多