这是最近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 ++程序。
答案 0 :(得分:25)
fork()
会导致原始流程和一个孩子从代码中的那一点开始。因此你有这张照片:
答案 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个父进程。
在解决这类问题时,有两点需要注意:
fork()调用返回两次,一次在父进程中,一次在子进程中。如果fork成功,它将在子进程中返回值为0,在父进程中返回非零值(子pid)。
在fork调用之后,子进程和父进程都立即开始执行。
我已经借助图表和视频解释了上述问题。我希望您觉得它有用。
答案 5 :(得分:0)
可以将通用公式用于此类问题,
进程总数将为2 ^ n。
用于获取创建的子进程总数的公式为(2 ^ n)-1,其中n是调用fork函数的次数。
在这里fork()被调用3次,因此子进程数将为(2 ^ 3)-1 = 7。 一共有7个子进程和1个父进程。