【问题标题】:using unix domain socket and sharing fd's使用 unix 域套接字并共享 fd
【发布时间】:2010-11-10 17:04:10
【问题描述】:

当我在 ubuntu 上尝试这个测试应用程序时,无法弄清楚为什么 recvmsg() 会阻塞。

http://web.mit.edu/kolya/misc/break-chroot.c

谢谢

【问题讨论】:

  • 您能否将示例缩减到最低限度以重现,例如,将 fd 传递给 /dev/null 的父母和孩子? (顺便说一句,我之前没有看到 fd 传递一个 NULL msg_iov - 也许您可能会发送一个字节以及辅助数据?)

标签: c unix ubuntu operating-system ipc


【解决方案1】:

我强烈记得文件描述符仅通过 Unix 数据报套接字传递,而不是 Unix 流套接字。这也可能需要重新发送。您的示例太大(而且我太懒了)无法进行适当的分析,但请查看 here 以获取替代示例代码。我自己在 FreeBSD 和 Linux 上都使用过这个例子,它可以工作。

【讨论】:

  • 谢谢,您引用的代码在我的环境中也可以正常工作。但问题是当我设置 msg.msg_iovlen=0 和 msg.msg_iov=NULL 时,它在 ubuntu 上不起作用(我不确定其他风格的 linux/unix 的行为)。 recvmsg() 不返回并在等待 msg 时被阻塞。我在帖子中提到的示例设置 msg.msg_iov=NULL。
  • 示例代码说明您需要发送至少一个字节的“真实”数据才能传递您的消息。
  • SOCK_STREAM unix 套接字也可以工作,根据我自己的经验,也许更可信:) Stevens 的 UNIX 网络编程
  • 我的立场是正确的,然后:) 看来你的回答一直都是正确的。
  • 但我不明白你为什么推荐 SOCK_DGRAM 而不是 SOCK_STREAM,因为我也可以通过 SOCK_STREAM 发送 fd。何时使用 SOCK_DGRAM 而不是 SOCK_STREAM 有什么好的理由吗?或者这只是程序员确认级别的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 2014-02-20
  • 1970-01-01
  • 2010-11-02
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多