2013-03-27 93 views
2

我有一個主進程和幾個worker,使用0mq'ipc://'sockets(UNIX域套接字)進行通信。我想將一個文件描述符從一個主文件傳遞給一個工作者,同時還有一條消息。我知道'原始的'UNIX域套接字可用於將文件描述符從一個進程傳遞到另一個進程,但是我可以使用我的zeromq套接字來完成嗎?我可以通過0mq(zeromq)ipc套接字傳遞文件描述符嗎?

我不在乎可移植性,坦率地說,我不在乎它是否有點骯髒的解決方案。有什麼辦法嗎?

在此先感謝。

回答

0

我很確定答案是否定的。文件描述符是一個整數,意味着在進程的上下文中調用open()的東西。在另一個過程的背景下,這是沒有意義的。通過任何方法將該整數傳遞給另一個進程並不意味着該目標進程可以在調用read()時使用它。

文件描述符,FILE *類型的指針,類似的東西都是引用幾乎總是被認爲是不透明的對象。這種不透明意味着你不能複製它並期望它工作,這實際上是你通過管道,插座,0mq等發送它所要做的。

在一個過程中,參考可以被複制(並被另一個線程使用)。

目標進程當然可以打開自己的文件;它所需要的只是文件名。

+3

不,您可以將文件描述符傳遞給其他程序,它是用於(例如)Web服務器的常用技術。見http://en.wikipedia.org/wiki/Unix_domain_socket,http://www.normalesup.org/~george/comp/libancillary/。如果(例如)它沒有打開該文件的權限或文件描述符指向套接字,則目的地也不能打開文件描述符。我的主進程實際上已經從另一個進程接收文件描述符,我只需要將它們傳遞給worker(超過0mq)。 – DaedalusFall 2013-03-27 22:18:38

+0

我每天都在學點東西!對無用的答案抱歉。 – bazza 2013-03-28 06:59:42

+0

掛上,http://en.wikipedia.org/wiki/File_descriptor提示文件描述符引用內核數據結構,在這種情況下,我可以看到爲什麼共享它會起作用。但是http://pubs.opengroup.org/onlinepubs/9699919799/沒有提到這一點。這並不意味着以這種方式共享fd不是明確的可移植的嗎? – bazza 2013-03-28 07:12:21

1

Hackiest方法是添加一個套接字選項綁定一個文件描述符到插座,則更換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); 
+1

即您必須更改zmq源代碼,因爲zmq目前不能執行此操作。 – nos 2013-03-28 00:58:11

+0

PS我沒有在我的原始問題中說我使用python綁定,所以@ nos的評論非常貼切,並且可能會使任何修改變得尷尬 - 我寧可不構建用pip輕鬆安裝的東西。感謝Steve的信息,我會看看我看到的。 – DaedalusFall 2013-03-28 02:59:53

相關問題