5

2 つの異なるプログラムがあり、たとえば次のように小さいです。

int main()
{
        printf ("print hello");
        fork();
}

int main()
{
        printf ("print hello\n");
        fork();
}

出力 1 は次のとおりです。

出力 2 は次のとおりです。print hello

問題は、なぜ 1 つ\nしか印刷されないものは 1 回印刷され、最初のものは 2 回印刷されるのかということです。

4

2 に答える 2

8

printfシステムの実装のバッファリング動作に遭遇しています。最初のケースでは、文字列はバッファに出力されますが、改行がない (そして を呼び出していないfflush) ため、そのバッファにそのまま残っています。次にフォークすると、それぞれのプロセスが終了するときに、フォークされた両方のバッファがフラッシュされます。

2 番目のケースでは、fork の前に\nバッファーがフラッシュされるため、fork されたプロセスが終了したときに出力が残っていません。

于 2013-07-03T17:35:28.687 に答える
4

変化する:

    printf ("print hello");
    fork();

    printf ("print hello");
    fflush(stdout);
    fork();

デフォルトでstdoutは、通常は行バッファリングされます。stdout例 2) では、 の前にフラッシュされる保証がありますがfork、例 1) では、 の後に発生する可能性がありforkます。stdoutの前にフラッシュすると、 のfork前に文字列が出力されることが保証されますfork

于 2013-07-03T17:34:35.880 に答える