【问题标题】:How does (waitpid((pid_t)-1, NULL, WNOHANG) keep track of child processes to be returned?(waitpid((pid_t)-1, NULL, WNOHANG) 如何跟踪要返回的子进程?
【发布时间】:2018-04-11 23:58:53
【问题描述】:

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

根据我对(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 for waitpid)

谢谢!

【问题讨论】:

  • 为什么每次迭代都调用waitpid 两次? “返回多个返回值”是什么意思?
  • 调用waitpid(-1, ...) 不会等待所有子进程。它等待任何一个子进程。
  • 感谢您的回复! ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/… 哦,我明白了,基于此,我认为它等待查看自上次创建进程以来已经结束了多少子进程。例如,如果创建了三个子进程并终止了两个子进程,我怎么知道要跟踪终止的两个子进程?如果它等待任何一个子进程,我怎么知道要跟踪其他终止的进程?
  • 你跟踪哪个进程被waitpid()的返回值终止,这是退出/终止/停止的进程的PID。
  • 您真的在使用 z/OS 吗?

标签: c unix fork pid waitpid


【解决方案1】:

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

【讨论】:

  • 感谢您的建议!是的,我意识到没有必要在我的 while 循环和循环内调用 waitpid() 。我接受了评论中的建议while ((temp = waitpid((pid_t)-1, NULL, WNOHANG)) > 0) { } :) 我会更多地研究SIGCHLD 谢谢!
猜你喜欢
  • 2014-05-09
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多