プレイ中に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
。