[英]fork() Parent and child Processes of output
void main(){
if(fork()==0)
printf("a");
else{
printf("b");
waitpid(-1,NULL,0);
}
printf("c");
exit(0);
}
問題:程序的輸出是什么?
一種。 交流
b。 c
C。 密件抄送
d。 百家樂
e。 A或C或D(正確答案)
所以我想弄清楚為什么C是正確的答案之一。以下是我的推理:
子進程首先運行,然后停止並將控制權傳遞給父進程(“ a”打印輸出)
然后由於waitpid(),父進程將執行(打印出“ b”),
父級將控制權傳回給孩子,以便在子級處理(c打印輸出)中獲得子級。
最后,回到父進程“ c”打印出來。 所以我們有abcc。
我對嗎?
從理論上講,您的答案是正確的,它可能會像這樣發生(因此,在最后(a),(c),(d)看來它們可能會發生)。
實際上,唯一正確的答案是(a)。
原因是stdio
使用內部緩沖區來緩存輸出並避免昂貴的系統調用。 因此,在程序輸出`\\ n'(換行符)或退出之前,根本沒有輸出。
因此,實際情況將是:
'a'
推入緩沖區,然后將'c'
推入緩沖區。 'b'
壓入緩沖區並等待子級。 "ac"
緩沖區。 waitpid()
返回並將'c'
壓入緩沖區。 "bc"
緩沖區。 關於第二部分:
SIGKILL
可以終止任何進程(某些系統進程除外)。 子進程像其他進程一樣是常規進程。
waitpid
是等待子進程直到退出。 它與終止進程無關,它僅等待(無論是由於自身退出還是由於被終止,無論通過哪個信號)。
您關於C如何發生的推理是正確的。 時間(下來)看起來像這樣:
Parent Child
a
b
(waitpid)
c
c
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.