Блокировка файлов в Linux беспорядочная. Существует несколько различных методов, но все они рекомендательные блокировки, что означает, что другие процессы могут игнорировать блокировку, просто не проверяя ее. Вы не можете предотвратить запись в файл другим процессом, если процесс не проверяет блокировку.
Я укажу на существование flock () но это все еще только рекомендательный характер и плохо работает с удаленными файловыми системами.
Проблема в том, что есть три отдельных понятия, которые действуют независимо в Linux:
- Данные файла - фактические данные «на диске».
- Имена файлов - эти - это просто дескрипторы в структуре каталогов, обеспечивающие доступ для открытия файла.
- Файловые дескрипторы / описания файлов - обрабатывает собственную ссылку на данные файла после того, как файл был открыт.
Два процессы могут иметь описание файла в одном и том же файле (оба открывают его одновременно). Если файл переименован, это повлияет только на будущие вызовы open () ; переименование и даже удаление файла удаляет только старое имя файла. На самом деле открытый файл можно удалить, и данные останутся на диске до тех пор, пока описание открытого файла не будет закрыто.
Если вы контролируете все программы, записывающие в файл, то один из распространенных способов заблокировать его - создать файл блокировки с и O_CREAT, и O_EXCL . Ie: чтобы заблокировать my_file.txt
, вы создаете .my_file.txt.lock
. Если файл блокировки уже существует, это не удастся. Но для этого по-прежнему требуется другой процесс для первой проверки.
Это часто считается наиболее эффективным доступным типом блокировки.
Ваше решение о переименовании сначала будет ненамного лучше. Если другой процесс откроет файл до того, как ваш переименовал его, другой процесс продолжит запись в файл и никогда не узнает другого.