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 つのドットが出力されます。この矛盾は最初は不可解に思えます。
コードの実行の分析
この動作を理解するには、実行プロセスを段階的に分解する必要があります:
バッファされた出力
問題の核心は、printf() のバッファされた出力にあります。プロセスが印刷されるとき、出力はすぐには画面にフラッシュされません。代わりに、バッファに保存されます。 fork() システム コールがバッファをコピーし、バッファ内のドットが重複するため、この動作は重要です。
合計 8 つのドット
4 つのプロセスが終了すると、バッファリングされたドットはフラッシュされ、最初に印刷された単一のドットに追加されます。これにより、合計 8 つのドットが出力されます。
問題の回避
この動作を回避するには、次の後に fflush(stdout) を使用して出力バッファを明示的にフラッシュします。各 printf() 呼び出し。これにより、出力が即座に画面に送信され、プロセス数と印刷ドット数の誤差がなくなります。
以上がこのコードで `fork()` が 6 つのドットではなく 8 つのドットを出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。