(waitpid((pid_t)-1,NULL,WNOHANG)如何跟踪要返回的子进程?

时间:2017-10-30 21:58:39

标签: c unix fork pid waitpid

我正在编写一个程序,可以创建多个子进程,即使子进程尚未终止,父进程也会继续执行。但是,一旦它们被终止,我希望在提示用户创建更多子进程之前打印它们。

根据我对(waitpid((pid_t)-1,NULL,WNOHANG)的理解,它应该等待并检查所有已终止的子进程

  • 如果没有终止进程,则返回0
  • 返回已终止流程的pid
  • 返回-1表示错误

是否为每个已终止的子进程返回多个返回值?

pid_t temp;
while(waitpid((pid_t)-1, NULL, WNOHANG)){
     temp = (waitpid((pid_t)-1, NULL, WNOHANG) 
     if(temp == -1)
          //error code
     else if(temp == 0)
          break;
     else{
         //fprintf pid of terminated child process

         //this statement never gets executed when I run the code 
     }
}

(不寻找代码;只是想知道我是否正确理解这个概念: - /通过man读取waitpid)

谢谢!

1 个答案:

答案 0 :(得分:0)

更好的做法是使用SIGCHLD信号,当其中一个孩子死亡时,该信号被发送到父进程。因此,在父母中捕捉它可以让你做出你需要的每一个决定,例如通过等待你基本上做的方式构建一个当前死亡的孩子的列表(在非阻塞模式下循环waitpid)。请注意每次waitpid的调用都会抓住一个死的过程(不要按照你的方式调用它,对此主题有评论)。然后在打印提示之前,您可以打印此列表的内容,同时清理该列表。在此期间要小心暂时阻止SIGCHLD传递,以防止自动并发列表管理。