【问题标题】:Child processes waiting on each other子进程相互等待
【发布时间】:2012-10-02 10:11:43
【问题描述】:

我创建了三个进程,我想同步它们的工作。具体来说,我希望第一个进程等待第二个,第二个等待第三个。基本上按照创建它们的相反顺序执行它们。

这是我到目前为止所做的。

for (; i < 3 ; i++){
        pids[i] = fork();
        if (pids[i] == 0)
           break;
}
if (pids[i] != 0){
    wait(); // Main thread has to wait..    
}
else{               
     if (i == 0){
        waitpid(pids[1], &status, 0);       
        printProcessInfo(0);        
     }
     else if (i == 1){
        waitpid(pids[2], &status, 0);       
        printProcessInfo(1);        
          }
     else if (i == 2){
        printProcessInfo(2);        
     }              
}

我使用 i 来检查我在哪个子进程中,因为我假设我在子进程中得到了正确的 i,所以如果 i = 0,我实际上是第一个子进程。这个假设是真的吗?在任何情况下,我都没有得到我想要的顺序,实际上这些进程是按照它们的自然顺序执行的,绕过了我放置的 waitpid 调用。有任何想法吗?

【问题讨论】:

  • 一定要这样吗?如果每个孩子都创建一个孩子,这会容易得多。正如您目前拥有的那样,没有孩子会知道它的弟弟妹妹,只有年纪较大的弟弟妹妹。 IOW,当父母创建child1时,child1是它自己的进程。该进程的 pid 表不会更新以反映更多的子进程。只有父母的 pid 表有所有信息。您的 waitpid() 调用可能在 ECHILD 上失败(您没有检查),这就是为什么它们似乎没有被执行。
  • 我想通了。这是一个非常令人困惑的学校作业,因为教授特别要求我们不要让第一个叉子成为第二个等等,所以我很困惑。我想我会研究其他形式的 IPC,即使我们还没有进入那一章。谢谢。

标签: linux process fork waitpid


【解决方案1】:

不,您将获得超过 3 个进程。

考虑一个简化的版本(这只是删除等等...你做相同数量的分叉):

for (i=0; i < 3 ; i++){
    pids[i] = fork();
}

因为您在 for 循环中执行 fork,而不检查返回值。父母和孩子都会得到自己的孩子。

    [###############PARENT###############]
          |           |           |
         i=0         i=1         i=2
          |           |           |
        [ a0 ]      [ b0 ]      [ c0 ]
         / \          |
       i=1 i=2       i=2
       /     \        |
     [a1]   [a2]    [ b1 ]
      |
     i=2
      |
     [a3]

您必须在检查fork 的返回值后中断循环。

【讨论】:

  • 信不信由你,我的原始代码确实脱离了循环。无论如何,我添加了一个 break 语句以防它是子进程,现在,我的主要问题是,我编写的代码是否可以帮助反转子进程的执行顺序正确?
  • 是的,但我认为这里的问题是有时第二个孩子什么都不等,因为第二个孩子还没有创建(waitpid 返回-1)。事实证明,使用这种技术的进程不能等待它的兄弟姐妹。不过感谢您的回答,它帮助了很多。
猜你喜欢
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 2021-06-04
  • 2016-09-23
  • 1970-01-01
相关资源
最近更新 更多