它们会被打印多少次,为什么?我知道:“Alpha”一次,“Beta”两次,“Omega”两次,但我不知道为什么

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

这是代码:

int main(int argc, char *argv[]) {
    if (!fork()) {
        write(1, "Alpha\n", 6);
    }
    if (!fork()) {
        write(1, "Beta\n", 5);
        return 0;
    }
    write(1, "Omega\n", 6);
    return 0;
}

1) 或创建了 fork1-> Parent 和 Child1。 Child1 打印 Alpha。 fork2->为Parent创建Child2,为Child1创建Child3。 Parent 和 Child1 打印 Omega Child2 和 Child3 Beta(Child1 已经打印一次 Alpha。)或 2)将“Beta”打印两次,因为有两个子进程(Child 1 和 Child 2)是由单独的 fork() 调用创建的,并且他们每个人都打印“Beta”。父母打印 Omega 一次,孩子 1 打印一次? 或者以上都不是?我倾向于第一个解释,但真的很困惑,而聊天只会让我更加困惑......

c if-statement printf fork
1个回答
0
投票

成功时

fork()
返回两次,一次返回到具有子进程 ID 的父进程,一次返回到具有值 0 的子进程。最简单的推理方法是使用包含父进程 ID 和当前进程 ID 的跟踪沿着每个输出进行处理:

#include <stdio.h>
#include <unistd.h>

void print(const char *s) {
    printf("parent: %ld, current: %ld %s\n", (long) getppid(), (long) getpid(), s);
}

int main(void) {
    if (!fork()) {
        print("Alpha");
    }
    if (!fork()) {
        print("Beta");
        return 0;
    }
    print("Omega");
}

和示例输出:

parent: 1217505, current: 1218158 Omega
parent: 1218158, current: 1218159 Alpha
parent: 1218158, current: 1218160 Beta
parent: 1218158, current: 1218159 Omega
parent: 1218159, current: 1218161 Beta

然后您只需遵循每个流程即可:

  1. 初始进程 1218158 分叉两个子进程 1218159 和 1218160 并打印 Omega。

  2. 第一个子进程 1218159 打印 Alpha,然后分叉孙进程 1218161 并打印 Omega。

  3. 第二个子进程1218160打印Beta。

  4. 孙子进程1218161打印Beta。

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