我编写了两个简单的程序来理解fork()API。
第一个程序:

int multiple_fork(){
    fork();     //prints 2 times
    fork();     //prints 4 times
    printf("hello\n");
    exit(0);
}

int main(){
    multiple_fork();
    return 0;
}

这个程序将打印“hello”四次,因为第一个fork()生成一个子线程(C0),第二个fork分别从父线程(P)和C0生成另两个子线程C1和C2。到现在为止,一直都还不错。
第二个程序:
#define N 2
int main(){
    int status, i;
    pid_t pid;
    /* parent creates N children */
    for(i = 0; i < N; i++)
        if((pid = fork()) == 0){ /* Child */
            printf("Child\n");
            exit(100+i);
        }
    return 0;
}

这将打印“Child”两次,我不明白,因为我希望“Child”被打印三次。原因:
在第一个循环中,生成一个子进程(C0),这样这个子进程将打印一次“child”。由于C0包含与父进程P相同的地址空间,因此P和C0将执行第二个循环。所以C1和C2分别由P和C0生成。所以对于C1和C2,每个子进程将打印一次“child”。因此,它应该打印“儿童”三次。但显然,我错了。有人能解释一下发生了什么事吗?

最佳答案

fork(2)返回时,只有子项具有pid == 0,因此只有两个子项(在每次迭代时分叉)将进入if块并打印。
这两个孩子不会继续分叉,因为您调用exit(2)系统调用。

08-07 04:22