[英]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.