Как проверить, сохраняется ли файл? Мне нужно дождаться, когда файл будет создан, написан и снова закрыт другим процессом, поэтому я могу продолжить и открыть его снова в моем процессе.
Как проверить, сохраняется ли файл?
Ответ 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
.
Однако, если поведение другого приложения, выполняющего запись файла, больше похоже на открытие, запись, закрытие, открытие, запись, закрытие.... тогда вам понадобится другой механизм определения, когда другое приложение имеет действительно закончен с файлом.