Fork() 的意外分支行為
考慮以下使用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>
令人驚訝的是,當這個程式執行時,它輸出了8 個點,而不是預期的6 個點。這種差異最初看起來令人費解。
剖析程式碼的執行
要理解這種行為,我們必須逐步分解執行過程:
緩衝輸出
問題的癥結在於 printf() 的緩衝輸出。當進程列印時,輸出不會立即刷新到螢幕上。相反,它存儲在緩衝區中。此行為很重要,因為 fork() 系統呼叫會複製緩衝區,導致重複的緩衝區。
總共 8 個點
當四個進程終止時,它們的緩衝點被刷新,將它們添加到最初打印的單點中。這將導致總共輸出 8 個點。
避免問題
為了防止這種行為,可以在之後使用 fflush(stdout) 明確刷新輸出緩衝區每次 printf() 呼叫。這確保了輸出立即發送到螢幕,消除了進程數和列印點數之間的差異。
以上是為什麼這段程式碼中 `fork()` 輸出 8 點而不是 6 點?的詳細內容。更多資訊請關注PHP中文網其他相關文章!