任何人都可以向我解释这个程序的工作情况,并向我解释其打印问候世界的输出20次。
#include<stdio.h>
#include<conio.h>
#include <sys/types.h>
int main(){
if(fork() && fork()){
fork();
}
if(fork() || fork()){
fork();
}
printf("Hello World");
getch();
return 0;
}
答案 0 :(得分:2)
fork()
返回:
所以我们将每个分支标记为A,B,C,D,E,F,以及每个进程P0,P1等:
int main(){
if(A && B){
C;
}
if(D || E){
F;
}
printf("Hello World");
getch();
return 0;
}
以下是每个分支生成的进程:
P0:
A -> P1
B -> P2
C -> P3
D -> P4
F -> P5
P1:
D -> P6
F -> P7
P2:
D -> P8
F -> P9
P3:
D -> P10
F -> P11
P4:
E -> P12
F -> P13
P5:
-
P6:
E -> P14
F -> P15
P7:
-
P8:
E -> P16
F -> P17
P9:
-
P10:
E -> P18
F -> P19
P11 - P19:
-
所以你有20个进程。
让我们讨论其中的两个:
P1是P0中叉A产生的过程
所以在P1中,A返回0,因此不评估B和C(在if
中,&&
的第一个操作数是false
,因此表达式被短路并且{{ 1}}是if condition
)
D被评估并返回!= 0,因此不评估E,评估F(在第二个false
中,if
的第一个操作数为真,因此表达式被短路并且{ {1}}返回true)。
因此P1通过叉子D和F生成新程序。
P8是P2中fork D生成的过程。所以D返回0.评估E并返回1并评估F.所以P8通过fork E和F生成了新的进程。