fork函数流程图,有效和无效输出

时间:2014-04-04 03:47:29

标签: c process fork

printf("L1 \n");
  if (fork() != 0) {
    printf("L2 \n");
    if (fork() != 0) {
      printf("L3 \n");
      fork();
    }
  }
printf("End \n");

我很难理解这段代码。有人可以解释/显示流程图的样子吗?此外,有效和无效的序列。

我对流程图的想法是这样的:

L1将保留两个L2进程,然后每个L2进程将保存2个L3进程,每个L3进程将保留一个结束进程。这是对的吗?

我的有效序列是L1,L2,L3,End

无效的将是L2,L1,结束这是因为L1必须在L2之前,L2依赖于L1。

1 个答案:

答案 0 :(得分:1)

好的,这里的代码正确缩进并带有编号的行。

1.  printf("L1 \n");
2.  if(fork() != 0) {
3.    printf("L2 \n");
4.    if(fork() != 0) {
5.      printf("L3 \n");
6.      fork();
7.    }
8.  }
9.  printf("End \n");

让我们假设当你第一次运行它时父亲的PID是1000(它的数量无关紧要,无论如何它取决于操作系统,但是我们正在做出这个假设以明确这个过程树)。

线路1:

流程PID==1000打印L1。到目前为止,我们有:

流程树:

           1000

<强>输出:

L1

线路2:

处理PID==1000分叉,创建子进程(假设它是PID==1001)。根据{{​​1}},只有进程man 2 fork正在输入if块,因为PID==1000将为子进程返回fork()

流程0在第3行继续,其中它将打印PID==1000然后继续到第5行,而进程L2PID==1001块后跳转到第9行,所以它会打印if。到目前为止,我们有:

流程树:

End

<强>输出:

  -------------- 1000
  |
  |
 1001

第4行:

再次处理L1 L2 End 分叉,创建子进程PID==1000

再次,流程PID==1002跳转到第9行,打印PID==1002,因为End为其返回fork(),而父进程0在第5行继续,打印PID==1000,之后它将转到第6行。到目前为止,我们已经:

流程树:

L3

<强>输出:

   ------------ 1000
   |              |
   |              |
  1001          1002

第6行:

父进程L1 L2 End L3 End 再次分叉。创建子进程PID==1000。之后,父进程和子进程都进入第9行,因此它们都打印PID==1003。最后,我们有:

流程树:

End

<强>输出:

   ------------- 1000 --------------
   |               |               |
   |               |               |
  1001           1002            1003

要自己查看,您可以使用L1 L2 End L3 End End End 更改当前代码中的printf(),以确切了解每个流程将打印的内容。代码将是这样的:

getpid(2)