為什麼 fork() 分支的次數比預期多?
考慮以下程式碼片段:
<code class="c">#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; for(i = 0; i < 2; i++) { fork(); printf("."); } return 0; }</code>
這段程式碼應該產生 6 個點作為輸出,因為它分叉兩次並且每個行程都列印一個點。然而,令人驚訝的是它輸出了 8 個點。為什麼會發生這種情況?
Fork() 和進程複製
fork() 函數創建當前進程的近乎完美的副本。最顯著的差異是父進程和子進程的回傳值不同。
在此程式碼中,fork() 呼叫建立了四個進程:原始進程和三個子進程。每個進程在創建時都會列印一個點,占前六個點。
緩衝輸出
但是,還有一個問題。 printf() 使用緩衝區來儲存輸出,直到它被刷新或進程退出。在此程式碼中,直到進程退出後才會刷新輸出。
因此,在第二次分叉期間,原始進程和第一個子進程中的點仍保留在緩衝區中。當剩餘的四個進程(兩個來自第一個分支,兩個來自第二個分支)退出時,它們會刷新緩衝區,從而列印點。這使得總輸出達到 8 點。
防止緩衝輸出
要避免這種行為,您可以呼叫 fflush(stdout);在每次 printf() 呼叫之後強制立即刷新輸出。但是,這在某些情況下可能會影響效能。
以上是為什麼這段程式碼中 `fork()` 產生的點比預期多?的詳細內容。更多資訊請關注PHP中文網其他相關文章!