Как я могу проверить, был ли файл открыт для записи в Perl? - PullRequest
0 голосов
/ 11 августа 2009

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


Более подробное описание моей проблемы:

Есть два процесса. процесс A, который является процессом-производителем, процесс B, который является процессом-потребителемw.

процесс A создаст несколько запросов для обработки B, и способ, которым он создает запрос, - это просто создание txt-файла в определенной директории. Когда А создает запрос, он не знает, жив ли Б или нет, ему нужно просто отбросить запрос, например, написать электронное письмо Б. после создания файла запроса, А никогда больше его не посетит.

prpcess B, иногда вверх и вниз. когда он запущен, B «спулин» каталог, который A drop требует. для каждого требуемого файла B просто прочитайте его и удалите.

но я думаю, что там есть какое-то состояние гонки. Например, A просто открывает файл и находится на пути к заполнению файла с запросом, а затем B хочет прочитать тот же файл и руки Это.

У меня вопрос: как мне изящно передать состояние гонки в Perl?

Ответы [ 4 ]

4 голосов
/ 11 августа 2009

Спасибо за обновление вашей проблемы. Вот как бы я это сделал:

  • Процесс A открывает временный файл и записывает в него. Вы называете файл таким образом, что процесс B игнорирует его. Вы можете сделать это, поместив его во временный каталог, используя суффикс, который B не обрабатывает, или что-то еще.
  • Когда A готово, он закрывает файл. Файл завершен, но имеет временное имя.
  • A переименовывает файл в его окончательное имя, которое B распознает как нечто, необходимое для обработки.
  • B обрабатывает файл.


Из моего предыдущего ответа, теперь объяснил в вопросе:

Это звучит как подозрительная стратегия. Предположим, например, что Процесс A открывает Файл 1 для записи и начинает работать с ним. Процесс B запускается и рассматривает обработку файла 1 тоже. Должен ли он пропустить это? Что, если процесс A закрывает файл, прежде чем процесс B сможет определить, открыт ли он? Должен ли процесс B снова обрабатывать файл 1?

Звучит так, как будто у вас есть XY Проблема , где вы даете нам то, что вы думаете о решении, но не рассказываете нам о проблеме или задаче. Чего вы пытаетесь достичь или избежать? Что-то вроде:

  • Одна и та же программа имеет много экземпляров, обрабатывающих множество файлов параллельно для одной и той же цели
  • Разные программы, работающие одновременно, должны обрабатывать одни и те же файлы для разных целей, возможно, в последовательности
  • У одной и той же программы может быть много экземпляров, но обновлять файл должен только один (т.е. два человека пытаются обновить один и тот же файл одновременно).
  • Другая ситуация

Расскажите нам, что вы делаете, и мы сможем решить вашу проблему, а не просто ответим на ваш вопрос. :)

1 голос
/ 11 августа 2009

Дополнение ответа Брайана Агнью: если вы хотите использовать lsof, проверьте Unix :: Lsof на CPAN, который предоставляет perlish интерфейс для команды.

1 голос
/ 11 августа 2009

Вы не говорите, на какой ОС вы работаете. Если Unix (или производная), посмотрите на lsof . Это скажет вам (среди прочего), какие файлы открыты, кем и т. Д.

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

0 голосов
/ 13 августа 2009

Это то, с чем должны справляться блокировки файлов, но вам, вероятно, даже не нужно получать этот низкий уровень. Если оба конца цепочки являются Perl, вы должны использовать IPC::DirQueue для управления очередью; это довольно хорошо проверено и гибко.

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