【问题标题】:(c language) Why fork() in for loop produces unexpected processes(c语言)为什么for循环中的fork()会产生意想不到的进程
【发布时间】:2020-05-07 13:45:01
【问题描述】:
#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。我知道 sys/wait.h 需要插入到代码之上, 但我的老板不希望我这样做。

【问题讨论】:

标签: c process fork


【解决方案1】:

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

如果您在 printf("I am child"); 之后插入一个 break; ,当您刚刚创建一个子进程时退出循环,并让父进程继续创建更多子进程,您可能会得到更接近预期的结果。

【讨论】:

  • 你能解释一下为什么执行的次数 printf("I am parent ~");是4详细吗?
  • 第一父进程是主进程。它创建了 i = 0、i = 1、i = 2 的子代。(我们称它们为 child[i])。 child[0] 和 child[1] 都将创建孩子(child[2] 在循环的最后一次迭代中)。 child[0] 将创建两个孩子,child[1] 将创建一个。所以他们都可以等待一个孩子(并且会打印他们是父母)。然后由 child[0] 创建的第一个孩子也将创建一个孩子。那是你的第四个父母。
  • 我不明白为什么 child[0] 和 child[1] 都在第一次创建孩子...
  • 当你使用 fork() 创建子进程时,子进程从 fork 之后开始执行。如果你在循环中分叉,子进程将继续执行循环。由于您的循环包含一个 fork(),因此您的子进程可能会到达 fork() 并自己创建一个子进程。是不是更清楚了?
  • 我知道你的意思。我的想法是,如果 i = 0,则创建 child[0] 并 printf("I am child\n");如果 i = 1 则执行,child[1] 和 child[2] 是从 child[0] 和 printf("I am child\n"); 创建的执行两次。如果 i = 2,child[3] 和 child[4] 是从 child[1] 创建的,child[5] 和 child[6] 是从 child[2] 创建的,并且 printf("I am child\n" );执行4次。所以 printf("I am child\n"); 的总次数执行次数为 1 + 2 + 4 = 7 次。但我不明白为什么 printf("I am parent ~");执行 4 次。你能详细解释一下吗? (对不起)
猜你喜欢
  • 2019-04-05
  • 1970-01-01
  • 2018-06-16
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多