Хотя ОС не будет аварийно завершать работу и файловая система не будет повреждена, вызовы write()
НЕ гарантированы как атомарные, если рассматриваемый файловый дескриптор не является каналом, а объем записываемых данных составляет PIPE_MAX
байта или меньше. Соответствующая часть стандарт :
Попытка записи в канал или FIFO имеет несколько основных характеристик:
- Атомный / неатомарный: запись является атомарной, если все количество, записанное в одной операции, не чередуется с данными из любого другого процесса. Это полезно, когда несколько писателей отправляют данные одному читателю. Приложения должны знать, насколько большой запрос на запись может быть выполнен атомарно. Этот максимум называется {PIPE_BUF}. Этот том стандарта IEEE Std 1003.1-2001 не говорит о том, являются ли запросы записи для более чем {PIPE_BUF} байтов атомарными, но требует, чтобы записи {PIPE_BUF} или менее байтов были атомарными.
[...]
Таким образом, в принципе, вы должны заблокировать одновременные записи, иначе ваши записанные данные могут перепутаться и выйти из строя (даже при одной записи), или у вас может быть несколько записей, перезаписывающих друг друга. Однако есть исключение - если вы передадите O_APPEND
, ваши записи будут фактически атомарными:
Если установлен флаг O_APPEND флагов состояния файла, смещение файла должно быть установлено в конец файла перед каждой записью, и между изменением смещения файла и операцией записи не должно происходить никакой промежуточной операции изменения файла.
Хотя это не обязательно атомарно в отношении не O_APPEND
записи или одновременного чтения, если все авторы используют O_APPEND
, и вы выполняете какую-то синхронизацию перед выполнением read
, у вас все должно быть в порядке.