如何只与一个特定的孩子分叉?

问题描述 投票:0回答:1

我正在尝试构建这样的进程树:

               P1
            /      \
          P3        P2
                      \
                       P4
                        \
                         ....

但是我无法使其正常工作。我尝试了此操作,但它只与P1一起使用。

for(int i = 0; i < depth; i++) {
    int _pid = fork();
    if(_pid == 0) {
        printf("[son] pid %d from [parent] pid %d\n", getpid(), getppid());
        exit(0);
    }
}
wait(NULL);
c fork
1个回答
0
投票

仅使用一个fork调用的要求使解决方案既繁琐又丑陋,但仍然可以像这样进行:

[步骤1:创建一个内部循环,如果i为0,则将运行两次,对于任何i > 0,将运行一次。

步骤2:仅在外循环的第一次迭代之后才在子进程中分叉。

步骤3:退出在内部循环的第二次迭代中分叉的子代。

int cur_pid = 0;

printf("Root PID %d started by %d\n", getpid(), getppid());

for (int i = 0; i < depth && cur_pid == 0; i++) {
    for (int j = 0; j < (i ? 1 : 2); j++) {
        cur_pid = fork();
        if (cur_pid == 0) {
            printf("[son] pid %d from [parent] pid %d\n", getpid(), getppid());
            if (j == 1) {
                exit(0);
            } else {
                break;
            }
        } else if (cur_pid < 0) {
            printf("Error forking at PID %d\n", getpid());
        }
    }
}

wait(NULL);

如果您想让wait返回有效值,请记住每个迭代的子进程的getppid

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