Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用unix域套接字和共享fd';s_C_Unix_Ubuntu_Operating System_Ipc - Fatal编程技术网

C 使用unix域套接字和共享fd';s

C 使用unix域套接字和共享fd';s,c,unix,ubuntu,operating-system,ipc,C,Unix,Ubuntu,Operating System,Ipc,当我在ubuntu上尝试这个测试应用程序时,我无法理解为什么recvmsg()会阻塞 谢谢我记得文件描述符只在Unix数据报套接字上传递,而不是在Unix流套接字上传递。这也可能需要重新发送。您的示例太大(我太懒),无法进行适当的分析,但请寻找其他示例代码。我自己在FreeBSD和Linux上都使用过这个例子,它很有效。你能把这个例子缩减到最小,以复制,比如说,一个父级和子级将fd传递给另一个/dev/null吗?(顺便说一句,我以前从未见过fd使用NULL msg_iov传递-也许您可以随辅

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


谢谢

我记得文件描述符只在Unix数据报套接字上传递,而不是在Unix流套接字上传递。这也可能需要重新发送。您的示例太大(我太懒),无法进行适当的分析,但请寻找其他示例代码。我自己在FreeBSD和Linux上都使用过这个例子,它很有效。

你能把这个例子缩减到最小,以复制,比如说,一个父级和子级将fd传递给另一个/dev/null吗?(顺便说一句,我以前从未见过fd使用NULL msg_iov传递-也许您可以随辅助数据一起发送一个字节?)谢谢,您引用的代码在我的环境中也可以正常工作。但问题是当我设置msg.msg_iovlen=0和msg.msg_iov=NULL时,它在ubuntu上不起作用(我不确定其他版本的linux/unix的行为)。recvmsg()不返回,并在等待消息时被阻止。我在文章中提到的示例设置msg.msg_iov=NULL。示例代码指出,您需要发送至少一个字节的“真实”数据才能传递消息。
SOCK_STREAM
unix套接字也可以工作,根据我自己的经验,或许更可信的是:),史蒂文斯的unix网络编程。我的观点是正确的,然后:)看来你的答案一直都是对的。但我不明白你为什么推荐SOCK_DGRAM而不是SOCK_STREAM,因为我也可以通过SOCK_STREAM发送fd。在SOCK_流上使用SOCK_DGRAM有什么好的理由吗?或者这只是程序员确认级别的问题