簡體   English   中英

fork()父級和子級輸出過程

[英]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'(換行符)或退出之前,根本沒有輸出。

因此,實際情況將是:

  1. 子級將字符'a'推入緩沖區,然后將'c'推入緩沖區。
  2. 父級同時將字符'b'壓入緩沖區並等待子級。
  3. 子級退出並刷新之前包含"ac"緩沖區。
  4. 父級從waitpid()返回並將'c'壓入緩沖區。
  5. 父級退出並刷新包含"bc"緩沖區。

關於第二部分:

SIGKILL可以終止任何進程(某些系統進程除外)。 子進程像其他進程一樣是常規進程。

waitpid是等待子進程直到退出。 它與終止進程無關,它僅等待(無論是由於自身退出還是由於被終止,無論通過哪個信號)。

您關於C如何發生的推理是正確的。 時間(下來)看起來像這樣:

Parent    Child
          a
b
(waitpid)
          c
c

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM