ホームページ >バックエンド開発 >C++ >このコードで `fork()` が 6 つのドットではなく 8 つのドットを出力するのはなぜですか?

このコードで `fork()` が 6 つのドットではなく 8 つのドットを出力するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-03 17:32:30295ブラウズ

Why Does `fork()` Output 8 Dots Instead of 6 in This Code?

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 つのドットが出力されます。この矛盾は最初は不可解に思えます。

コードの実行の分析

この動作を理解するには、実行プロセスを段階的に分解する必要があります:

  1. 初期状態: 単一のプロセスが実行されています。
  2. 最初の反復: プロセスがフォークし、別のメモリ空間を持つ子プロセスを作成します。親と子の両方がドットを出力します。
  3. 2 回目の反復: 親と子の両方が再びフォークし、合計 4 つのプロセスが作成されます。それぞれがドットを印刷します。
  4. プロセス終了: 4 つのプロセスはすべて終了しますが、以前の印刷操作でバッファリングされたドットは出力バッファーに残ります。

バッファされた出力

問題の核心は、printf() のバッファされた出力にあります。プロセスが印刷されるとき、出力はすぐには画面にフラッシュされません。代わりに、バッファに保存されます。 fork() システム コールがバッファをコピーし、バッファ内のドットが重複するため、この動作は重要です。

合計 8 つのドット

4 つのプロセスが終了すると、バッファリングされたドットはフラッシュされ、最初に印刷された単一のドットに追加されます。これにより、合計 8 つのドットが出力されます。

問題の回避

この動作を回避するには、次の後に fflush(stdout) を使用して出力バッファを明示的にフラッシュします。各 printf() 呼び出し。これにより、出力が即座に画面に送信され、プロセス数と印刷ドット数の誤差がなくなります。

以上がこのコードで `fork()` が 6 つのドットではなく 8 つのドットを出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。