Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
linux套接字:sendmsg的辅助数据的生存期_Linux_Sockets - Fatal编程技术网

linux套接字:sendmsg的辅助数据的生存期

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_

我使用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_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
手册页面的部分:

…写入操作正在进行时,不得更改控制块。操作期间不得访问正在写入的缓冲区,否则可能会出现未定义的结果。涉及的内存区域必须保持有效

总结:查看手册页面上的系统调用。但是大多数时候,你不需要担心它