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>
執行後,程式輸出的不是人們想像的 6 個點,而是令人驚訝的 8 個點。這怎麼可能?
深入 fork() 深淵
答案就在 fork() 的複雜工作原理中。該函數本質上創建了當前進程的近乎完美的副本,包括其記憶體和開啟的檔案描述符。主要區別在於傳回值,父進程和子進程之間的回傳值不同。
在我們的範例中,初始進程透過第一個 fork() 建立第二個進程。然後,這兩個進程都會列印一個點,然後再次循環和分叉。在第二個fork()之後,有四個進程,每個進程在退出前列印一個點。因此,我們可以解釋六個點。
但是,隨著 printf() 的隱藏性質,情節變得更加複雜。預設情況下, printf() 緩衝其輸出,延遲其實際顯示。因此,在第一次 fork() 呼叫之前列印的第一個點仍然不可見。這個隱藏的點,加上第二個 fork() 之後來自父進程和三個子進程的四個緩衝點,導致最終計數為 8 個點。
避免緩衝迷宮
為了避免這種行為並確保 printf() 立即輸出,可以在每次 printf() 呼叫後使用 fflush(stdout) 函數。這會強制寫入緩衝輸出,防止點消失在陰影中。
以上是為什麼這個 C 程式在使用 fork() 時印出 8 點而不是 6 點?的詳細內容。更多資訊請關注PHP中文網其他相關文章!