なぜ「do」の代わりに「do」が4回印刷されるのですか?Fork()linuxの問題
コード:
#include<stdio.h>
#include<unistd.h>
int main()
{
printf(" do ");
if(fork()!=0) printf(" ma ");
if(fork()==0) printf(" to \n ");
else printf("\n");
}
プログラムプリント ミリアンペア が
なぜ「do」の代わりに「do」が4回印刷されるのですか?Fork()linuxの問題
コード:
#include<stdio.h>
#include<unistd.h>
int main()
{
printf(" do ");
if(fork()!=0) printf(" ma ");
if(fork()==0) printf(" to \n ");
else printf("\n");
}
プログラムプリント ミリアンペア が
に行う にミリアンペアを行うあなたの "if" ステートメントで二回フォークを呼び出して行うのです:オン
if(fork()!=0) printf(" ma ");
if(fork()==0) printf(" to \n ");
を最初のフォーク、親Aが子Bを生成すると、親と子の両方がフォークを呼び出す 2回目。親は子Cを生成し、子は子Dを生成します。結果はA、B、C、Dの4つのプロセスです。お使いのプリントがstdoutにフラッシュされるまで、バッファリングされ、各フォークプロセスは4が印刷されている「ん」、このバッファのコピーを取得しているので
A ---- B
| |
C D
(@ilkkachu答えを確認してください)。
あなたが「やる」シングルを持ってする場合は、あなたの代わりにこれを行う必要があります。
pid_t pid = fork();
if (pid > 0){
printf(" do ");
printf(" ma ");
} else {
printf(" to \n");
}
は、基本的にはフォークのリターンを(保存)変数ではなく、あなたの「if」文で二回フォークを呼び出します。
標準出力はデフォルトでラインバッファリングされているため(またはファイルやパイプにリダイレクトすると完全バッファリングされるため)、
最初のprintf
は改行をヒットしないので、文字列do
がCライブラリの内部バッファに追加されます。最初のfork
では、そのバッファを含むプロセス全体が複製されます。 (両方プロセスは、再びだけでなく、親や子をfork
を呼び出しているので。)そして、コピーの1つは、そのバッファへma
が追加され、両方のコピーが重複している
、どちらかprintf(" to \n ")
またはprintf("\n")
と呼ばれ、生産します改行。バッファ内にあったものが実際に書き出されます。
fflush(stdout)
を使用すると、フォークする前にCライブラリでバッファリングされたデータを強制的に出力するか、setbuf(stdout, NULL)
を使用してバッファリングを完全に無効にすることができます。
編集済み、もちろんfork() – Klapi