2017-02-07 7 views
0

C/C++では、dup2(...、STDERR_FILENO)[1]経由でサブプロセスからstdoutを読み込みます。私は本当にdup2が何をしているのか理解していません。同じ時間に実行されている2つのサブプロセスに対して2回実行できますか?私はSTDERRを読み終えることができない既存の実装に関する問題を見ています。実装バグか、それが不可能かどうかは疑問です。2つのサブプロセスのstdoutをリダイレクトできますか?

編集:別のスレッドによって開始されます。開始および停止は、いかなる方法でもインターリーブすることができる。

[1] like Linux 3.0: Executing child process with piped stdin/stdout

答えて

3

ファイル記述子を、カーネルが管理するファイルオブジェクトへの参照カウント/スマート間接ポインタと考えてください。 dupdup2,dup3)は、カーネルが管理するファイルオブジェクトのrefcountをインクリメントすることによって、スマート "ポインタ"を複製します。 closeはrefcountをデクリメントし、refcountが0になると、カーネルが保持するファイルオブジェクトを破棄します。

これらのファイルオブジェクトはプロセスfork S(forkもファイルオブジェクトの参照カウントが足さ継承ファイル記述子により指し示さ(したがってUNIX介してファイルディスクリプタを送信しインクリメントするとき通常起こるれ、複数のプロセスで共有することができますソケット))。あなたはfork INGによって複製さpipeファイルディスクリプタを扱う際に、パイプの読み出し側だけEOFを取得するため

は(心の中でこのモデルを維持することは、特に重要であるとき参照FDを持っているすべてのプロセスでの書き込み終了のすべて(その書き込み終了まで)閉鎖されました。)

+0

したがって、両方のプロセスが同じファイル記述子に書き込みますか?親がどのようなプロセスからデータが得られるのかを教えてください。 –

+1

@JohandeVriesの場合、子プロセスのIDを表示しない限り、どのプロセスがそれを書き込んでいるかを知る方法はありません。 –

+0

フォローアップの質問:http://stackoverflow.com/questions/42117551/race-condition-in-starting-up-sub-processes-causes-reading-from-pipe-to-hang –

関連する問題