多个fork()的语句

Fou*_*ind 2 c fork

子进程在fork语句之后的最后一个停止的确切位置开始执行.如果语句包含多个fork(),如下所示的条件表达式,该怎么办?准确执行子进程的程序执行的位置.在担心创建了多少进程之前,我想知道创建的每个子进程是否都尝试评估fork() && fork() || fork();语句.如果是这样的话.由于第二个fork()语句而创建的子进程如何从第一个fork()中获取要评估的信息fork() && fork().

main(){
fork() && fork() || fork();
}
Run Code Online (Sandbox Code Playgroud)

Car*_*rum 7

由第二个产生的孩子fork()知道第一个孩子的结果,fork()因为它是父过程的精确副本.

你可以通过为自己画一棵小树来解决发生的事情.从第一个fork开始:

         fork()
           /\
          /  \
parent --/    \-- child1
Run Code Online (Sandbox Code Playgroud)

child1进程child1返回进程的PID ,并返回0.所以我们有类似的东西:

PID(child1) && fork() || fork()
Run Code Online (Sandbox Code Playgroud)

在父母,和:

0 && fork() || fork()
Run Code Online (Sandbox Code Playgroud)

在孩子身上 短路意味着fork()原始表达式的中间不会在子节点中执行,仅在父节点中执行.那么现在这棵树会发生什么?

                  fork()
                    /\
                   /  \
         parent --/    \-- child1
         fork()
           /\
          /  \
parent --/    \-- child2
Run Code Online (Sandbox Code Playgroud)

parent是原始进程,并获得PID child2. child2就像child1,得到0.现在我们的表达式是什么样的?

parent:  PID(child1) && PID(child2) || fork() = 1 || fork()
child:   0 || fork()
child2:  PID(child1) && 0 || fork() = 0 || fork()
Run Code Online (Sandbox Code Playgroud)

现在,再次通过短路,parent完成,并且不执行最后一次fork().双方childchild2有,但是.这让我们得到以下树:

                     fork()
                       /\
                      /  \
            parent --/    \-- child1
            fork()            fork()
              /\                /\
             /  \              /  \
            /    \   child1 --/    \-- child1-1
           /      \
          /        \
parent --/          \-- child2
                        fork()
                          /\
                         /  \
               child2 --/    \-- child2-1
Run Code Online (Sandbox Code Playgroud)

就是这样. child1child2各获得PID各自的孩子,child1-1child2-1每个取回0中代这些值,最终的表达式是:

parent:   1
child1:   0 || PID(child1-1) = 1
child2:   0 || PID(child2-1) = 1
child1-1: 0 || 0 = 0
child2-1: 0 || 0 = 0
Run Code Online (Sandbox Code Playgroud)

就是这样 - 他们都退出了.