【问题标题】:Can I pass a file descriptor over a 0mq (zeromq) ipc socket?我可以通过 0mq(zeromq)ipc 套接字传递文件描述符吗?
【发布时间】:2013-03-27 20:10:49
【问题描述】:

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

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

提前致谢。

【问题讨论】:

    标签: zeromq file-descriptor unix-socket


    【解决方案1】:

    Hackiest 方法是添加一个套接字选项以将文件描述符绑定到套接字,然后根据所需的 CMSG 结构将 send()recv() 替换为 sendmsg()recvmsg() 以传递描述符.

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

    例如发送端

    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);
    

    【讨论】:

    • 即您必须更改 zmq 源代码,因为 zmq 目前不能这样做。
    • PS 我在最初的问题中没有说我正在使用 python 绑定,所以@nos 的评论非常中肯,可能会使任何修改变得尴尬 - 我宁愿不构建可以的东西' t 很容易用 pip 安装。感谢史蒂夫提供的信息,我会看看我所看到的。
    【解决方案2】:

    我很确定答案是否定的。文件描述符是一个整数,它在调用 open() 的进程的上下文中表示某些东西。在另一个过程的上下文中,它是没有意义的。通过任何方法将该整数传递给另一个进程并不意味着该目标进程可以在调用 read() 时使用它。

    文件描述符,FILE* 类型的指针,任何类似的东西都在引用几乎总是被认为是不透明的对象。它的不透明性意味着你不能复制它并期望它工作,这实际上是你试图通过管道、套接字、0mq 等发送它来做的事情。

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

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

    【讨论】:

    • 不,您可以将文件描述符传递给其他程序,这是(例如)Web 服务器的常用技术。请参阅en.wikipedia.org/wiki/Unix_domain_socketnormalesup.org/~george/comp/libancillary。如果(例如)它没有打开该文件的权限,或者如果文件描述符指向套接字,则目标也无法为自己打开文件描述符。我的主进程实际上已经从另一个进程接收文件描述符,我只需要将它们传递给工作人员(超过 0mq)。
    • 我每天都学到一些东西!为无用的答案道歉。
    • 等一下,en.wikipedia.org/wiki/File_descriptor 暗示文件描述符引用了内核数据结构,在这种情况下我可以看到为什么共享它会起作用。然而pubs.opengroup.org/onlinepubs/9699919799 没有提到这一点。这是否意味着以这种方式共享 fd 不是明确可移植的?
    猜你喜欢
    • 2019-04-17
    • 1970-01-01
    • 2015-03-16
    • 2010-10-05
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2011-12-08
    • 2012-11-02
    相关资源
    最近更新 更多