Как проверить, что файл все еще пишется? - PullRequest
10 голосов
/ 22 апреля 2011

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

Ответы [ 4 ]

5 голосов
/ 22 апреля 2011

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

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

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

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

3 голосов
/ 16 августа 2011

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

1 голос
/ 16 августа 2011

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

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

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

0 голосов
/ 16 августа 2011

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

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

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

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

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