gpt4 book ai didi

Linux 套接字 : lifetime of ancillary data for sendmsg

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:47 25 4
gpt4 key购买 nike

我使用 cmsg 在 linux socket tx 上激活时间戳。

ssize_t sendWithOptions
(int sd, std::vector<uint8_t> &payload, uint32_t destIP, int flags)
{
msghdr msg { };
.... // filling standard
std::array<uint8_t, CMSG_LEN(sizeof(__u32))> buf;
msg.msg_control = buf.data();
msg.msg_controlen = buf.size();

auto cmsg { CMSG_FIRSTHDR ( &msg ) };
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SO_TIMESTAMPING;
cmsg->cmsg_len = buf.size();

*(reinterpret_cast<__u32>(CMSG_DATA (cmsg)) = static_cast<__u32>(flags);
return sendmsg ( sd, &msg, MSG_DONTWAIT );
}

离开函数,“buf”被自动销毁,但是sendmsg需要这个缓冲区活得更久吗?我是否可以保证该函数在返回发送的字节数后不需要此缓冲区。

最佳答案

除特定接口(interface)外,一般情况下操作系统调用完成后不依赖于用户空间来维护影响其运行的数据结构。异常(exception)情况将在手册页中详细说明。

尤其是 sendmsg,您可以依赖调用立即完成 - 无论成功与否。因此,您可以在执行操作时使用动态分配的缓冲区,并在调用后立即销毁它。

作为一个异常的示例,aio_write(2) 专门用于允许用户空间对将异步完成的写入操作进行排队。对于此调用,数据在成功写入之前不会被消耗。因此,在确认调用完成之前,您不得修改调用中提供的数据结构。在手册页的 NOTES 部分提到了这个警告:

... The control block must not be changed while the write operation is in progress. The buffer area being written out must not be accessed during the operation or undefined results may occur. The memory areas involved must remain valid.

总结:查看系统调用的手册页。但大多数时候,您无需担心。

关于Linux 套接字 : lifetime of ancillary data for sendmsg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52316159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com