在这个c程序中创建了多少个进程?

bxpogfeg  于 2023-03-07  发布在  其他
关注(0)|答案(2)|浏览(145)

这是给我的例子,我被问到创建了多少个进程。
(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,我将非常感谢一些输入,谢谢。

iecba09b

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个进程的祖先。

roejwanj

roejwanj2#

在第一个fork之后,您有一个父级和一个子级(总共2个)。
在第二个叉之后,你有两个父母和两个孩子(总共4个)。
在第三个叉之后,你有四个父母和四个孩子(总共8个)。
然后4个孩子每人叉,总共12个。
然后所有进程都分叉,得到24。

相关问题