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

标签 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() 在其中的工作原理?这些输出值是否正确/不正确?

最佳答案

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

L1 L2 L3 End

如果每个 fork() 调用都成功,则:

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

因此,输出将包括:

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 

关于c - 在 if 语句/管理进程中使用 fork,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22800437/

相关文章:

c - 读取标准输入(并存储值)管道到子级,进行剪切并返回值

python - 在其他人的包上测试拉请求

linux - 在 fork() 之前阻塞 SIGCHLD 的目的是什么?

ios - THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY

c - 左移并在 C 中用 float 转换

C 中的条件语句和数组(初学者)

c - 读取文件后删除所有内容

c - 需要动态 pthread 生成同步(???)

c - 内部 realloc() 的未定义行为

c++ - 僵尸进程无法通过 waitpid 调用进行清理