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>
このコードは 2 回フォークし、各プロセスで 1 つのドットを出力するため、出力として 6 つのドットが生成されます。しかし、なんと8ドットも出力されます。なぜこのようなことが起こるのでしょうか?
Fork() とプロセスの複製
fork() 関数は、現在のプロセスのほぼ完全な複製を作成します。最も注目すべき違いは、戻り値が親プロセスと子プロセスで異なることです。
このコードでは、fork() 呼び出しにより、元のプロセスと 3 つの子プロセスの 4 つのプロセスが作成されます。各プロセスは作成時にドットを出力し、最初の 6 つのドットが表示されます。
バッファ出力
ただし、もう 1 つ問題があります。 printf() はバッファを使用して、出力がフラッシュされるかプロセスが終了するまで出力を保存します。このコードでは、プロセスが終了するまで出力はフラッシュされません。
その結果、元のプロセスと最初の子プロセスからのドットは、2 回目のフォーク中にバッファーに残ります。残りの 4 つのプロセス (最初のフォークからの 2 つと 2 番目のフォークからの 2 つ) が終了すると、バッファーがフラッシュされ、ドットが印刷されます。これにより、合計出力は 8 ドットになります。
バッファ出力の防止
この動作を回避するには、fflush(stdout); を呼び出すことができます。各 printf() 呼び出しの後に、出力を即座にフラッシュするように強制します。ただし、これは一部のシナリオではパフォーマンスに影響を与える可能性があります。
以上がこのコードで `fork()` が予想よりも多くのドットを生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。