子进程在fork语句之后的最后一个停止的确切位置开始执行.如果语句包含多个fork(),如下所示的条件表达式,该怎么办?准确执行子进程的程序执行的位置.在担心创建了多少进程之前,我想知道创建的每个子进程是否都尝试评估fork() && fork() || fork();语句.如果是这样的话.由于第二个fork()语句而创建的子进程如何从第一个fork()中获取要评估的信息fork() && fork().
main(){
fork() && fork() || fork();
}
Run Code Online (Sandbox Code Playgroud)
由第二个产生的孩子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().双方child并child2有,但是.这让我们得到以下树:
fork()
/\
/ \
parent --/ \-- child1
fork() fork()
/\ /\
/ \ / \
/ \ child1 --/ \-- child1-1
/ \
/ \
parent --/ \-- child2
fork()
/\
/ \
child2 --/ \-- child2-1
Run Code Online (Sandbox Code Playgroud)
就是这样. child1并child2各获得PID各自的孩子,child1-1和child2-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)
就是这样 - 他们都退出了.