我可以通过0mq(zeromq)ipc套接字传递文件描述符吗?

时间:2013-03-27 20:10:50

标签: zeromq file-descriptor unix-socket

我有一个主流程和几个工作人员,使用0mq' ipc://'套接字(UNIX域套接字)。我想将文件描述符从主服务器传递给一个worker,同时传递一条消息。我知道' raw' UNIX域套接字可用于将文件描述符从一个进程传递到另一个进程,但是我可以使用我的zeromq套接字吗?

我不在乎可移植性,坦率地说,我不在乎它是否是一个有点脏的解决方案。有什么办法吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

Hackiest方法是添加一个套接字选项来将文件描述符绑定到套接字,然后替换send()& recv() sendmsg()recvmsg()每个必需的CMSG结构传递描述符。

作为一个全局选项,每个消息都将使用描述符进行标记,因此您应该在有效负载中添加合适的元数据,以指示接收方应采用附带的描述符。

e.g。发送侧

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

e.g。 recv side

int incoming_fd;
size_t fd_len = sizeof (incoming_fd);
zmq_getsockopt (s, ZMQ_ANCILLIARYFD, &incoming_fd, &fd_len);

答案 1 :(得分:0)

我非常肯定答案是否定的。文件描述符是一个整数,意味着在进程的上下文中调用open()。在另一个过程的背景下,它是没有意义的。通过任何方法将该整数传递给另一个进程并不意味着该目标进程可以在对read()的调用中使用它。

文件描述符,类型为FILE *的指针,类似的东西都引用几乎总是被视为不透明的对象。这种不透明意味着你无法复制它并期望它能够正常工作,这实际上就是你通过管道,套接字,0mq等发送它所做的事情。

在一个过程中,可以复制引用(例如,由另一个线程使用)。

目标进程当然可以为自己打开文件;它需要的只是文件名。