printf()はfork()の前に呼び出されますが、printf()ループはfork()が呼び出されるたびに標準出力に出力されます。 '\ n'がこの問題を解決するのはなぜですか? [コピー]

printf()はfork()の前に呼び出されますが、printf()ループはfork()が呼び出されるたびに標準出力に出力されます。 '\ n'がこの問題を解決するのはなぜですか? [コピー]

プレイ中にfork()少し奇妙な動作を見つけましたが、なぜこれが起こるのかわかりませんでした。

次の例では、各以前の呼び出しfork()の出力がprintf()stdoutに印刷されます。test出力の値は、printf()実際には再実行されないことを示します。それ以外の場合はtest毎回増加します。

\nこれ以上の点(または回避策の中核)は、フォーマット文字列の末尾にprintf()を追加してもこの動作が発生しないことです。

なぜこれが起こるのか知っている人がいますか?おそらくstdoutバッファに関連していますか?私はこのようなことに慣れていません。

それとも私は何かひどい過ちを犯しましたか?

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main(char* args) {
    pid_t pid;
    int wstatus;
    int test = 0;

    printf("\n[%d] parent start | test = %d ", getpid(), test++);

    // This works fine
    //printf("\n[%d] parent start | test = %d \n", getpid(), test++);

    for(int i = 0; i < 5; i++) {
        if((pid = fork()) == 0) {
            //printf("\n[%d] Child spawned ", getpid());
            exit(0);
        }
        //printf("\n[%d] Printing with fork() commented out works fine", getpid());
    }

    while(wait(&wstatus) > 0);

    printf("\n[%d] parent end\n\n", getpid());
    return 0;
}

出力:

[342470] parent start | test = 0 [342470] parent start | test = 0 [342470] parent start | test = 0 [342470] parent start | test = 0 [342470] parent start | test = 0 [342470] parent start | test = 0 
[342470] parent end

少しでも役に立たなければ

$ uname -a
Linux Aspire 5.4.0-26-generic #30-Ubuntu SMP Mon Apr 20 16:58:30 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

ベストアンサー1

printfテキストが作成されました。標準出力.bufferを呼び出して、最終的にフォークの各ブランチに書き込まれますexit

おすすめ記事