C程序中的fork()

时间:2012-02-15 19:10:28

标签: c pthreads fork

这是最近GATE入学考试的一个问题 进程执行代码

fork();  
fork();  
fork();  

创建的进程总数为

  

(A)3.(B)4.(C)7.(D)8。

我的答案是(A)3。

我的观点是,在每个fork()之后,将创建1个子进程,并且父进程将继续正常执行。

教练机构的不可靠答案(没有任何解释)(C)7。

我认为他们认为每个fork都会创建一个子进程和一个新的父进程。而且他们也在计算所有父进程。 [我不允许发布图片,但我的朋友在图表中解释了一个树,每个左侧节点在两个节点中向下分叉。因此左边有4个父节点,右边有3个子节点。] 但该问题明确提到了儿童过程。而且我也不认为父进程是在分叉中新创建的。

有人可以解释一些分叉的基本原理,以及上述问题的正确解决方案。

P.S。如果编程语言在分叉概念上有所不同,那么按照教学大纲,这应该是C或C ++程序。

6 个答案:

答案 0 :(得分:25)

fork()会导致原始流程和一个孩子从代码中的那一点开始。因此你有这张照片:

enter image description here

答案 1 :(得分:15)

我认为总共有8个过程,或原始的7个后代,或者原始的3个直接子女(其他人是大孩子和曾孙子)。

  • 在第一个fork()之后,假设没有失败(整个过程),有两个过程。
  • 每个都再次执行fork() - 所以现在有四个进程。
  • 每个都再次执行fork() - 所以现在有八个进程。

答案 2 :(得分:4)

试试这个:

printf("initial pid: %d\n", (int)getpid());
fork();
fork();
fork();
printf("final pid: %d\n", (int)getpid());

答案 3 :(得分:3)

每次调用fork之后,都有两个进程,父进程和子进程。这些进程的两个在fork之后立即继续执行。一些最终的过程是(在所有的分叉之后)父母和孩子。 子项的那些是进程树的 leaves 父级的那个(原始的)是树的。父母和孩子都是分支

答案 4 :(得分:2)

在第三个fork调用结束时,将总共有8个进程。在这8个进程中,将有7个子进程和1个父进程。

在解决这类问题时,有两点需要注意:

  1. fork()调用返回两次,一次在父进程中,一次在子进程中。如果fork成功,它将在子进程中返回值为0,在父进程中返回非零值(子pid)。

  2. 在fork调用之后,子进程和父进程都立即开始执行。

我已经借助图表和视频解释了上述问题。我希望您觉得它有用。

fork example gate

fork example

答案 5 :(得分:0)

可以将通用公式用于此类问题,

进程总数将为2 ^ n。

用于获取创建的子进程总数的公式为(2 ^ n)-1,其中n是调用fork函数的次数。

在这里fork()被调用3次,因此子进程数将为(2 ^ 3)-1 = 7。 一共有7个子进程和1个父进程。