Как вы обнаруживаете, что файл, который вы открыли, был перемещен после открытия - PullRequest
1 голос
/ 16 января 2012

Как указано в заголовке:

  • Моя программа открывает файл.
  • Что-то приходит и перемещает этот файл. Индекс должен быть таким же, но имя другое.
  • Закройте файл, затем удалите, но его больше нет

Так как я могу определить, что оно было перемещено, и удалить правильное имя файла?

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 16 января 2012

Вы можете использовать inotify , чтобы обнаружить изменение старого имени (ищите событие IN_MOVE_SELF). Но если ваша настоящая цель - просто удалить имя файла, вы можете сделать это (используя unlink (2)) сразу после открытия файла. Семантика файлов Unix позволит вам продолжать использовать открытый файл, и данные на диске фактически не будут удалены, пока ваш дескриптор не будет закрыт. И тогда никто не сможет переименовать файл.

0 голосов
/ 17 января 2012

fstat открытый файл, stat имя и сравнение результатов.

Но, как и в случае с любой другой возможной проверкой, она все еще нечеткая;имя может изменить смысл после любой проверки, которую вы проводите, но до того, как вы начнете действовать.Время пересмотреть ваши требования.

0 голосов
/ 16 января 2012

попробуйте access(2) файл перед его закрытием.Если вы получаете ENOENT, файл был перемещен.Следуйте по / proc / self / fd / $ open_file_number / symlink, чтобы найти новое имя файла, используя readlink(2).

...