首頁 > 後端開發 > C++ > 主體

為什麼這段程式碼中 `fork()` 產生的點比預期多?

Susan Sarandon
發布: 2024-11-04 01:31:02
原創
711 人瀏覽過

Why Does `fork()` Produce More Dots Than Expected in This Code?

為什麼 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!