2

マスター プロセスと複数のワーカーがあり、0mq 'ipc://' ソケット (UNIX ドメイン ソケット) を使用して通信しています。メッセージとともに、ファイル記述子をマスターからワーカーに渡したいと考えています。「生の」UNIX ドメイン ソケットを使用して、あるプロセスから別のプロセスにファイル記述子を渡すことができることは知っていますが、自分の zeromq ソケットでそれを行うことはできますか?

私は移植性については気にしませんし、率直に言って、それが少し汚れたソリューションであっても気にしません。何か方法はありますか?

前もって感謝します。

4

2 に答える 2

1

最もハックな方法は、ソケット オプションを追加してファイル記述子をソケットにバインドし、& を必要な構造体ごとに置き換えて記述send()recv()を渡すことです。sendmsg()recvmsg()CMSG

グローバル オプションとして、すべてのメッセージが記述子でタグ付けされるため、ペイロード内に適切なメタデータを追加して、受信者が付随する記述子を取得する必要があることを示す必要があります。

例: 送信側

zmq_setsockopt (s, ZMQ_ANCILLIARYFD, &fd, sizeof (fd));

例:受信側

int incoming_fd;
size_t fd_len = sizeof (incoming_fd);
zmq_getsockopt (s, ZMQ_ANCILLIARYFD, &incoming_fd, &fd_len);
于 2013-03-27T23:54:41.950 に答える
-1

ファイル記述子は、open() を呼び出したプロセスのコンテキスト内で何かを意味する整数です。別のプロセスのコンテキストでは、意味がありません。その整数を任意のメソッドで別のプロセスに渡すことは、その宛先プロセスが read() の呼び出しでそれを使用できることを意味しません。

ファイル記述子、タイプ FILE* のポインターなどは、ほとんど常に不透明と見なされるオブジェクトを参照しています。その不透明性は、それをコピーして動作することを期待できないことを意味します。これは、パイプ、ソケット、0mq などを介して送信することで効果的に実行しようとしていることです。

プロセス内で参照をコピーできます (たとえば、別のスレッドで使用できます)。

もちろん、宛先プロセスはそれ自体でファイルを開くことができます。必要なのはファイル名だけです。

于 2013-03-27T21:43:03.257 に答える