Убедитесь, что файл не изменился при попытке его удаления

В среде POSIX я хочу удалить файл с диска, но перед удалением вычислить его контрольную сумму, чтобы убедиться, что он не был изменен. Достаточно ли блокировки? Должен ли я открыть его, отключить, вычислить контрольную сумму, а затем закрыть (чтобы ОС могла удалить свой индекс)? Есть ли способ убедиться, что ни один другой процесс не имеет дескриптора открытого файла в файле?

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


person Alex Morega    schedule 15.07.2010    source источник


Ответы (1)


Ваше предложение open,unlink,checksum,close не будет работать как есть, потому что вы застрянете, если контрольная сумма не совпадает (нет переносимого POSIX способа создания ссылки на файл, заданный дескриптором файла ). Лучшим вариантом является rename,checksum,unlink,close, который позволяет отменить переименование или повторить копию, если контрольная сумма не совпадает. Вам все равно нужно подумать о том, что вы хотите сделать, если третья программа тем временем воссоздала файл.

POSIX предлагает только совместные блокировки. Если у вас есть контроль над программами, которые могут изменить файл, убедитесь, что они используют блокировки; если это не вариант, вы застряли без замков.

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

Вам может быть полезно посмотреть, что делают другие программы синхронизации, такие как rsync и unison.

person Gilles 'SO- stop being evil'    schedule 15.07.2010