代码之家  ›  专栏  ›  技术社区  ›  Mike Balts

它们将被打印多少次,为什么?我知道:“阿尔法”一次,“贝塔”两次,“欧米茄”两次但我不知道为什么

  •  0
  • Mike Balts  · 技术社区  · 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”。Parent打印Omega一次,child 1打印一次? 或者以上都没有?我倾向于第一种解释,但真的很困惑,聊天只会让我更困惑。。。

    i entered an image of what i think is happening

    1 回复  |  直到 1 年前
        1
  •  2
  •   Allan Wind    1 年前

    论成功 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。