【发布时间】:2016-11-20 18:22:24
【问题描述】:
我正在编写一个程序,该程序使用sendmsg 和recvmsg 通过域套接字在两个进程之间传递文件描述符。为了发送文件描述符,msghdr.msg_iov 和msghdr.msg_iolen 中包含附加数据。但是,我被告知类似于正常的read 和write 系统调用,sendmsg 和recvmsg 也有部分读/写问题。在这种情况下,辅助字段中的数据是否会为每个部分数据自动复制?我问这个是因为我的实现需要非阻塞机制。让我用下面的例子来详细说明一下
发送者:发送msghdr数据,其中包含一个fd在辅助字段和K字节在msg_iov
接收方:(1) 部分读取,K1 字节 (2) 部分读取,K-K1 字节
现在和上面的例子一样,当所有数据到达时,我实际上应该处理步骤(2)之后的数据。在这种情况下,我还能从辅助字段中正确提取fd 吗?还是只出现在第一次部分阅读中?
【问题讨论】:
-
您将通过其返回值发送
sendmsg()指示的尽可能多的字节,并通过其返回值接收recvmsg()指示的尽可能多的字节。在这两种情况下,您都必须循环以确保完整的传输和接收。 -
在两个不同进程之间发送文件描述符不起作用。文件描述符对于进程来说是本地的,就像指针一样。
-
@KlasLindbäck 在两个不同进程之间发送文件描述符不起作用。文件描述符是进程本地的,就像指针一样。 That is not correct. 可以使用 Unix 域套接字在进程之间发送文件描述符。根据Linux man page:UNIX 域套接字支持使用辅助数据将文件描述符或进程凭据传递给其他进程。
-
感谢@AndrewHenle 指出这一点。
-
Unix & Linux 也有类似的问题:unix.stackexchange.com/questions/185011/…
标签: c sockets unix-socket