Убедитесь, что файл не был изменен при попытке удалить его - PullRequest
2 голосов
/ 15 июля 2010

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

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

1 Ответ

3 голосов
/ 15 июля 2010

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

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

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

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

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