我有一个主进程和几个工作人员,使用 0mq 'ipc://' 套接字(UNIX 域套接字)进行通信。我想将文件描述符从主服务器传递给工作人员,以及一条消息。我知道“原始” UNIX 域套接字可用于将文件描述符从一个进程传递到另一个进程,但我可以使用我的 zeromq 套接字吗?
我不关心可移植性,坦率地说,我不关心它是否是一个有点脏的解决方案。有什么办法吗?
提前致谢。
我有一个主进程和几个工作人员,使用 0mq 'ipc://' 套接字(UNIX 域套接字)进行通信。我想将文件描述符从主服务器传递给工作人员,以及一条消息。我知道“原始” UNIX 域套接字可用于将文件描述符从一个进程传递到另一个进程,但我可以使用我的 zeromq 套接字吗?
我不关心可移植性,坦率地说,我不关心它是否是一个有点脏的解决方案。有什么办法吗?
提前致谢。
Hackiest 方法是添加一个套接字选项以将文件描述符绑定到套接字,然后将 & 替换为send()
所需recv()
的结构,以传递描述符。sendmsg()
recvmsg()
CMSG
作为一个全局选项,每条消息都将使用描述符进行标记,因此您应该在有效负载中添加合适的元数据,以指示接收者应该采用随附的描述符。
例如发送端
zmq_setsockopt (s, ZMQ_ANCILLIARYFD, &fd, sizeof (fd));
例如recv端
int incoming_fd;
size_t fd_len = sizeof (incoming_fd);
zmq_getsockopt (s, ZMQ_ANCILLIARYFD, &incoming_fd, &fd_len);
我很确定答案是否定的。文件描述符是一个整数,它在调用 open() 的进程的上下文中表示某些东西。在另一个过程的上下文中,它是没有意义的。通过任何方法将该整数传递给另一个进程并不意味着该目标进程可以在调用 read() 时使用它。
文件描述符,FILE* 类型的指针,任何类似的东西都在引用几乎总是被认为是不透明的对象。它的不透明性意味着你不能复制它并期望它工作,这实际上是你试图通过管道、套接字、0mq 等发送它来做的事情。
在一个进程中,引用可以被复制(例如,由另一个线程使用)。
目标进程当然可以自己打开文件;它所需要的只是文件名。