Является ли запись в 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
не имеет таких атомных гарантий.