Является ли запись в SOCK_SEQPACKET атомарной?

Я имею в виду атомарный успех или неудачу и ничего не делать.

я знаю socketpair(AF_LOCAL, SOCK_STREAM) не является атомарным, если несколько процессов / потоков вызывают write(fd, buf, len), возвращаемое значение write() может быть > 0 && < len и вызвать данные не в порядке.

Если несколько процессов / потоков write(buf, len) к sock_fd который создан socketpair(AF_LOCAL, SOCK_SEQPACKET)это атомно?

Я проверил руководство по Linux и нашел кое-что о pipe() который говорит, что если len меньше чем PIPE_BUF, write/writev атомно.

Я ничего не нашел о socketpair, Я написал тестовый код и обнаружил, что SOCK_SEQPACKET атомарно, я пишу буфер произвольной длины в fd и возвращаемое значение всегда -1 или же len,

1 ответ

Да.

Любой интерфейс, основанный на дейтаграмме (т. Е. Размер, который вы передаете write виден человеку, делающему read) должен быть атомным. Нет другого способа гарантировать это имущество.

Так SOCK_SEQPACKET, так же как SOCK_DGRAM, должен быть атомным, чтобы функционировать.

По той же самой причине, SOCK_STREAM не имеет таких атомных гарантий.

Другие вопросы по тегам