linux套接字:sendmsg的辅助数据的生存期
我使用cmsg在linux套接字tx上激活时间戳linux套接字:sendmsg的辅助数据的生存期,linux,sockets,Linux,Sockets,我使用cmsg在linux套接字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_
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 );
}
ssize\t sendWithOptions
(国际标准差,标准::矢量和有效载荷,uint32_t目的地,国际标志)
{
msghdr msg{};
..//填充标准
std::阵列buf;
msg.msg_control=buf.data();
msg.msg_controlen=buf.size();
自动cmsg{cmsg_FIRSTHDR(&msg)};
cmsg->cmsg\U电平=SOL\U插座;
cmsg->cmsg\u type=SO\u时间戳;
cmsg->cmsg_len=buf.size();
*(重新解释强制转换(CMSG数据(CMSG))=静态强制转换(标志);
返回sendmsg(sd和msg,msg_DONTWAIT);
}
离开函数,“buf”会自动销毁,但sendmsg是否需要此缓冲区以延长寿命?
我是否可以保证函数返回发送的字节数后不需要此缓冲区。除了特定的接口外,通常情况下,操作系统调用不依赖用户空间来维护影响其操作的数据结构。例外情况将在e手册页 特别是使用
sendmsg
,您可以依靠调用立即完成—无论成功与否。因此,您可以在执行过程中使用动态分配的缓冲区,并在调用后立即销毁它
作为一个例外的例子,aio_write(2)
专门用于允许用户空间对将异步完成的写入操作进行排队。对于此调用,只有在成功写入数据后才会使用数据。因此,在确认完成之前,您不得修改调用中提供的数据结构。注释中会给出该警告S
手册页面的部分:
…写入操作正在进行时,不得更改控制块。操作期间不得访问正在写入的缓冲区,否则可能会出现未定义的结果。涉及的内存区域必须保持有效
总结:查看手册页面上的系统调用。但是大多数时候,你不需要担心它