理解fork()语句及其进程树

时间:2013-09-17 03:02:00

标签: c linux fork

我试图弄清楚使用以下C代码创建了多少个进程:

int main ()
{
   fork();
   if (fork()) {
      fork();
   }
   fork();
   return 0;
}

有一些我很困惑的事情:

每次调用fork()时,子进程是从代码的开头开始,还是从当前fork()创建的开始?例如,如果调用第3行的第一个fork,我会在第4行或第1行启动子节点吗?我相信这是一个愚蠢的问题,如果每个孩子从一开始就会创建一个无限循环,但是我想对这个假设保持安全。

接下来,当调用fork时,当前进程是否分成两个NEW进程,一个是父进程,另一个是子进程,或者当前进程是父进程,所以实际上只创建了一个额外的进程。

最后,使用if语句,我非常肯定fork在父ID实际上是父级时返回父级的值,并且当它是子级时总是返回0。那么,我是否正确地假设每个生成的孩子的if语句都是假的?

根据我上面的所有假设,这是我提出的过程树,如果有人看到一个错误的故障,我将非常感激。树中的子项数表示fork当前发生的代码行:

        main
  |    |    |    |
  3    4    5    7    // the main/initial process calls fork 4 times
| | |  |    |    
4 5 7  7    7         // the first fork will see 3 additional forks since it was called
| |                   // at line 3 and I assume resumes at line 4.
7 7                   // The second and third original children would each only callthe
                      // very last fork().  The last fork has no other forks following.

因此,创建了10个总进程(包括main)。我做错了吗?

3 个答案:

答案 0 :(得分:1)

(1)直接在fork之后的行。

(2)一个新的过程。孩子是父母的副本。

(3)fork返回父项中子项的 pid,子项中返回0。 if语句对每个孩子都是假的。它应该出现在12个过程中。我绘制图表很糟糕,但你应该能够弄明白。

答案 1 :(得分:1)

在这里要清楚,并不是孩子在任何特定的线路上“开始”。 (无论如何,行在运行时实际上并不存在。)

子项在fork的位置成为父项的精确副本(其内核进程记录除外)。所以fork()被调用一次但返回两次,一次在父级中,一次在子级中。这就是为什么它叫做fork。差异从返回时开始,因为fork的返回值在两个分支中是不同的。但在这两种情况下,它只是一个普通的函数返回。

答案 2 :(得分:0)

问:每次调用fork()时,子进程是从代码的开头开始,还是从当前fork()创建它的地方开始?

答:来自“fork()”之后的陈述。

问:调用fork时,当前进程是否会拆分(导致)新进程?

答:是的。

问:当父实际上是父项时,fork会返回父项的值吗?当它是子项时,它会返回0

答:是的。除非创建进程时出错,否则返回-1。

点击此处了解更多信息: