了解fork()的声明,其进程树(Understanding the fork() statemen

2019-09-29 14:24发布

我试图找出有多少进程与下面的C代码创建的:

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

有一对夫妇的事情,我感到困惑:

每次fork()的调用,并在孩子从代码开始启动,或者它启动在当前叉()从创建它? 举例来说,如果第3行的第一个叉叫,我会在第4行,或1号线启动了孩子? 我相信这是一个愚蠢的问题,B / C它会创建一个无限循环,如果每个孩子从一开始就开始了,但我想这个假设是安全的。

接下来,当叉被调用时,确实目前的过程分成两个新的过程,一个是父母和其他孩子,或者是自动父当前的进程,所以真的,仅创建了一个额外的过程。

最后,if语句,我当它实际上是父母,总是0时,它是孩子非常肯定叉返回父id的值。 所以,我是正确的假设,如果语句是假的每一个孩子产生了?

用我的上述假设,这就是我想出的进程树,如果有人认为这是把它扔关闭故障将不胜感激。 在树中的儿童数量代表的代码叉正在发生的线路:

        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个总流程。 难道我错了?

Answer 1:

(1)后直接线路fork

(2)一种新的进程。 孩子是家长的副本。

(3) fork返回儿童在儿童的父和0的PID。 if语句将是每一个孩子假。 它应该出来到12点的过程。 我在可怕绘制图表,但你应该能够找到答案。



Answer 2:

只是要清楚这里,这不是孩子“开始”在任何特定行。 (行不会在运行时实际存在反正。)

孩子成为父母的在叉点精确副本(除其核心过程记录)。 所以叉()被调用一次,但返回两次,一次在父,一旦在孩子。 这就是为什么它被称为叉。 所不同的启动在返回的那一刻,因为叉的返回值是在两个分支不同。 但它只是在这两种情况下的普通函数的返回。



Answer 3:

问:每次fork()的调用,并在孩子从代码开始启动,或者它启动在当前叉()从创建它?

答:从会后声明中“叉()”。

问:当叉被调用时,确实当前进程分裂(导致)NEW过程?

答:是的。

问:叉返回父id的值时,它实际上是父母,总是0时,它是孩子

答:是的。 除非有创造的过程,在这种情况下,它返回-1错误。

在这里寻找更多的信息:

  • http://linux.die.net/man/2/fork

  • http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html



文章来源: Understanding the fork() statement and its process tree
标签: c linux fork