(c语言)为什么for循环中的fork()会产生意外的进程?

问题描述 投票:0回答:1
#include <stdio.h>
#include <sys/type.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>

int main(void)
{
    pid_t pid;
    int i;
    for(i=0; i<3; i++) {
        pid = fork();
        if(pid == -1) {
            printf("Fork Error.\n");
        } else if(pid == 0) {
            printf("I am child");
        }
    }

    if(pid != 0) {
        while((pid = waitpid(-1, NULL, 0)) > 0)
            if(errno == ECHILD)
                break;
            printf("I am parent and all children have exited.\n");
    }
    exit(0);

    return 0;
}

结果是:

'我是孩子'打印了7次,'我是家长,所有的孩子都退出了'打印了4次。

而且打印顺序也不固定。

我想明白了一些我一直在纠结的问题,但有些问题还没有解决。所以,这里是。

为什么 "我是家长,所有的孩子都退出了。"打印了4次?

你能详细解释一下吗?

PS. 我知道syswait.h需要插入到代码的顶部,但我的老板不希望我这样做。

c process fork
1个回答
0
投票

你在一个循环中进行fork,基本上你的子进程会继续执行它们开始的循环。所以在下一次迭代时,他们可能会达到一个fork,并创建自己的子进程。

如果你在循环中插入一个 break; 紧接着 printf("I am child"); 当你刚刚创建一个子进程时,退出循环,让父进程继续创建更多的子进程,你可能会得到一些接近你预期的东西。

© www.soinside.com 2019 - 2024. All rights reserved.