Как программно определить, является ли системный вызов «write» атомарным для определенного файла? - PullRequest
4 голосов
/ 05 октября 2011

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

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

Есть предложения?

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

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

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

1 Ответ

4 голосов
/ 05 октября 2011

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

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

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

...