сокет linux: время жизни вспомогательных данных для sendmsg - PullRequest
0 голосов
/ 13 сентября 2018

Я использую 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 этот буфер, чтобы жить дольше? У меня есть гарантия, что функция не нуждается в этом буфере после того, как вернула количество отправленных байтов.

1 Ответ

0 голосов
/ 13 сентября 2018

За исключением определенных интерфейсов, обычно случается, что вызовы операционной системы не полагаются на пространство пользователя, чтобы поддерживать структуры данных, влияющие на их работу после их завершения.Исключения будут изложены на страницах руководства.

В частности, sendmsg позволяет рассчитывать на немедленный вызов - независимо от того, успешен он или нет.Поэтому нормально использовать динамически распределенный буфер, как вы делаете, и уничтожить его сразу после вызова.

В качестве примера одного исключения, aio_write(2) специально предназначено для того, чтобы пользовательское пространство могло поставить в очередь операцию записи, которая будет выполняться асинхронно.Для этого вызова данные не используются до тех пор, пока они не будут успешно записаны.Следовательно, вы не должны изменять структуры данных, представленные в вызове, пока не подтвердите, что он завершен.Это предупреждение вызывается в разделе NOTES страницы справочника:

... Блок управления не должен изменяться во время выполнения операции записи.Записываемая область буфера не должна быть доступна во время операции, иначе могут возникнуть неопределенные результаты.Соответствующие области памяти должны оставаться действительными.

В итоге: проверьте страницу руководства для системного вызова.Но в большинстве случаев вам не нужно об этом беспокоиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...