2012-03-30 29 views
6

私は、2つの子と親の間の通信のためにパイプを作成するシナリオを持っています。親は(書き込み関数を使用して)データをパイプに書き込み、それぞれのファイル記述子を閉じます。問題は、パイプにデータを再度書きたいとき、書き込み関数がエラーコード-1を返すときです。私はそれが前の反復で終わっているので、そのと思う。次に、対応するファイル記述子が一度閉じられた後でそれを開く方法。閉じたファイル記述子を再オープンする方法

私はいくつかのファイルのパスを引数として必要とするopen()関数を使用しようとしました。しかし、私は自分のアプリケーションでファイルを使用していません。私は単純なファイル記述子を持っています(int arr [2])。

パイプで上記のシナリオを達成できますか?

答えて

10

パイプが閉じられると、パイプは閉じます。それを元に戻すことはできません。

もっと書きたい場合は、まずそれを閉じないでください。これは簡単です。

+3

として知られているstdoutとstderrです。したがって、子プロセスでは、入力を継続して待機します。しかし、私はストリームに限られた回数だけ書き込み、パイプのもう一方の端で並行して読み込みたいと思います。 – chaitu

+0

@chaitu:書き込み終了を閉じないと、読み込み終了にファイルの終わりが表示されない。これは、子供にもっとメッセージを送る場合には、メッセージの終わりを示すためにファイルの終わり以外のものを使う必要があることを意味します(通常、固定長のメッセージを使用して、それです)。 – caf

1

unix上のファイル(パイプも何らかの種類のファイルです)に関することを知っていれば、ファイル名はファイルを開くときにのみ使用されます。後でファイルが開くまで、それは閉じられるまで永久に利用可能であり、名前は再び使用されることはありません。誰かが開いている間に別のウィンドウ内のファイルを削除すると、ファイルではなく名前だけが消えてしまいます。これが意味:

  1. ファイルがディスク上に残っている
  2. それは何の名前まだそれが閉じている
  3. は、カーネルが、これは多分に役立ちます知って永遠に

それを削除開いている

  • を持っていませんファイル、パイプなどを再び "開く"ことがほぼ不可能である理由を理解することができます。ファイル名とディスクリプタの寿命は異なります。

    唯一の例外は、我々はファイルディスクリプタをクローズいけない場合、それはそれぞれのストリームにEOFを送信しません、その記述は常に1と2

  • 関連する問題