我有一个关于fork()和exit()的问题,以准备考试。 在以下代码中,生成了多少个进程以及它们的层次结构(父/子)是什么?
int i;
pid_t f;
for(i=0; i<3; i++){
f = fork();
if(f==0) exit(0);
f = fork();
if(f > 0) exit(0);
}
我认为创建的总进程数等于6,但最后的总进程数等于1而剩下的进程是一个孩子,我是对还是不对?
答案 0 :(得分:1)
int i;
pid_t f;
for(i=0; i<3; i++){
f = fork();
if(f==0) exit(0);
f = fork();
if(f > 0) exit(0);
}
让我们画一幅画
P: first parent
i = 0;
+---+
| P |
+---+
| fork() +----+ exits
|---------> | C1 | ----> because of (if==0) exit(0)
| +----+
|
| fork() +----+
|---------> | C2 |
| +----+
| | next loop
| | i = 1, C2 is the only surviving
| | process, it becomes the new parent P
| v
v repeat same graph where P == C2
exits
because of
if(f > 0) exit(0)
每次迭代都会创建2个孩子,父P
和第一个孩子C_1
退出,
第二个孩子C_2
幸存下来。下一次迭代也是如此,新的parant就是
第一次迭代C_2
的第二个子节点,它还将创建两个新子节点:
C_2_1
和C_2_2
。 C_2
和C_2_1
退出,C_2_2
幸存。下一个
迭代也是如此,C_2_2
创建了两个孩子:C_2_2_1
和C_2_2_2
。
C_2_2
和C_2_2_1
退出,C_2_2_2
幸存。循环结束:
C_1
,C_2
,C_2_1
,C_2_2
,C_2_2_1
,C_2_2_2
C_2
,C_2_2
创建了新的孩子P
)和两个父母(C_2
,C_2_2
)。没有评论的图表
+---+
| P | i == 0
+---+
| +-----+
|----> | C_1 | --> exit
| +-----+
|
| +-----+
|----> | C_2 | i == 1, new Parent
| +-----+
v | +-------+
exit |----> | C_2_1 | --> exit
| +-------+
|
| +-------+
|----> | C_2_2 | i == 2, new Parent
| +-------+
| | +---------+
| |------> | C_2_2_1 | --> exit
v | +---------+
exit |
| +---------+
|------> | C_2_2_2 | i == 3, ends loop
| +---------+
|
v
exit