For 循环中的 fork()

fork() in a For Loop

#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;
}

结果是,

'I am child' 打印了 7 次, 'I am parent and all children have exited.' 打印了 4 次

而且打印顺序不固定

这是我的问题!

为什么'I am child'打印了7次,

和 'I am parent and all children have exited.' 打印了 4 次 ?

我不明白这些句子被打印了多少次。

能详细解释一下吗?

您可以试试下面的代码。您需要添加等待 header。同时,在提供了child个进程的0条件后,一定要注销,否则代码中各个进程每次都会fork一次又一次。很快你必须在任务结束后杀死每个进程。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.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\n");
            exit(0); // !
        }
    }

    if (pid != 0) {

        while ((pid = waitpid(-1, NULL, 0)) > 0)
            if (errno == ECHILD)
                break;

        printf("I am parent and all children have exited.\n");
    }

    return 0;
}