1

を作成し、ソケットの1つのハンドルを生成されたプロセス( )socketpair()に渡すと、そのプロセスは親と通信できるようになりますか?popen

私が見た例はfork()、私の現在のプロジェクトの範囲外であるを使用して適用されています。

更新:簡単なテストを試しました:

  1. クライアント:socketpairソケット付き[0]

  2. コマンドライン引数としてposix_spawnソケット1を使用したクライアントの使用から

  3. クライアント:writeソケットへ...クライアントは警告なしに終了します...

この方法には問題があるように思われます。

更新: 私もこのメモを見つけました:

Pipes and socketpairs are limited to communication between processes with a common ancestor.

4

2 に答える 2

2

execveのマニュアルページには次のように記載されています。

 File descriptors open in the calling process image remain open in the new
 process image, except for those for which the close-on-exec flag is set
 (see close(2) and fcntl(2)).  Descriptors that remain open are unaffected
 by execve().

popenのような関数はexecveに基づいているので、socketpair関数から取得したファイル記述子は両方のプロセスで適切であるはずです。また、どのような方法でも記述子を渡せない理由がわかりません。この場合、文字列に変換し、STDINを介してサブプロセスに設定すると、ファイル記述子として使用するintに変換されます。

のためにいくつかのトライアルコードを書くことは確かに価値があるでしょう。

于 2009-11-05T20:24:39.710 に答える
0

はい、子プロセスに渡すことができます。秘訣は、socketpair()が接続されたソケットのペアを提供することです。子が一方を保持し、親がもう一方を保持することを確認してください(親は子を閉じる必要があり、その逆も同様です)。

ただし、ほとんどの場合、代わりにパイプのペアを使用します。

于 2009-11-06T13:25:06.923 に答える