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

В Perl, как мне проверить, открыт ли файл другой программой Perl? Мне нужно сделать первую программу до того, как вторая программа может запуститься.

Ответы [ 8 ]

12 голосов
/ 30 октября 2009

альтернативный текст http://musicritics.com/wp/wp-content/uploads/2009/05/20061129morbo.gif

НЕ РАБОТАЮТ ФАЙЛЫ!

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

5 голосов
/ 30 октября 2009

Доступно ли flock () в вашей системе? В противном случае эти две программы должны быть синхронизированы, они могут обмениваться данными через канал или сокет или через наличие / отсутствие файла.

Другим направлением, если вы работаете в Unix-подобной системе, можно использовать lsof output.

Я предполагаю, что запуск первой программы во второй невозможен.

5 голосов
/ 30 октября 2009

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

4 голосов
/ 30 октября 2009

Если вы работаете в Windows, вы можете позвонить CreateFile напрямую с dwShareMode из 0.

Согласно MSDN :

Запрещает другим процессам открывать файл или устройство, если они запрашивают удаление, чтение или запись.

Win32API :: File предоставляет доступ к этому вызову.

4 голосов
/ 30 октября 2009

По моему опыту, flock отлично работает на локальных системах как в Windows, так и в Linux.

Возможно, вы также можете иметь первую программу exec вторую программу, когда она завершит обработку файла.

0 голосов
/ 06 декабря 2011

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

0 голосов
/ 31 октября 2009

Если вы работаете в Unix, вы также можете позвонить fuser .

0 голосов
/ 30 октября 2009

Чтобы определить, открыт ли файл или используется, если вы работаете в Unix, для команды lsof есть обертка для просмотра списка открытых файлов: Unix::Lsof

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