web-dev-qa-db-ja.com

異なるプロセス間でファイル記述子を渡すポータブルな方法

ほとんどのUNIXシステムでは、プロセス間で開いているファイルを渡すことは、fork()によって子/親プロセスに対して簡単に実行できます。ただし、子がすでにフォークされた「後」のfdを共有する必要があります。

私はいくつかの webpages sendmsg()が任意のプロセスで機能する可能性があることを教えてくれました。しかし、それは非常にOSに依存し、複雑に思えます。 portlisten は私が見つけることができる最良の例のようですが、kqueue、pool、...のすべての魔法を隠すlibeventのような優れたラッパーライブラリを好みます。

これを行うためのライブラリ(およびポータブルな方法)があるかどうか誰かが知っていますか?

24
Francis

最善の策は、Unixドメインソケットを介してファイル記述子を送信してみることです。これはStephensやウェブ上のいくつかの場所で説明されていますが、うまく質問すればコードを掘り下げることができます。

これは最近かなりポータブルになります。昔は「ポータブルではない」と考えられていたもの(mmap!など)の多くは、現在非常に一般的です。 「最近のほとんどのシステム」よりも移植性が必要な場合は、興味深い問題がたくさんありますが、現在行っていることや作業しているプラ​​ットフォームについて詳しく教えてください(おそらく非UnixPOSIXプラットフォーム?)私たちは助けることができるかもしれません。

17
cjs

sendmsg()システムコールを使用して、プロセス間でファイル記述子(もちろんメモリマップできないソケットなど)を転送するためのUnixドメインソケットベースのメカニズムがあります。

詳細については、 Stevens (Curt Sampsonが言及)、および Wikipedia を参照してください。

Linuxソケットによるファイル記述子の送信 で、作業コードに関するはるかに最近の質問を見つけることができます。

11