AF_UNIXソケット:プロセス間でソケットハンドルを渡すことはできますか?
質問
私が作成したとしましょう socketpair()
そして、私はそれを渡します 扱う 産卵プロセスへのソケットの1つの(popen
)、上記のプロセスは親と通信することができますか?
私が見た例は、使用して適用されます fork()
これは私の現在のプロジェクトの範囲外です。
更新しました: 簡単なテストを試みました:
クライアント:
socketpair
ソケット付き[0クライアントの使用から
posix_spawn
ソケット付き1 コマンドライン引数としてクライアント:
write
ソケットに...クライアントは警告なしに終了します...
この方法に問題があるように思われます。
更新しました: 私もこれを見つけました ノート:
Pipes and socketpairs are limited to communication between processes with a common ancestor.
解決
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に戻します。
確かにいくつかの試用コードを書く価値があります。
他のヒント
はい、子プロセスに渡すことができます。トリックは、実際にはSocketPair()が接続されたソケットを提供することです - 子供が一方を保持し、親がもう一方を維持することを確認します(親は子供を閉じ、逆も同様です)。
ほとんどの場合、代わりにパイプのペアを使用します。