C中的fork()和exit()

时间:2015-12-21 22:02:48

标签: c fork wait exit

我试图理解以下内容,其中只有子进程正在创建子进程。

int main(int argc, char **argv) {
    int i;
    int n;
    int num_kids;

    if (argc != 2) {
        fprintf(stderr, "Usage: forkloop <numkids>\n");
        exit(1);
    }

    num_kids = atoi(argv[1]);

    for (i = 0; i < num_kids; i++) {
        n = fork();
        if (n > 0) {
            printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
            if (wait(NULL) == -1) {
                perror("wait");
            }
            exit(0);
        } else {
            printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
        }
    }
    return 0;
}

我是否正确理解,在每个循环结束时,父进程退出,并且子进程成为新父进程?原因是exit()语句,它终止了父进程?另外,在父级中执行wait(),等待其子级终止,循环的每次迭代,然后才退出吗?但是,孩子从未真正退出,所以等待陈述何时发挥作用?

1 个答案:

答案 0 :(得分:3)

  

我是否正确理解,在每个循环结束时,父母   进程退出,孩子成为新的父母?原因是   exit()语句,它终止父进程?

是的,但这个过程并不会立即死亡。每个父母&#34;调用wait()并等待子进程完成。

  

此外,在父级中执行wait(),等待其子级终止,   循环的每次迭代然后才退出?

是。这意味着&#34;父母&#34;进程以相反的顺序死亡。这意味着第一个过程最后死亡。

  

但是,孩子从未真正退出,所以等待的时间   声明发挥作用?

所有进程都会在您的代码中消失。当第一个子进程继续执行for循环时,父进程等待(类似地,所有其他子进程等待其子进程)。最后一个进程通过循环退出并通过main()返回退出。