質問

私はわからない程度だパイプについていくつかの基本的な質問があります。

)、パイプへのプロセスの書き込みが、それはパイプを閉じない(すなわち。SIGKILL SIGINT)殺された場合の標準的な動作は何ですか?それは、パイプをフラッシュしていますか?または動作が定義されていない?

b)は、通常の処理に戻る場合は標準的な動作は何ですか?それはパイプをフラッシュし、パイプをクローズすることが保証されて? (明示的に、もちろんそうすることなしに)。

私は、できるだけ一般的のようにこれらの答えをしたいと思いますが、それはOSの仕様に完全に依存している場合、実際に私はそれを受け入れることができます!しかし、POSIX標準または現在がある場合は、私が知っていることは非常に感謝される、Windowsの動作を定義します。

感謝します。

役に立ちましたか?

解決

  

。パイプへのプロセスの書き込みが、それはパイプを閉じない(すなわち。SIGKILL SIGINT)殺された場合の標準的な動作とは何ですか?それは、パイプをフラッシュしていますか?または動作が定義されていない?

プロセスダイス、死んだ -

SIGKILLは、任意のクリーンアップを可能にすることはありません。 SIGINTと、それはプロセスがシグナルを処理するかどうかに依存します。もしそうなら、それは標準I / Oファイルハンドルをフラッシュし、出口を経由して、出口(2)、に思われます。質問は - )(標準出力またはpopenのを介して接続された配管でしたか?もしそうなら、優れた緩衝化データは、のフラッシュされます。ない場合はフラッシュは重要ではないので、何のバッファされたデータはありません。

収集する読者のために準備ができてパイプ内の未読データ、パイプ内のデータのままである場合 - 読者が存在すると仮定

  

B。プロセスが正常に返された場合の標準的な動作とは何ですか?それはパイプをフラッシュし、パイプをクローズすることが保証されて? (明示的に、もちろんそうすることなしに)。

これは、パイプは、標準I / Oかを介して接続されたかどうかに依存します。ない場合は、保留中のものはありません。その場合は、[はい、バッファ内の任意の材料は、標準I / Oストリームが閉じられるようにフラッシュされます。

<時間>
  

C。信号や未読データ上の情報のおかげで、私は、標準I / O配管接続について混乱少しです。 )あなたが(はpopen言及した後、私はそれを見て、manページには、I / Oストリームとストリームと同じで、その戻り値は、デフォルトで完全にバッファリングされていると言います。私はちょうど2つの違いを明確にないんだけども差はどこから来るのか私は理解してます。

パイプを作成するための基本的なシステムコールがpipe(2)です。これは、2つのファイルディスクリプタ、パイプの読み取り最後に1つ、書き込み終了のための1つを作成します。あなたは彼らと何もしない場合、それらは、(書き込み(2経由)および関連するシステムコール)バッファなしの出力で、ファイルディスクリプタとして残ります。プロセスが終了した場合、アプリケーションにはバッファリングはありません。パイプがクローズされます。

あなたはpopen(3)を使用している場合、それはあなたのために全体の多くの作業を行います。それはまだ、パイプを作成するpipe(2)を呼び出しますが、それは、その後fork(2)を行います。子供はパイプや起動子プロセスの正しい構成を配置します。親はまた、パイプの未使用の端を閉じ、用途は使用に呼び出したプロセスの標準I / Oファイルストリームを作成するfdopen(3)ます。

I / Oバッファにデータがある場合は、ファイルストリームでは、[閉じるまたは同等の未処理データがフラッシュされると、ファイルディスクリプタがクローズされていることを確認します。

他のヒント

は、通常の動作では、ときに、プロセスを終了するすべてのファイル記述子がクローズされていることです。この手段パイプは、他の開いているファイル記述子のように、通常は閉じている。

パイプについて一つ興味深いのは、しかし:プロセスが閉じられたパイプに書き込みを行う場合はPOSIXに、作家が信号を取得する、SIGPIPE。


編集:

警告:S SIGx終了と正常終了の違いはそれである、任意の他のファイルの書き込みのように、あなたは(ファイル書き込みを経由して)バッファリングされ、まだファイル記述子に書き込まれていないされたデータを失うかもしれ
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top