プログラム1のHello world
一度だけ印刷されますが、\n
を削除すると それを実行すると(プログラム2)、出力は8回印刷されます。 \n
の重要性を誰かに説明してもらえますか こことそれがfork()
にどのように影響するか ?
プログラム1
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("hello world...\n");
fork();
fork();
fork();
}
出力1:
hello world...
プログラム2
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("hello world...");
fork();
fork();
fork();
}
出力2:
hello world... hello world...hello world...hello world...hello world...hello world...hello world...hello world...
承認された回答:
Cライブラリのprintf()
を使用して標準出力に出力する場合 関数の場合、出力は通常バッファリングされます。改行を出力するまでバッファはフラッシュされません。fflush(stdout)
を呼び出します。 または、プログラムを終了します(_exit()
を呼び出さないでください けれど)。標準の出力ストリームは、TTYに接続されている場合、デフォルトでこのようにラインバッファリングされます。
「プログラム2」でプロセスをフォークすると、子プロセスは、フラッシュされていない出力バッファーを含む、親プロセスのすべての部分を継承します。これにより、フラッシュされていないバッファが各子プロセスに効果的にコピーされます。
プロセスが終了すると、バッファがフラッシュされます。合計8つのプロセス(元のプロセスを含む)を開始すると、フラッシュされていないバッファーは、個々のプロセスの終了時にフラッシュされます。
8 各fork()
で fork()
の前にあったプロセスの2倍の数を取得します (無条件であるため)、これらのうち3つ(2 =8)があります。