2012-04-13 3 views
4

ほとんどすべてのpipeの例私は、未使用の書き込み/読み出し終了を終了する助言を見ました。また、男は明らかにそのことを述べていますpipe() creates a pipe, a unidirectional data channelしかし、私は両親と子供の両方のパイプの両端に読み書きを試みましたが、すべてがOKであるようです。pipe()を使用して作成されたパイプを双方向パイプとして使用できないのはなぜですか?

2つのプロセスが相互に読み書きする必要があり、なぜ1つのパイプを使用しないとしたら、2つのパイプが必要なのでしょうか?

+1

最初にpipe()を実装した人はそれを一方向にしていたため、その後の実装では標準になりました。 (一部のOSでは、pipe()は双方向ストリームを提供しますが、他のものはそうではありません)。双方向通信が必要な場合は、2本のパイプを使用するか、socketpair()を使用してください。 – nos

+0

最初にpipe()を実装した人は、流体/気体輸送のための実際のパイプに似た、単一のバッファのみをパイプに備えました。デュアルバッファの場合は、ソケットを参照してください。 –

+0

Solarisのパイプは双方向です。まったく多くの人がSolarisをもう使用しているわけではありません。しかし、他の人が明らかにしたように、移植性を望むなら、その能力を想定してはいけません。 – FatalError

答えて

8

あなたは子供がその逆の両親のメッセージから、そのメッセージを分離しない方法と同じパイプを使用している場合のみ1本のパイプと一緒に時間の任意の時点で書くことができますか?例えば

Parent writes to pipe 
Parent reads from pipe hoping to get message from child but gets its own message :(

1本のチャイルド>親のためのパイプとparent->子供のための別のパイプを使用する方がはるかに簡単です。

読み取り/書き込み用のプロトコルがあっても、親プロセスと子プロセスのデッドロックは非常に簡単です。

+0

このQAは、パイプが何であるかを紹介しているときのコンテキストでなければなりません... – n611x007

5

あなたは読み取りと作成されたパイプの両端に書くことができますが、片方向のデータは、親から子またはその逆に、いつでもで一方向に移動することを意味しています。 2つのパイプは、データの非ブロック送受信のために必要です。つまり、2つのパイプで同時に読み書きできますが、1つのパイプでは、パイプに書き込む前に読み終わらなければなりません。あなたがパイプを読む前に。素人用語で、あなただけの読み取りまたは

+0

ありがとう!私はここに新しい、書式設定についてわかりません –

関連する問題