Как проверить, сохраняется ли файл?

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

Ответ 1

В общем, это трудная проблема. Вы можете спросить, открыт ли файл при определенных обстоятельствах; однако, если другой процесс является script, он может открыть и закрыть файл несколько раз. Я настоятельно рекомендую вам использовать консультативную блокировку или какой-либо другой явный метод для другого процесса для связи, когда это будет сделано с файлом.

Тем не менее, если это не вариант, есть другой способ. Если вы посмотрите в каталогах /proc/<pid>/fd, где <pid> - это числовой идентификатор процесса какого-либо запущенного процесса, вы увидите кучу символических ссылок на файлы, которые были открыты. Разрешения на символической ссылке отражают режим, в котором был открыт файл - разрешение на запись означает, что он был открыт для режима записи.

Итак, если вы хотите узнать, открыт ли файл, просто сканируйте каждую запись процесса /proc и каждый дескриптор файла в ней, ищите символическую ссылку для записи в ваш файл. Если вы знаете PID другого процесса, вы можете напрямую просмотреть его запись proc.

Конечно, это имеет некоторые серьезные недостатки. Во-первых, вы можете видеть только открытые файлы для ваших собственных процессов, если только вы не root. Он также относительно медленный и работает только с Linux. И снова, если другой процесс открывается и закрывает файл несколько раз, вы застряли - вы можете увидеть его в течение закрытого периода, и нет простого способа узнать, откроет ли он его снова.

Ответ 2

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

Ответ 3

@blu3bird идея использования файла-дозорника неплохая, но для этого требуется изменить программу, записывающую файл.

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

Напишите во временный файл, скажем, "foo.dat.part". Когда запись завершена, переименуйте "foo.dat.part" в "foo.dat". Таким образом, читатель либо вообще не увидит "foo.dat", либо увидит полную версию.

Ответ 4

Вы можете попробовать использовать inotify

http://en.wikipedia.org/wiki/Inotify

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

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