2016-12-06 6 views
0

N個の引数をとり、最初の子プロセスから最後のプロセスに送信するプログラムを作成しました。 2番目の子は、受け取った値に20%を追加し、3番目の子は30%を追加します。

問題は、最初の子が常に最初の引数のみを送信することです。私はバグを見つけることができない。誰かが私にこの問題を解決するのを手助けできますかここでは出力の例です:4つの子プロセス間のパイプ通信は初めてのみ動作します

./prodajnaVerigaAnon 200 100 50 
312 312 312 

それは次のようになります。312 156 78
ここでは、コードは次のとおりです。

for(int i=1;i<argc;i++) { 
    char init_price[size]; 
    const int len = sprintf(init_price,"%d",atoi(argv[i])); 
    write(fd1[1], init_price, (size_t) len + 1); 
} 
close(fd1[1]); 
_exit(0); 

EDIT:それがあったので、私は、コードの大部分を削除しました学校の割り当て。

答えて

0

問題が

write(fd1[1], init_price, (size_t) len + 1); 

書き込み機能は、パイプFD1を通じて200を送信する、[1]が、何の読者は、パイプがフラッシュアウトする機会がなかった理由です、入手できなかった、まだ200がパイプ内に存在しています。 あなたのパイプはより多くの入力を得ることができません。

read(fd1[0], readbuffer, sizeof(readbuffer)); 

利用可能な、それだけで200パイプにはこれだけその値を読み取る見出します。

変更を確認してスリープ状態にしたい場合は、他のデータも読み取ることができます。なぜなら、睡眠はコンテキストスイッチに役立つからです。読者のプロセスは、パイプでリッスンできるようになります。

for(i=1;i<argc;i++) 
{ 
    char init_price[size]; 
    const int len = sprintf(init_price,"%d",atoi(argv[i])); 
    write(fd1[1], init_price, (size_t) len + 1); 
    sleep(2); 
} 
close(fd1[1]); 
_exit(0); 
0

パイプはデータストリームです。読み込み回数は必ずしも書き込み回数と同じではありません。

この場合、最初の子はパイプへの3回の書き込みを行い、2回目の子は1回の読み取りで3つの値すべてを読み取ります。 readの戻り値をチェックして、読み取られたバイト数を確認していません。

readを呼び出した後、戻り値をチェックして、読み取ったバイト数を確認します。次に、atoiの代わりにstrtolを使用して値を変換します。前者では、ポインタを渡すことができます。returnは、変換が停止したバッファ内の場所を示します。バッファが使い尽くされるまでそこから読み取ってから、readに再度連絡してください。

関連する問題