ホームページ >バックエンド開発 >C++ >単純な fork() ループで 2 つではなく 8 つのドットが生成されるのはなぜですか?

単純な fork() ループで 2 つではなく 8 つのドットが生成されるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-04 02:04:02576ブラウズ

Why does the simple fork() loop produce eight dots instead of two?

fork() での予期せぬ分岐の奇妙なケース

fork() プリミティブを使用して子プロセスを作成する次のコード スニペットを考えてみましょう。

<code class="C">#include <stdio.h>
#include <sys>
#include <unistd.h>

int main(void)
{
    int i;
    for(i = 0; i <p>驚くべきことに、このプログラムを実行すると、当初の予想より 6 つ多い 8 つの出力ドットが生成されます。なぜこれが起こるのでしょうか?</p>
<p><strong>隠されたプロセスを明らかにする</strong></p>
<p>この謎を解明するために、fork() の操作を詳しく調べてみましょう。 fork() は現在のプロセスのレプリカを作成し、親プロセスと子プロセスを作成します。</p>
<p>最初は 1 つのプロセスがあり、それが 2 つに分岐します。これらのプロセスは両方とも、for ループを段階的に実行し、毎回ドットを出力します。 2 回目の反復では、各プロセスが再びフォークし、合計 4 つのプロセスが作成されます。これら 4 つのプロセスは、終了する前にドットを出力します。</p>
<p><strong>バッファリングされた出力と遅延された外観</strong></p>
<p>ただし、printf() は出力をバッファリングします。つまり、出力を送信する前に複数の出力を蓄積します。すぐに。 4 つのプロセスすべてが 2 番目のドットを印刷すると、バッファリングされます。ここで卑劣な効果が発生します。</p>
<p>fork() の際、バッファリングされたドットは子プロセスに継承されます。したがって、各子プロセスが終了すると、そのバッファリングされたドットが出力ストリームに表示されます。これら 4 つの遅延ドットを段階的に印刷される 4 つのドットに追加すると、予想外の合計 8 つになります。</p>
<p><strong>バッファリングされたドットの回避</strong></p>
<p>このバッファリングされた動作をバイパスするには、以下を呼び出すことをお勧めします。 fflush(標準出力);各 printf() ステートメントの後。これにより、出力が直ちに送信され、予想される数のドットが表示されるようになります。</p></unistd.h></sys></stdio.h></code>

以上が単純な fork() ループで 2 つではなく 8 つのドットが生成されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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