1

次のことを考慮してください。

  1. 子を持つ親プロセス
  2. 子はexecシステムコールを使用して別のプログラムを実行します
  3. 双方向パイプを介して通信する親と子(残りはMAINPIPEという名前)
  4. 子はポート(例:5000)にバインドされているサーバーです

私のプログラムは次のように機能するはずです。

子供がクライアントから特定のメッセージを受信した場合は、親への別の双方向パイプを作成し、情報を送受信します。

問題は:

子にパイプを作成し(を使用pipe())、ファイル記述子を親に渡すと(MAINPIPEを使用)、パイプから読み取ろうとすると、親に「不正なファイル記述子」エラーメッセージが表示されます。

何か案が?

編集:

彼ら、

私の問題は、子プロセスで作成された新しいパイプのファイル記述子を親に渡さないことです。MAINPIPEを使用してすでにそれを行っています。

しかし、問題は次のとおりです。親は新しいパイプから読み取ることができません。このエラーメッセージ「不正なファイル記述子」が表示されます。ファイル記述子は親プロセスで閉じられているようです。

4

3 に答える 3

3

フォークする前にパイプを作成します。その後、パイプは親と子の両方で使用できます。ファイル記述子を渡す必要はありません。

以下は、 UNIX ドメイン ソケットを使用してファイル記述子を子から親に送信するライブラリへのリンクです。

http://gitorious.org/libancillary/libancillary

ここにソースがあります:

http://gitorious.org/libancillary/libancillary/trees/master

もちろん、これを要件に合わせて調整する必要があります。

于 2012-11-06T00:16:15.367 に答える
0

子プロセスから親プロセスにファイル記述子を送信する方法があります。ただし、どのようにそれを行おうとしているのかを述べていないため、なぜそれが機能しないのかはわかりません。

ファイル記述子を送信するには既存のパイプが必要なので、単一のパイプで複数の論理ストリームを多重化できることに注意してください。おそらく、より簡単で移植性があります。


編集:ファイル記述子を子から親に送信するために使用しているコードを表示することを拒否しますが、この質問には関連する議論が含まれています。似たようなことをしているか確認できますか?

于 2012-11-06T00:48:32.443 に答える
-1

ファイル記述子はプロセスに属します。あなたの場合、子プロセス。

あなたの場合は10のファイル記述子の番号を転送しても、ファイル記述子自体は転送されません。番号10を転送するだけです。番号10は、子プロセスではファイル記述子10を意味できますが、ファイル記述子はプロセスに属しているため、親プロセスでは意味がありません。子プロセスは、作成時に親からファイル記述子を継承するだけです。

子の作成後に開かれたファイル記述子は、親と子の間で共有されません。

実際のファイル記述子を別の (親などの) プロセスに渡す必要がある場合、UNIX ドメイン ソケットにはそれを行うためのメカニズムがあります。ここの他の投稿には、これに関連するリンクがいくつか含まれています。

于 2012-11-12T14:11:06.933 に答える