Perl: дождитесь выхода xdg-open, прежде чем продолжить

У меня есть Perl-скрипт, который производит PDF $pdffile во временном каталоге $tempdir и открывает его, используя xdg-open, Затем сценарий должен удалить рабочий каталог, как только пользователь закончит просмотр файла. Вот часть кода, с которой у меня возникают проблемы:

system "xdg-open $pdffile";
remove_tree($tempdir);

Мое понимание system является то, что он должен ждать, пока команда не вернется, прежде чем продолжить программу. Однако, когда я выполняю этот код, я получаю сообщение "Не удалось открыть /tmp/diff14969/diffs.pdf". Если я заменю xdg-open с okular (что является моей системой по умолчанию) в system команда, она работает так, как я хочу. (Точно так же это работает, если я жестко закодировал любой просмотрщик PDF, который живет в моей системе, но я не хочу делать это по причинам переносимости.)

Я думаю, что xdg-open запускает зрителя в новом процессе и что system команда только ждет xdg-open заканчивать. однажды xdg-open возвращает успешно, сценарий удаляет временный каталог, прежде чем зритель может открыть файл. Как я могу заставить сценарий ждать завершения реального средства просмотра?

1 ответ

xdg-open использует разные способы открытия файлов в зависимости от среды рабочего стола, которую вы используете. На самом деле он не "запускает средство просмотра", а просит (по крайней мере, в Gnome) среду рабочего стола открыть ваш файл (например, используя gio в Gnome, который в свою очередь использует dbus).

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

Решением может быть использование модуля File::Temp (входит в дистрибутив perl) и создайте временный файл / каталог с флагом UNLINK / CLEANUP, который делает его удаляемым, когда переменная, содержащая объект, выходит из области видимости (таким образом вызывая метод DESTROY). Таким образом, пока ваш скрипт выполняется (а переменная не выходит из области видимости), временный файл доступен в файловой системе.

Другие вопросы по тегам