はい、できません。 istreamはファイルの終わりを検出できるので、奇妙なostreamはクローズしていないようです。cerrを閉じるには
私の状況です:このプロセスでは、Posix fd2のすべての出力をパイプで作成し、パイプ出力をfd2にdup2することでキャプチャしています。次に、スレッドは関連するCストリームを使用してパイプの読み込み終了を読み取ります(そして、関連する別のCストリームを介して元のfd2にタイムスタンプを付けて各行を書きます)。
すべての子が死んでいるとき、私はcerrに終了メッセージを書きます。それを元のエラーファイルにエコーしているスレッドがパイプを閉じて終了するように、私はそれを閉じる必要があります。
stderrとfd2の両方をクローズしていても、スレッドはeof()を検出していません。
私は単純なものを使ってメインプログラムを複製し、C++のiostreamsの代わりにCストリームを使用していますが、すべてがstderrをfclosingするだけでうまくいきます(単純化されたテストでは子プロセスはありません)。
編集:hmm ..チャンネル2にdup2'ingした後、元のパイプfdを閉じる必要がありますか?私はそれをしなかったので、根底にあるパイプには依然として開いたfdが付いています。ああ..それは答えです!
あなたはLinuxでstdioストリームを終了し、ウィンドウ上で '^ Z'を終了すると思います。 –
' ostream'のすべてがファイルベースではありません(例えば 'std :: ostringstream'など)ので、あなたは 'ostream'上にインタフェースのようなファイルを持っていないということです。 –
あなたは正しいですが、その後、近くにあるものにリダイレクトされても、cerrを閉じることができないという奇妙なことがあります。しかし、私は基礎となるCストリームとファイル記述子を閉じています。パイプのもう一方の端の読み込みはfdopenされたCストリームを使用しています。 – Yttrill