Как linux управляет одновременной записью и переименованием файлов? - PullRequest
0 голосов
/ 02 августа 2020

У меня есть две программы на C ++, одна записывает в файл, а другая переименовывает ее (чтобы заблокировать ее, но сделать так, чтобы первая также могла писать) и работает над ней. У меня вопрос, возможно ли это? Что произойдет в сценарии, когда первый пишет, а второй пытается переименовать тот же файл? Мне нужен рок solid раствор со всеми закрытыми угловыми корпусами. Маленькие базы данных кажутся слишком сложными для этой маленькой задачи. Мне нужна настойчивость, потому что могут быть неудачные запуски второй программы, и мне придется повторить попытку.

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

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

Я укажу на существование flock () но это все еще только рекомендательный характер и плохо работает с удаленными файловыми системами.

Проблема в том, что есть три отдельных понятия, которые действуют независимо в Linux:

  • Данные файла - фактические данные «на диске».
  • Имена файлов - эти - это просто дескрипторы в структуре каталогов, обеспечивающие доступ для открытия файла.
  • Файловые дескрипторы / описания файлов - обрабатывает собственную ссылку на данные файла после того, как файл был открыт.

Два процессы могут иметь описание файла в одном и том же файле (оба открывают его одновременно). Если файл переименован, это повлияет только на будущие вызовы open () ; переименование и даже удаление файла удаляет только старое имя файла. На самом деле открытый файл можно удалить, и данные останутся на диске до тех пор, пока описание открытого файла не будет закрыто.

Если вы контролируете все программы, записывающие в файл, то один из распространенных способов заблокировать его - создать файл блокировки с и O_CREAT, и O_EXCL . Ie: чтобы заблокировать my_file.txt, вы создаете .my_file.txt.lock. Если файл блокировки уже существует, это не удастся. Но для этого по-прежнему требуется другой процесс для первой проверки.

Это часто считается наиболее эффективным доступным типом блокировки.

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

0 голосов
/ 02 августа 2020

Из переименовать , мой жирный шрифт:

rename () переименовывает файл, перемещая его между каталогами, если требуется. Любые другие жесткие ссылки на файл (созданные с помощью ссылки (2)) являются незатронутый. Открытые файловые дескрипторы для oldpath также не изменяются .

...