簡體   English   中英

Linux套接字:sendmsg的輔助數據的生存期

[英]linux socket: lifetime of ancillary data for sendmsg

我使用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 );
}

離開函數后,“ buf”會自動銷毀,但是sendmsg是否需要此緩沖區才能生存更長的時間? 我是否保證函數返回返回的字節數后就不需要此緩沖區。

除特定接口外,通常情況下,操作系統調用在完成后並不依賴用戶空間來維護影響其操作的數據結構。 例外情況將在手冊頁中闡明。

特別是使用sendmsg ,您可以依靠該調用立即完成-無論成功與否。 因此,可以在執行操作時使用動態分配的緩沖區,並在調用后立即銷毀它。

作為一個例外的示例, aio_write(2)專門用於允許用戶空間將將異步完成的寫操作排隊。 對於此調用,在成功寫入數據之前,不會消耗數據。 因此,在確認完成之前,您不得修改呼叫中提供的數據結構。 該警告在手冊頁的“ NOTES部分中提到:

...在寫操作進行期間,不得更改控制塊。 在操作期間不得訪問正在寫出的緩沖區,否則可能會導致不確定的結果。 涉及的存儲區域必須保持有效。

總結:檢查系統調用的手冊頁。 但是大多數時候,您無需擔心。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM