2016-11-23 24 views
-1

私はlinux \ unix osを使用しています。私がコードの下で走ったとき、私は2つの出力を得ています。下記:同じコードに対して2つの出力を得る

A)12345- b)の1-2-3-4-5-

誰がなぜ、どのように上記の2つの出力が来ている私が知っていることはできますか?

int main() 
{ 
int i, n, pfds[2]; 
char c, buf[80]; 

pipe(pfds); 
if (fork() == 0) 
{ 
    for (c='1'; c<='5'; c++) 
    write(pfds[1], &c, 1); 
} 
else 
{ 
    close(pfds[1]); 
    while ((n = read(pfds[0], buf, sizeof(buf))) > 0) 
    { 
    write(1, buf, n); 
    write(1, "-", 1); 
    } 
} 
return 0; 
} 

答えて

0

Linuxはパイプへの書き込みをバッファし、ある時点でバッファをフラッシュし、読み込みフォークはすべてを1回で読み込みます。書き込み後にfflush()を実行することでこれを変更できるはずです。

+0

fflushは、使用しないstdioバッファ(fwriteなど)にのみ影響します。 – 12431234123412341234123

0

なぜ文字の配列を使用して1つの文字だけを印刷していますか?文字を出力するためにstdioバッファを使用しないでください。

あなたの宣言フォームchar buf [80]をbufに変更しました。

while ((n = read(pfds[0], &buf, 1)) > 0) 
{ 
write(1, &buf, n); 
write(1, "-", 1); 
} 
0

パイプはストリームです。それは、あなたが他の人から同じ順序で送られたすべての文字を片端で取得することを意味します。しかし、パケットは保存されません。一度に文字の上に処理(および1-2-3-4-5-を取得)したい場合は、レース条件が場合

while ((n = read(pfds[0], buf, 1)) > 0) 
{ 
write(1, buf, n); 
write(1, "-", 1); 
} 

を1回の読み取りが一度にすべてまたは1文字を取得することができ、または

...の間でeverythinあなたは、全体のすべてを処理するprefere(と 12345-を取得):これ以上左または数をヒットがある利用できるまでのよう

あなたが読んで呼び出す
int tot = 0 
while ((n = read(pfds[0], buf+tot, sizeof(buf)-tot)) > 0) tot += n; /* gather everything */ 
write(1, buf, tot); 
write(1, "-", 1); 
0

()、関数は、非常に多くの文字を読まないでしょう。

sizeof(buf)で実行すると、1,2. 5文字が読み込まれる可能性があります。実行時に5つの文字がパイプに存在する場合は、すべての文字を読み、パイプが空でもう誰もそれに書き込まないので、次の読み取りは0を返します。

b行のようにパイプに1文字しかない場合は、1つのcharだけを読み取って " - "を出力し、子がバッファに書き込むまで待ってから読み込みます。あなたが子供が1つのチャーを書いた後に予定されていたからです。

関連する問題