создание атомарных файлов в Linux? - PullRequest
2 голосов
/ 06 марта 2011

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

Я прочитал о флаге O_EXCL в open(), так что, похоже, решение существует, у меня естьоднако несколько вопросов:

  1. У вас есть опыт работы с этой техникой?Насколько это хорошо?(Я полагаю, у меня не может быть атомарности на уровне БД, но достаточно хорошо ... ну, достаточно)
  2. следует ли мне немедленно закрыть файл после open(), чтобы он считался созданным, изатем снова откройте его для записи?
  3. Есть ли какие-нибудь тонкости, о которых нужно знать?

Ответы [ 2 ]

5 голосов
/ 06 марта 2011

Страница man open () сообщает, что ваш метод может не работать в NFS.

Из раздела на O_EXCL:

При использовании с O_CREAT, еслифайл уже существует, это ошибка и open () завершится ошибкой.В этом контексте символическая ссылка существует независимо от того, куда она указывает.O_EXCL не работает в файловых системах NFS;программы, которые используют его для выполнения задач блокировки, будут содержать условие состязания.

И оно предлагает более общее решение:

Решение для выполнения атомарной блокировки файлов с использованиемlockfile - это создание уникального файла в той же файловой системе (например, включение имени хоста и pid), используйте ссылку (2), чтобы создать ссылку на файл блокировки.Если link () возвращает 0, блокировка успешна.В противном случае используйте stat (2) для уникального файла, чтобы проверить, увеличилось ли количество ссылок до 2. В этом случае блокировка также будет успешной.

См. Раздел «Использование файлов в качестве блокировок» в эта веб-страница для более подробной информации о различных проблемах и подходах.

1 голос
/ 06 марта 2011

POSIX говорит:

Если установлены O_CREAT и O_EXCL, open () завершится ошибкой, если файл существует.Проверка на наличие файла и создание файла, если он не существует, должны быть атомарными по отношению к другим потокам, выполняющим open () с именем того же имени файла в том же каталоге с установленными O_EXCL и O_CREAT.

Таким образом, другие процессы, использующие O_EXCL, будут считать его открытым, как только он будет создан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...