[英]How many processes are created by this program, and by which processes are they created by?
我正在跟踪该程序,并确定创建了多少个进程(假设没有发生错误)。 我画了一张图以可视化过程。 在我的图中,第一个fork()
创建的第一个进程包含1
,并且我有箭头指向每个子进程,每个子进程都来自各自的父进程。 这看起来正确吗?
码:
1: child2 = 0;
2: child1 = fork(); // fork 1
3: if (child1 == 0)
4: {
5: child2 = fork(); // fork 2
6: }
7: fork(); // fork 3
8: if (child2 > 0)
9: {
10: fork(); // fork 4
11: }
图形:
0
/|\
/ | \
1 3 4
/ \ \
/ \ \
2 3 4
/ /
/ /
3 4
/
/
4
合理
fork()
命令创建了子级1
。 fork()
命令仅因1
创建子2
,因为if(child1 == 0)
,即,只有fork()
向child1
返回0的进程是1
。 fork()
第7行命令创建子3
为0
, 1
,和2
,因为该语句是由每个进程执行。 fork()
第10行命令创建子4
对每一个工艺除2
,因为每个进程具有的副本child2
将其返回从正值fork()
除了2
,这将在具有0 child2
。 你怎么看? 我是否解释了此代码并正确绘制了图形?
UPDATE
正确的图形是:
0
/ \
/ \
1 3
/|\
/ | \
2 4 3
/ \
/ \
3 4
应用于示例的pstree
命令显示:
bash-+-a.out-+-a.out-+-a.out---a.out
| |-a.out---a.out
| `-a.out
`-a.out
如下所示,每行只有一个进程。
bash-+-a.out-+---------------------
+-a.out-+-------------
| +-a.out-------
| | `-a.out
| |-a.out-------
| | `-a.out
| `-a.out-------
`-a.out---------------
分支重新排序后,它与@Macattack的答案匹配。
请注意,在上图中您没有有关流程创建的相对时间的信息;这只是最终结果。
为了理解该图,让我们看一下父进程派生后的树:
int main(void) {
int child1 = fork();
}
结果是:
bash-+-a.out---a.out
^ parent ^child
然后,如果孩子再次分叉,
int main(void) {
int child2 = 0;
int child1 = fork();
if (child1 == 0)
child2 = fork();
}
我们得到:
bash-+-a.out---a.out---a.out
^ parent ^child ^grandchild
但是如果父母再次分叉,孩子却不会,
int main(void) {
int child2 = 0;
int child1 = fork();
if (child1 > 0)
child2 = fork();
}
我们得到:
bash-+-a.out-+-a.out <- child1
^ `-a.out <- child2
parent
注意pstree
通过合并相同的同级来压缩输出。 您需要使用-c
选项来防止这种情况,并查看完整的树。
下面是我的解释,你可以决定是否匹配你的,我不太明白说像“创建子3
为0
, 1
,和2
”,因为每个将是一个独立的孩子。
我的代码副本:
int main(void) {
int child2 = 0;
int child1 = fork(); // fork 1
if (child1 == 0)
{
child2 = fork(); // fork 2
}
fork(); // fork 3
if (child2 > 0)
{
fork(); // fork 4
}
printf("%jd\n", getpid());
}
图:(左父,右子)
|
|\_____ // fork 1
| |
| |\______ // fork 2
| | |
|\__ |\__ |\__ // fork 3
| | | | | |
| | |\ |\ | | // fork 4
| | | | | | | |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.