Атомная запись в дескриптор файла - PullRequest
0 голосов
/ 27 января 2019

Я читаю о pipe(7) с в Linux и натолкнулся на следующее:

POSIX.1 говорит, что write(2) с меньше PIPE_BUF байты должны быть атомарными: выходные данные записываются в канал как непрерывная последовательность.Запись более чем PIPE_BUF байтов может быть неатомной: ядро ​​может чередовать данные с данными, записанными другими процессами.POSIX.1 требует, чтобы PIPE_BUF был не менее 512 байтов.(В Linux PIPE_BUF составляет 4096 байт.)

Это не совсем понятно.Требует ли POSIX, чтобы все записи, меньшие PIPE_BUF, были атомарными?Или это верно для труб, созданных только с pipe(int[2], int)?

1 Ответ

0 голосов
/ 27 января 2019

Указанное поведение является специфическим для трубы (но применяется ко всем каналам, независимо от того, как они были созданы (например, pipe, mkfifo + open и т. Д.)).

Из POSIX-описание write:

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

  • [...]

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

...