考虑以下 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 不是吗?
我几乎可以肯定,对于最后一个打印语句,结果是不确定的,但本质上你永远不会得到零,因为计数器永远不会为零,因为孩子永远不会返回零。 如果计数器为零,那么它一开始就不会分叉。
计数器 4、2 和 1 调用 fork
三次。并且没有打印 0,因为 counter/=2;
后没有 printf
语句,while 循环最终在计数器获得 0 后退出。
WEXITSTATUS
的可能输出可以是 4、2、1 和 0。但是只有两个waitpid
,第二个printf
的输出应该是 6,因为只有两个 waitpid 调用将只等待 4 和 2。因此,第二个printf
的输出应为 6。如果您再添加一个
waitpid(-1, &status, 0);
counter += WEXITSTATUS(status);
输出应为 7。