简单运用unix fork理解

Pie*_*ard 1 unix fork

考虑以下说明:

for(int i = 0; i < 3; i++)
    fork();
Run Code Online (Sandbox Code Playgroud)

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

所以上面的代码等同于:

fork();
fork();
fork();
Run Code Online (Sandbox Code Playgroud)

此图表说明了此问题的官方答案:

图形

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

这就是我绘制图形的方法.

  1. 所以,第一个fork将创建父进程(p1)的子副本(p2).我们有2个过程.

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

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

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

pax*_*blo 6

如果你想要一个类似官方答案的图表,试着停止思考事情是如何同时运行的,而是专注于几代人的过程(父母,孩子,孙子女等).

一开始,有一个过程p0,有三个分叉.当做这三个叉子时,它会创建p1两个叉子,p2一个叉子去p3,没有叉子.然后p0退出(仅p1,p2p3保持).

我们可以扔掉,p3因为它没有留下任何叉子,只留下p1p2).

p1然后进程执行其第二个fork生成p4,剩下一个fork,然后执行第三个fork p5而没有左叉.p1现在完成并退出(p2,p4p5保留).

类似于p3,p5可以扔掉,因为它没有任何叉子.这使得p2p4.

同样,p2有一个叉子,所以它创建p6时没有任何叉子.然后,两个p2p6出口,由于没有留下叉子,留下p4.

进程p4有一个分叉,所以它创建p7没有分叉,然后它们都退出.

通过绘制与基于血统深度图表,而不是当处理开始时(虽然开始时间的(a) ,其中该过程在特定深度的水平存在控件,例如,参见p1,p2p3),你的图应该匹配给定的一个.

所以想一想:

  Sequence within generation -------->
G
e           ______p00______
n          /       |       \
e       p01       p02       p03
r      /   \       |
a   p04     p05   p06
t    |
i   p07
o
n
|
V
Run Code Online (Sandbox Code Playgroud)

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