在if语句/管理进程中使用fork

时间:2014-04-02 02:32:03

标签: c fork

我有这段代码:

   printf("L1 ");

   if(fork() != 0) {
      printf("L2 ");

      if(fork() != 0) {

         printf("L3 ");
         fork();
      }
   }
printf("End \n");

作为练习,我试图弄清楚运行此代码会导致有效/无效输出的一些示例(不实际运行它)。

我仍然对fork()方法在if语句中的工作方式有点困惑。我知道一旦它被调用它会返回两次,表明它已经创建了两个进程。所以,如果我做了类似的事情,

printf("L1 ");
fork();
printf("L2 ");

我会得到L1 L2 L2

但是我仍然不知道如何在第一段代码中的语句中工作。

以下是我认为的一些有效/无效输出:

Valid: L1 L1 L2
       L1 L2 L3
       L1 L2 L1

Invalid: (Anything hat doesn't start with L1)
      L1 L2 L2
      L1 L3 L2
这些有意义吗?有没有一种简单的方法来解释if语句中发生的事情,以便我可以大致了解fork()如何在其中工作?这些输出值是正确/不正确吗?

2 个答案:

答案 0 :(得分:1)

在您的代码中,每个分支的子代直接进入printf("End")。只有父母会打印L1L2L3,因此他们只会按顺序打印一次。与该输出混合的是子项的End(以及父项的最终结尾)。

答案 1 :(得分:1)

如果fork()调用全部失败,则只会有一个进程,因此会打印:

L1 L2 L3 End

如果每个fork()来电都成功,那么:

  1. 假设行缓冲或完全缓冲输出,
  2. 将有4批打印输出,但它们的顺序是不确定的,并且可能(但可能不会)在输出上交错。
  3. 每个输出都以L1开头,以End结尾。
  4. fork()返回非零值时,它是父进程。
  5. 第一个孩子中的第一个if失败,因此会打印L1 End
  6. 父亲中的第一个if次传递,随后的输出将包含L2
  7. 第二个孩子中的第二个if失败,因此会打印L1 L2 End
  8. 第二个if在父级中传递,随后的输出将包含L3
  9. 第三个fork()创建两个进程(或创建一个进程并在父进程中继续),两个进程都打印L1 L2 L3 End
  10. 因此,输出将包括:

    L1 End
    L1 L2 End
    L1 L2 L3 End
    L1 L2 L3 End
    

    但不保证顺序。


    在发布上述分析后,我通过运行它进行了检查,并生成了第一个样本:

    L1 End 
    L1 L2 L3 End 
    L1 L2 End 
    L1 L2 L3 End 
    

    请注意,如果输出是非缓冲的,则输出不同。 L1会出现一次; L2会出现一次; L3会出现一次; End将出现四次。

    一个可能的顺序是:

    L1 L2 End 
    L3 End 
    End 
    End 
    

    另一个观察到的序列(两次运行中的第二次)是:

    L1 L2 L3 End 
    End End 
    
    End