为什么fork()不创建多个进程,或者它是什么?

时间:2010-09-16 08:23:07

标签: process fork

我们今天进行了一项学校练习,以创建多个流程。我们的问题不是代码本身也不是对fork()的理解。

我和我的伙伴的问题是为什么它没有创建我们代码的4个进程,如下所示:

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>

//kod

int child1();
int child2();

int main() {

        pid_t pid1, pid2;
        int i;

        pid1 = fork();
        pid2 = fork();

        if(!pid1)
                child1();
        else if(!pid2)
                child2();
        else {
                printf("parentlolololololol");
        }

        for(;;)

        return 0;
}
int child1(){
        for(;;) {
                printf("A");
                fflush(stdout);
                sleep(1);
        }
        return 0;
}

int child2(){
        for(;;){
                printf("B");
                fflush(stdout);
                sleep(1);
        }
        return 0;
}

我们讨论了程序是否创建了4个进程。第二个fork() - 调用是否创建了一个子进程的新进程,为什么它不被任何循环阻止?或者第二个fork() - 调用是否创建了一个新的子进程?

这与我们的练习无关,但我们非常好奇,因为你必须是一名程序员;)

2 个答案:

答案 0 :(得分:1)

问题是这一行缺少分号:

    for(;;)

    return 0;

这意味着主程序将永远返回0 - 实际上只在第一次生效。

在第一个fork之后有两个进程,一个是pid1为0,另一个是pid1。 然后,这两个进程中的每一个都调用第二个fork语句 - 其中两个将具有pid2 == 0而两个不具有。

main ---> fork --> pid1 == 0 --> fork --> pid2 == 0
                                      --> pid2 != 0
               --> pid1 != 0 --> fork --> pid2 == 0
                                      --> pid2 != 0

所以有4个过程。输入条件,两个被'child1'捕获,一个被'child2'捕获。主要流程退出。这使得3个进程运行,两个打印'A'和一个打印'B'。

答案 1 :(得分:0)

它确实 - 它无条件地分叉两次,创造了4个过程(好吧,3个新过程)。其中两个应该运行child1(),一个child2()和一个父代码。这是因为pid1 / pid2对有4个不同的值,第一个if覆盖其中两个。

相关问题