所以我已经阅读了很多关于 unix-stream 辅助数据的信息,但是所有文档中缺少的一件事是当部分读取时应该发生什么?
假设我将以下消息接收到一个 24 字节的缓冲区中
msg1 [20 byes] (no ancillary data)
msg2 [7 bytes] (2 file descriptors)
msg3 [7 bytes] (1 file descriptor)
msg4 [10 bytes] (no ancillary data)
msg5 [7 bytes] (5 file descriptors)
Run Code Online (Sandbox Code Playgroud)
第一次调用 recvmsg,我得到了 msg1 的全部(和 msg2 的一部分?操作系统会这样做吗?)如果我得到了 msg2 的一部分,我是否立即得到了辅助数据,并需要保存它以备下次读取当我知道消息实际上告诉我如何处理数据时?如果我从 msg1 中释放 20 个字节,然后再次调用 recvmsg,它会同时传送 msg3 和 msg4 吗?来自 msg3 和 msg4 的辅助数据是否连接在控制消息结构中?
虽然我可以编写测试程序来通过实验找出这一点,但我正在寻找有关辅助数据在流上下文中如何表现的文档。我在上面找不到任何官方信息,这似乎很奇怪。
我将在这里添加我的实验结果,这是我从这个测试程序中得到的:
https://github.com/nrdvana/daemonproxy/blob/master/src/ancillary_test.c
只要在调用 recvmsg 期间不需要传递先前的辅助有效载荷,Linux 就会将部分辅助承载消息附加到其他消息的末尾。一旦一个消息的辅助数据被传送,它将返回一个简短的读取而不是开始下一个辅助数据消息。所以,在上面的例子中,我得到的读数是:
recv1: [24 bytes] (msg1 + partial msg2 with msg2's 2 file descriptors) …
Run Code Online (Sandbox Code Playgroud) unix-sockets ×1