Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在if语句中使用fork/管理进程_C_Fork - Fatal编程技术网

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

C 在if语句中使用fork/管理进程,c,fork,C,Fork,我有一段代码: printf("L1 "); if(fork() != 0) { printf("L2 "); if(fork() != 0) { printf("L3 "); fork(); } } printf("End \n"); 作为练习,我试图找出运行此代码(而不是实际运行它)将导致的有效/无效输出的一些示例 我仍然对fork()方法在if语句中的工作方式有点困惑。我知道一旦它被调用,它会

我有一段代码:

   printf("L1 ");

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

      if(fork() != 0) {

         printf("L3 ");
         fork();
      }
   }
printf("End \n");
作为练习,我试图找出运行此代码(而不是实际运行它)将导致的有效/无效输出的一些示例

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

printf("L1 ");
fork();
printf("L2 ");
我会得到
L1

但我仍然不确定它在语句中的工作方式,比如在第一段代码中

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

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()在它们中是如何工作的?这些输出值正确/不正确吗?

在您的代码中,每个fork的子级直接进入
printf(“End”)
。只有父级将打印
L1
L2
L3
,因此它们将按顺序每个只打印一次。与该输出混合在一起的是子进程的
End
s(以及父进程的最后一端)。

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

L1 L2 L3 End
如果每次
fork()
调用都成功,则:

  • 假设线路缓冲或完全缓冲输出
  • 将有4批打印输出,但它们的顺序不确定,并且可以(但可能不会)在输出上交错
  • 每个输出将以
    L1
    开始,以
    end
    结束
  • fork()
    返回非零值时,它是父进程
  • 第一个
    如果
    在第一个子项中失败,那么它将打印
    L1 End
  • 第一个
    if
    传入父级,随后的输出将包括
    L2
  • 第二个
    如果
    在第二个子项中失败,那么它将打印
    L1 L2 End
  • 第二个
    if
    传入父级,随后的输出将包括
    L3
  • 第三个
    fork()
  • 因此,输出将包括:

    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 
    
    另一个观察序列(两次运行中的第二次)是:


    这里的标签信息有一个非常简单的解释:是的,谢谢。我已经记下了这个概念。我想要的更多的是解释它在if语句中是如何工作的,以及我的输出是否符合codeAh的逻辑,所以你是说一个有效的输出应该是(l1,l2,l3,end)或(l1,end,l2,end,l3,end)?为什么子进程直接进入end语句?在子进程中,
    fork()
    返回零,而父进程得到子进程的进程ID。第三个fork创建了两个进程,都是print
    L1 L2 L3 end
    @JonathanLeffler,但第三个fork之后剩下的就是
    printf(“end\n”)
    !我不会说,
    fork
    创建了两个进程;它创建了一个新的进程,而旧进程只是在新进程的基础上继续运行。@ooga:OK;我的措辞马虎。在第三个fork之后,有两个进程,父进程和子进程,这两个进程都继续添加
    End
    。并且它们都在打印缓冲区中已经有
    L1 L2 L3
    L1 L2 L3 End 
    End End 
    
    End