这是给我的例子,我被问到创建了多少个进程。
(c)秘书长的报告
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void){
int pid = (int)fork();
pid = fork();
pid = fork();
printf("%d\n", pid);
if (pid == 0){
fork();
}
fork();
return 0
}
一开始我看到5个fork,所以2^5 - 1 = 31个进程,但是很快就发现情况不是这样的if(pid == 0){ fork();把我甩了
我修改了代码以获得某种计数:
(c)秘书长的报告
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int count = 1;
int main(void){
int pid = (int)fork();
pid = fork();
pid = fork();
if (pid == 0){
printf("2 ");
fork();
}
fork();
printf("1 ");
return 0;
}
结果:1 1 1 1 2 1 1 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 1 2 1 2 1 1 2 1 2 1 2 1
也就是24个1和8个2,使用这些信息,我假设24-1 = 23个进程被创建了,其中8个是由if循环创建的,但是我无法解释它,如果我首先应该减1,我将非常感谢一些输入,谢谢。
2条答案
按热度按时间iecba09b1#
我们可以看到程序总是执行到单个
return
语句。到达第五个
fork()
的每个进程变为两个进程。if
中的第四个fork()
创建一个进程,但前提是它必须位于前一个fork的子进程中,因此,到达此if
的每对父子进程都变成了三个进程(父节点、其子节点以及该fork()
的新子节点)。然后,如上所述,第五个fork()
乘以6,所以每两个到达这一点的过程最终都是6,等价地,对于一个到达这一点的过程,最终是3个。到达第三个
fork()
的每个进程变成两个进程,然后后续的fork()
调用将其乘以3,得到6。到达第二个
fork()
的每个进程变成两个进程,随后的fork()
调用将其乘以6,得到12。到达第一个
fork()
的每个进程变成两个进程,随后的fork()
调用将其乘以12,得到24。因此,一个原始进程导致总共24个进程,所以第一个进程是其他23个进程的祖先。
roejwanj2#
在第一个fork之后,您有一个父级和一个子级(总共2个)。
在第二个叉之后,你有两个父母和两个孩子(总共4个)。
在第三个叉之后,你有四个父母和四个孩子(总共8个)。
然后4个孩子每人叉,总共12个。
然后所有进程都分叉,得到24。