在理解 fork() 层次结构树时遇到问题

Having problem Understanding fork() hierarchy tree

我有这段我无法理解的代码。我了解 fork() 的基础知识,但我不了解此过程的层次结构树。 代码是这样的:

main()
{
    fork();
    if(fork()){
        printf("A");
    }
    else{
        printf("B");
    }
}

输出是A A B B。这是怎么发生的?我明白为什么 A 被打印两次但为什么 B 被打印?分层树在这里如何工作?

输出是 A A B B -> 由于并发性,输出在运行之间可能会有所不同我有这个

所以逻辑如下:第一个 fork 在第一个 fork 之后再创建一个进程来执行相同的程序,这两个进程中的每一个都创建一个进程打印 B 然后打印 A 自己总共有 4 个进程

好的,让我们“画出”这个程序创建的进程树(使用 P 代表 parent 进程,C 代表 child 进程):

                      fork()
                        ^
                       / \
                       | |
                       P C
                       | |
          /------------/ \------------\
          |                           |
        fork                        fork
          ^                           ^
         / \                         / \
         | |                         | |
         P C                         P C
         | |                         | |
   /-----/ \----\              /-----/ \----\
   |            |              |            |
printf("A")  printf("B")    printf("A")  printf("B")

首先有一个 fork() 没有条件。这意味着 parent 和 child 进程都在程序的同一路径上继续。

然后是第二个 fork() 调用。原来的 parent 和 child 都会做这个分支。在新的 fork 中,新的 parent 进程将有一个 non-zero return 值,这意味着条件是 true 并且它们将打印 "A"。新的 child 进程将有一个零 return 值,即 false 并且它们将继续打印 "B".

进程的确切顺序 运行 未指定,因此确切的输出将无法预测。但它会打印 "A" 两次和 "B" 两次。