简单运用unix fork理解

时间:2012-06-13 03:50:24

标签: unix fork

考虑以下说明:

for(int i = 0; i < 3; i++)
    fork();

我试着弄清楚创建过程的数量和图表创建的步骤。

所以上面的代码等同于:

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

此图表说明了此问题的正式答案:

graph

我无法想象如何创建此图表。

这就是我绘制图表的方式。

  1. 因此,第一个fork将创建父进程(p1)的子副本(p2)。我们有2个流程。

  2. 第二个分支,将通过创建子进程(p3和p4)复制p1和p2父代。

  3. 第三个分支,将通过创建子进程(p5,p6,p7,p8)复制p1,p2,p3和p4

  4. 如何获得与我老师相同的图表?

2 个答案:

答案 0 :(得分:6)

如果你想要一个类似官方答案的图表,试着不要再考虑事情是如何同时运行的,而是集中在几代人的过程(父母,孩子,孙子女等)上。

一开始,有一个进程p0,有三个分叉。在执行这三个分支时,它会创建p1,其中有两个分叉,p2有一个分叉,p3没有分叉。然后p0退出(仅p1p2p3仍然存在。)

我们可以抛弃p3,因为它没有任何货叉,仅留下p1p2

进程p1然后执行第二个fork生成p4,剩下一个fork,然后执行第三个fork p5而没有左叉。 p1现已完成并退出(p2p4p5仍然存在。)

p3类似,p5可以被抛出,因为它没有任何叉子。这会留下p2p4

同样地,p2剩下一个叉子,因此它创建p6而没有任何叉子。然后p2p6退出,因为没有任何货叉,只留下p4

流程p4剩下一个分叉,因此它创建没有分叉的p7,然后它们都退出。

通过基于父母而不是开始进程绘制深度图表(尽​​管开始时间(a)控制进程在特定深度水平存在的位置,例如,请参阅{{ 1}},p1p2),您的图表应与给定的图表匹配。

所以想一想:

p3

(a)请记住,此处定义的开始时间是流程何时出现 - 流程执行实际有用工作的顺序也取决于调度的变幻莫测。

答案 1 :(得分:1)

如果我们从P0开始它将生成进程,P1,P2和P3,但每个进程将有不同的i,因为在fork的那一刻我们已经复制了堆栈上的所有值。

生成P1 i = 0
生成P2 i = 1
生成P3 i = 2
i = 3不再&lt; 3

P1
生成P4 i = 1,生成P4时i设置为1,因为它是fork i增加,之前是0。 生成P5 i = 2,
我不再&lt; 3

P2
生成P6 i = 2,生成P6时i为2,因为调用fork时为1 我不再&lt; 3

P3
我不再&lt; 3

P4
生成P7 i = 2
我不再&lt; 3

嗯,你明白了......