该程序创建了多少个进程,包括初始父进程?

时间:2013-06-22 14:35:42

标签: c fork

我正在试图弄清楚这个程序创建了多少个进程,包括初始父进程。 正确的答案应该是9,但我不明白为什么答案是9.如何创建这9个流程?提前谢谢!

#include <stdio.h>
#include <unistd.h>
…
int main()
{
  pid_t john;
  john = fork( );

  if (john == 0) {
      fork( ); fork( ); fork( );
  }
/* Consume resources of another process */
/* This does NOT create a new process. */
Consume( ); Consume( );

   return 0;
}

4 个答案:

答案 0 :(得分:8)

请记住,在fork();fork();fork();上,父母和孩子都会遇到下一个分叉。

main
 |
 |\          john = fork()
 | \ 
 |  \ 
 |  |\              fork()
 |  | \-----\  
 |  |\      |\      fork()
 |  | \     | \
 |  |  \    |  \
 |  |   \   |   \
 |  |\  |\  |\  |\  fork()
 |  | | | | | | | |
 1  2 3 4 5 6 7 8 9

答案 1 :(得分:6)

  john = fork( ); //fork a new process, we have 2 now.

  if (john == 0) {// child process go in the if statement
      fork( );   //child process fork to 2 processes
      fork( );   //2 processes continue to fork,so we have 2 more. 
      fork( );   //4 processes continue to fork, so we have 4 more.
  }
  //up to here, the child process of the first fork is now 8 processes
  //adding the first parent process, that is 9 in total.

答案 2 :(得分:0)

P1分叉,创造P2。 P1有john = <NOT ZERO>,P2有john = 0。因此P2执行if。它分叉,创造P3。现在,P2和P3处于第二个分支。所以他们分叉,创造了P4和P5。现在P2,P3,P4和P5都剩下一个叉子。他们分叉,创造P6,P7,P8和P9。产生了九个进程。

fork创建调用进程的程序映像的精确副本,除了它向子节点返回0并向父节点返回PID的事实。孩子将和父母在叉子后面的地方一样。

答案 3 :(得分:0)

朋友,我也在学习过程。我得到了一些关于函数fork()的东西。   你知道,fork将创建一个新的子进程,它将从父进程获得数据,内容,堆栈,堆等的副本,子进程也将从父进程获得PCB的副本。   程序运行由程序计数器控制,程序计数器包含程序的指令。 PCB包含程序计数器的信息。由于子进程和父进程之间的PCB相同,子进程将运行程序计数器的左指令,因此在父进程中,fork之前的代码将不会在子进程中运行。   在if语句中,当第一个fork运行时,子进程将只运行第二个和第三个fork。你可以用这个来绘制一个流程图来帮助你解决这个问题。就像这样。很抱歉,我没有足够的声誉来为你发布图像。   希望我的话能帮到你。