2017-05-09 5 views
0

なぜ「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"); 
} 

プログラムプリント ミリアンペア が

+0

編集済み、もちろんfork() – Klapi

答えて

2

に行う にミリアンペアを行うあなたの "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」文で二回フォークを呼び出します。

1

標準出力はデフォルトでラインバッファリングされているため(またはファイルやパイプにリダイレクトすると完全バッファリングされるため)、

最初のprintfは改行をヒットしないので、文字列doがCライブラリの内部バッファに追加されます。最初のforkでは、そのバッファを含むプロセス全体が複製されます。 (両方プロセスは、再びだけでなく、親や子をforkを呼び出しているので。)そして、コピーの1つは、そのバッファへmaが追加され、両方のコピーが重複している

最後に

、どちらかprintf(" to \n ")またはprintf("\n")と呼ばれ、生産します改行。バッファ内にあったものが実際に書き出されます。

fflush(stdout)を使用すると、フォークする前にCライブラリでバッファリングされたデータを強制的に出力するか、setbuf(stdout, NULL)を使用してバッファリングを完全に無効にすることができます。

関連する問題