Как программно определить, является ли системный вызов "write" атомарным для определенного файла?

В некоторых случаях кодер не может полагаться на то, что системные вызовы являются атомарными, например, если файл находится в файловой системе NFS. (см. обзор NFS, FAQ и документы HOWTO). Но атомарные системные вызовы в конечном счете необходимы для большинства операций с базами данных. (см. Атомность систем баз данных).

Существует ли стандартный (и независимый от ОС) способ подтверждения того, что записи (и другие системные вызовы) являются атомарными на конкретном ФАЙЛЕ в C (или на python).

Какие-либо предложения?

Последующие примечания: атомарность на трубах обсуждается в следующем:

Обратите внимание, в частности, на "man" -страницу страницы, посвященную O_APPEND:

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

1 ответ

Решение

write У вызова, как определено в POSIX, нет никакой гарантии атомарности вообще. Так что вам не нужно ничего подтверждать, это не атомарно.

Он даже не гарантирует, что данные достигнут жесткого диска (если он вообще есть), если он успешно завершится. Успешное чтение данных также не дает никаких гарантий.

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

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