考慮以下程式碼片段:
<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 個。這怎麼可能?
要理解意外的輸出,我們必須深入研究 fork() 原語的複雜性。當呼叫 fork() 時,它會創建當前進程的近乎完美的副本。最顯著的差異(對於大多數用途)是父進程和子進程的不同回傳值。但是,提供的程式碼忽略了這些回傳值,實際上使這種差異變得無關緊要。
最初,存在一個行程。隨後,它創建第二個進程,導致兩個進程列印一個點並繼續循環。在第二次迭代中,每個進程再次建立一個副本,從而導致四個進程列印一個點然後退出。這解釋了前六個點。
但是,printf() 使用輸出緩衝。因此,這兩個過程列印的初始點並不是立即可見的。這些點保持緩衝狀態,並在 fork() 期間複製。只有當進程退出時,緩衝的點才會被刷新並出現。因此,四個行程輸出一個緩衝點以及一個新點,會產生 8 個點的意外輸出。
要抑制此行為,請使用 fflush(stdout);可以在每個 printf() 語句之後調用,從而確保點立即顯示。
以上是為什麼我的「fork()」迴圈產生的輸出比預期多?的詳細內容。更多資訊請關注PHP中文網其他相關文章!