在研究CSAPP,我遇到的做法:列出所有可能的輸出序列進行下面的程序:c:函數waitpid如何工作?
int main()
{
if(Fork()==0) {
printf("a");
}
else {
printf("b");
waitpid(-1,NULL,0);
}
printf("c");
exit(0);
}
的答案是:ACBC ABCC bcac BACC;
爲什麼bcac
是正確的?函數waitpid()
暫停執行調用進程,直到其等待集中的子進程終止。因此,家長不能打印c
,直到子進程終止,這意味着孩子同時打印a
和c
。
我真的很困惑。我不知道爲什麼bcac
是正確的。父進程應保持或暫停,直到孩子終止。
你確定它的'Fork()'? –
可能是由於緩衝。輸出到'stdout'(這是'printf'正在使用的)默認情況下是*行緩衝*。直到緩衝區已滿(不會在這裏發生),打印出一個換行符(這裏沒有發生),還有一個明確的'fflush'調用(這裏不會發生),或者進程退出並退出被刷新。 –
可能是另一個複製到:http://stackoverflow.com/q/2530663/694576 – alk