【问题标题】:waitpid - difference between first parameter pid=-1 and pid=0waitpid - 第一个参数 pid=-1 和 pid=0 之间的区别
【发布时间】:2016-03-14 02:05:06
【问题描述】:

我正在阅读 http://www.tutorialspoint.com/unix_system_calls/waitpid.htm 关于 waitpid 函数的内容。它说的是第一个参数pid,

 -1  meaning wait for any child process.  
 0  meaning wait for any child process whose process group ID is equal to that of the calling process.  

我可以知道“任何子进程”是什么意思吗,谁的任何子进程?什么样的情况需要使用 -1 的值?

【问题讨论】:

  • 另请注意:您可以通过检查与SIGCHLD 信号相对应的siginfo_t 对象的si_pid 成员来获取有关子调用waitpid 之前的信息.但是,如果 SIGCHLD 被阻止并且多个孩子发出状态更新,我不确定这是如何工作的。

标签: linux unix waitpid


【解决方案1】:

忽略您的进程具有 pid 1 的情况(在某些进程命名空间中 - 在这种情况下,孤立的进程将被重新设置),0-1 之间只有一个区别。

使用-1,将等待任何孩子。使用0,调用setpgid的孩子将不会被等待。

"child" 被定义为fork 从您的进程创建的进程(但不是来自任何子进程 - 您不能等待孙辈,尽管在 Linux 上我认为您可以通过以下方式执行类似操作轮询/proc/<pid>)。请注意,execve 不会影响任何事情。

【讨论】:

    【解决方案2】:

    “任何子进程”是指作为调用waitpid的进程的子进程的任何进程。

    如果您想等待您的任何孩子,您可以使用 -1 的 pid 参数。最常见的用途可能是当您有多个孩子并且您知道至少有一个已经退出,因为您收到了SIGCHLD。您想为每个退出的孩子调用waitpid,但您不知道哪些孩子已经退出。所以你这样循环:

    while (1) {
        int status;
        pid_t childPid = waitpid(-1, &status, WNOHANG);
        if (childPid <= 0) {
            break;
        }
    
        // Do whatever you want knowing that the child with pid childPid
        // exited. Use status to figure out why it exited.
    }
    

    【讨论】:

      猜你喜欢
      • 2014-02-24
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 2014-08-30
      相关资源
      最近更新 更多