[英]Checking process control using printf
考虑以下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,如果counter == 0并且WEXITSTATUS都输出0,那么counter最终将为0?
我几乎可以肯定,最后一个print语句的结果是不确定的,但是从本质上讲,您永远不会得到零,因为counter永远不会为零,因为孩子永远不会返回零。 如果counter为零,那么它就不会叉出来。
在计数器4、2和1中,该fork
被调用了3次。由于在counter/=2;
之后没有printf
语句,所以不打印0 counter/=2;
并且while循环最终在计数器变为0后退出。
WEXITSTATUS
的可能输出可以是WEXITSTATUS
和0。但是只有两个waitpid
,第二个printf
的输出应该是6,因为只有两个waitpid调用将仅等待4和2。因此,第二个printf
输出应为6。如果再添加一个
waitpid(-1, &status, 0);
counter += WEXITSTATUS(status);
输出应为7。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.