首頁  >  文章  >  後端開發  >  為什麼我的「fork()」迴圈產生的輸出比預期多?

為什麼我的「fork()」迴圈產生的輸出比預期多?

DDD
DDD原創
2024-11-04 07:46:31198瀏覽

Why Does My `fork()` Loop Produce More Output than Expected?

為什麼 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 個。這怎麼可能?

fork() 的行為

要理解意外的輸出,我們必須深入研究 fork() 原語的複雜性。當呼叫 fork() 時,它會創建當前進程的近乎完美的副本。最顯著的差異(對於大多數用途)是父進程和子進程的不同回傳值。但是,提供的程式碼忽略了這些回傳值,實際上使這種差異變得無關緊要。

追蹤執行

最初,存在一個行程。隨後,它創建第二個進程,導致兩個進程列印一個點並繼續循環。在第二次迭代中,每個進程再次建立一個副本,從而導致四個進程列印一個點然後退出。這解釋了前六個點。

緩衝和延遲輸出

但是,printf() 使用輸出緩衝。因此,這兩個過程列印的初始點並不是立即可見的。這些點保持緩衝狀態,並在 fork() 期間複製。只有當進程退出時,緩衝的點才會被刷新並出現。因此,四個行程輸出一個緩衝點以及一個新點,會產生 8 個點的意外輸出。

防止意外輸出

要抑制此行為,請使用 fflush(stdout);可以在每個 printf() 語句之後調用,從而確保點立即顯示。

以上是為什麼我的「fork()」迴圈產生的輸出比預期多?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn