2015-06-23 49 views
-2

我是這個fork語句的新手,我不知道在c程序中使用fork方法。你能告訴我什麼是三個可能的輸出這個代碼..該代碼C可能的3個輸出是什麼? fork()

#include <unistd.h> 
#include <stdio.h> 

int main(void) { 
    printf("10\n"); 
    if (fork()) 
     printf("2\n"); 
    else 
     printf("3\n"); 
    printf("4\n"); 
    return 0; 
} 

我只知道這一個輸出是

10 
3 
4 

什麼其他2輸出時if (fork())是真的嗎?

+1

'fork()'通過複製其父項來創建子進程。在發佈之前,您應該在線閱讀有關'fork()'的調用。 http://linux.die.net/man/2/fork – jndok

+0

另外,請在發佈之前嘗試運行您的代碼。輸出永遠不會是'10 3 4'。 – user3386109

回答

3

理解它的關鍵很簡單:fork(),如果成功,返回兩次:在父項和子項中。在父母中,它返回新生兒的PID;在孩子中它返回0;

10 3 4永遠不會發生:如果打印3,這意味着一個子進程已成功創建(因爲fork()對孩子返回0),所以有將打印4兩個過程。假設fork()成功,在輸出中只有一個4是不可能的。

下面是一組可能的輸出:

  • 10 2 4 3 4:發生這種情況如果父母都執行先其次是孩子。父母打印10 2 4,然後小孩打印3 4
  • 10 2 3 4 4:發生在母先執行,打印2,那麼孩子執行並打印3,然後無論是父母還是孩子打印4,然後其他打印4
  • 10 3 4 2 4:發生在孩子執行時首先,打印34,然後父母繼續並打印24
  • 10 3 2 4 4:當孩子先執行,打印3,然後父恢復並打印2,然後無論是父母還是孩子打印4,然後其他印刷品的最終4發生。
  • 10 2 4:發生在fork()失敗並返回-1,在這種情況下,沒有任何兒童被創造的,因此你的原始過程的輸出僅

如果你在一個行緩衝終端運行程序,這些都是可能的。但是,如果將輸出重定向到文件,您可能會有一個驚喜,並在輸出中看到10多次。

發生這種情況是因爲重定向到文件通常會將緩衝模式從行緩衝切換到完全緩衝。假設緩衝區大小大於字符串10\n的3個字符,並且緩衝區在此期間未被刷新 - 也是一個合理的假設 - 子進程將以包含10\n的輸出緩衝區開始。所以,你最終在輸出中有兩個10\n

因此,該組可能的輸出在此可以被擴展爲包括另一10在子打印3前每一種可能性:

  • 10 2 4 10 3 4
  • 10 2 10 3 4 4
  • 10 10 3 4 2 4
  • 10 10 3 2 4 4
2

程序應該輸出下列之一:

10 2 3 4 4 
10 2 4 3 4 
10 3 4 2 4 
10 3 2 4 4 

由於fork()返回兩次,一次針對父並且一旦爲子,10是由母,父打印2和4的印刷一次,而客戶打印3和4.

由於父母和孩子都打印到同一個控制檯,並且在兩個過程之間沒有明確的語句順序,所以實際上有六個可能的輸出,其中四個是不同的。