[英]how does this fork() work
你能告訴我,為什么輸入這個程序:1 2 2 5 5 3 4 5 4 5 3 4 5 4 5
快速解釋為什么會這樣? 謝謝
main()
{
printf("1\n");
fork();
printf("2\n");
if(fork()==0)
{
printf("3\n");
fork();
printf("4\n");
}
printf("5\n");
}
假設沒有調用fork
失敗的程序的輸出應該被認為是這樣的:
1
2 2
3 3
4 4 4 4
5 5 5 5 5 5
每列代表一個進程的輸出。 它們都以一些隨機順序被序列化到stdout
上, 僅受以下約束:在一列中,每個字符都不能出現在它上面的字符之前; 每列中最頂部的字符不能出現在其上方和左側的字符之前。
請注意,現在您的程序依賴於C庫,注意到stdout
是一個終端,因此將其設置為行緩沖。 如果你運行程序將stdout
重定向到文件或管道,你可能會得到相當不同的輸出,例如
$ ./a.out | tr '\n' ' '
1 2 5 1 2 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
...因為在這種情況下,所有輸出都被緩沖,直到從main
返回,並且緩沖區被復制到每個子進程中。 添加
setvbuf(stdout, 0, _IONBF, 0);
在第一個printf
語句之前將防止重復輸出。 (在這種情況下,您可以改為使用_IOLBF
,但_IONBF
對於這樣的代碼更安全。)
以圖形方式顯示會更容易一些,但每次調用fork()時,您都會有另一個進程繼續通過相同的代碼。 所以:
過程1(原始過程):打印1,然后創建過程2,打印2,然后創建過程3但不返回0,並打印5。
過程2:打印2,然后創建過程4但不返回0,並打印5。
過程3:打印3,然后創建過程5,打印4,打印5
過程4:打印3,然后創建過程6,打印4,打印5
過程5:打印4,打印5
過程6:打印4,打印5
但它們都是在相似的時間內發生的,所以為什么你得到所有這些數字。
希望有所幫助。 第一次回答!
看看在fedora中的某些味道假設首先執行的機會然后是孩子但是在其他像ubuntu的孩子那樣獲得第一選擇的基礎上你會看到輸出。 與此范圍內的printf函數無關但我們可以預測方法體在此處執行的次數我附加一個圖像可能對您有幫助。
這里1時只打印一個進程。 執行第一個fork之后,兩個不同的進程每個都有fork但在if語句中。 所以再次創建兩個進程,但只有一個將有機會進入if主體。 fork將再次執行,然后將再次生成新進程。 公式是進程總數= 2 * n。 其中n是函數內fork()方法的數量。 所以總共六種方法將有一些條件來打印任何數字,如2,3,4但所有5是共同的,所以5將打印六次。 可能是我的帖子對你有幫助謝謝asif aftab
因為你並不總是測試fork()
調用結果。 零結果路徑將保留為父進程,而else部分將作為子進程執行。 因為你沒有測試fork();
之后的每個代碼fork();
呼叫將在兩個進程中重復(並執行)。
由於輸出緩沖區的執行順序和繼承性,輸出不是確定性的,這是一種確定性的方法
#include <stdlib.h>
#include <stdio.h>
main()
{
printf("1\n");
fflush(stdout);
if (fork()) wait(0);
printf("2\n");
fflush(stdout);
if(fork()==0)
{
printf("3\n");
fflush(stdout);
if (fork()) wait(0);
printf("4\n");
} else wait();
printf("5\n");
}
Micheal,我需要看看fork()方法中的代碼是否可以確定,但是因為它是打印數字的額外數字,我能想到的唯一可能的解釋是你的fork()方法可能有打印它自己的方法。
知更鳥
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.