GNU/Linux >> Linux の 問題 >  >> Linux

Fork()を使用するプログラムが出力を複数回出力することがあるのはなぜですか?

プログラム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)があります。


Linux
  1. シェルコマンド置換が末尾の改行文字を飲み込むのはなぜですか?

  2. プログラムは、カラー出力を使用するかどうかをどのように決定しますか?

  3. Ls-lがLs-sとは異なるサイズを出力するのはなぜですか?

  1. Smalltalk Hello World の例:Linux OS で Smalltalk プログラムを作成して実行する方法

  2. Fortran Hello World の例:Linux OS で Fortran プログラムを作成して実行する方法

  3. XQuery Hello World の例:Linux OS で XQuery プログラムを作成して実行する方法

  1. このシェル パイプラインが終了するのはなぜですか?

  2. プログラムの出力を入力としてリダイレクトする方法

  3. フォーク爆弾でシステムをクラッシュできないのはなぜですか?