考虑以下C代码:
int main(){
pid_t pid;
int status, counter = 4;
while(counter > 0){
pid = fork();
if (pid){
counter/=2;
}
else{
printf("%d", counter);
break;
}
}
if (pid){
waitpid(-1, &status, 0);
counter += WEXITSTATUS(status);
waitpid(-1, &status, 0);
counter += WEXITSTATUS(status);
printf("%d", counter);
}
return counter;
}
所有进程都运行完成,printf是原子的,在打印参数后但在返回之前调用fflush(stdout)。
列出对printf的调用可以发出的个别数字。
正确答案是1 2 3 4 5 6。
然而,我不明白为什么。 首先,WEXITSTATUS的可能输出是什么?如果所有进程都运行完成,那么它是否总是等于0?另外,为什么0不是可能的输出?如果计数器== 0且WEXITSTATUS都输出0,那么计数器最终会为0吗?
答案 0 :(得分:1)
我几乎可以肯定结果对于最后一个打印语句是不确定的,但基本上你永远不会得到零,因为计数器永远不会为零,因为孩子永远不会返回零。如果计数器为零,那么它就不会在第一时间分叉。
答案 1 :(得分:0)
对于计数器4,2和1,fork
被调用三次。由于在printf
之后没有counter/=2;
语句,并且while循环最终退出,因此不打印0计数器得到0.
WEXITSTATUS
的可能输出可以是4,2,1和0.但是只有两个waitpid
,第二个printf
的输出应该是6,因为有只有两个waitpid调用只等待4和2.因此第二个printf
的输出应为6.如果再添加一个
waitpid(-1, &status, 0);
counter += WEXITSTATUS(status);
输出应为7。