2012-02-15 58 views
8

这是最近GATE入学考试的一个问题。
的方法执行的代码C程序中的fork()

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

创建进程的总数是

(A)3(B)4(C)7(d)8。

我的回答是(A)3.

我的看法是,在每个fork()之后,将创建一个子进程并且父进程的执行将正常继续。从教练的机构

不可靠的答案(没有任何解释)为(C)7.

我觉得他们处理每一个叉将创建一个子进程和新的父进程。而且他们也计算了所有的父母程序。 [我不允许发布图片,但我的朋友在图表中解释了一个树,每个左边的节点在两个节点中分叉。因此左边的4个父节点和右边的3个子节点。] 但问题清楚地提到了子进程。而且我不认为这个父进程是新创建的。

有人可以解释一些分叉基本原理,并请妥善解决上述问题。

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

+3

第一进程可创建子进程的去'fork()的'自己。你也应该数这些。 – 2012-02-15 19:13:24

+1

不,分叉是一个操作系统的概念 - 编程语言无关紧要。 – Rup 2012-02-15 19:17:09

+2

这说明了为什么多项选择题在辩解中表现出理解。如果你必须写一个答案来解释你是如何得到答案的,那么即使你从“官方答案”中得出了不同的结论,你也可以得到理解这些概念的功劳。例如,儿童进程的孩子是否被计算在内?它改变了要给出的答案。 – 2012-02-15 19:23:06

回答

26

fork()导致原始过程和一个孩子从代码的那一点开始。因此,您看到这样的画面:

enter image description here

+2

在图表上干得不错。 – 2012-02-15 23:14:01

+0

@JonathanLeffler赫赫谢谢,并且你的回答很好,毕竟它更详细! – 2012-02-16 06:58:43

+1

@eznme“从代码中的那一点开始”这是否意味着在第二个分支之后,子代和父代都将继续从第三个fork()语句的下一行执行? – 2012-02-16 19:22:35

15

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

  • 在第一个fork()之后,假设没有故障(始终),有两个过程。
  • 每个人都会再次执行fork()--所以现在有四个进程。
  • 每个人都会再次执行fork()--所以现在有8个进程。
+0

iit的正式答案关键字在几天前出来。正确的答案是7.不幸的是,他们没有提供完整的解决方案,只是答案。 – 2012-03-22 19:36:42

3

每次调用fork之后,都有两个进程,父进程和子进程。这些进程的这两个在fork后立即继续执行。一些产生的过程是(在所有的分叉之后)父母和孩子。那些只有的孩子是叶子的进程树。其中一个(原来的那个)即只有父母是这棵树。父母和子女都是分支机构

+0

所以在上图中,子节点是底部的8个叶子,根节点是父节点。答案应该是8. – 2012-02-16 19:50:12

+2

@AbhinavKulshreshtha:在上图中,最左边的垂直线是原始过程,并且* *不是*由示例中的任何'fork()'创建的子项。它*是一个其他进程的孩子,但我不会将它计算为由fork()创建的。叉子(); fork()' – 2012-02-16 21:34:27

+0

官方答案是7.他们没有提供完整的解决方案,但在这个页面上,你的解释和@eznme图是最简单的。谢谢 – 2012-03-22 19:41:04

4

试试这个:

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

我的链接器错误_getpid和_fork。 这是我用 '的#include 的#include 无效的主要() {printf的 代码( “初始PID:%d \ n” 个,(INT)GETPID()); fork(); fork(); fork(); getch(); }' – 2012-02-16 19:43:59

+0

我使用的是Windows 7下的dosbox模拟下的turbo C++ 3.1 – 2012-02-16 19:47:37

+2

DOS和Windows都没有'fork()'。您无法在这些操作系统中尝试该片段。我不知道如何在DOS中做同样的事情;你可以在Windows中尝试[CreateProcess()](http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v%3Dvs.85%29.aspx)(它不完全像'叉()')。 – pmg 2012-02-16 19:55:37