LINUX.ORG.RU

[perl] Как победить Ctrl+C?

 


0

0

Из перлоскрипта вызываются посредством system программы типа flac и oggenc. Вполне логично, что большую часть времени выполняются именно они. При попытке остановить скрипт Ctrl+C, останавливается программа которая в этот момент вызвана скриптом, а хотелось бы чтобы останавливался весь скрипт. Что можно для этого сделать?

★★★★★
Ответ на: комментарий от anonymous

Вариант. Но у system с этим какие-то трудности. Возможно потому что у баша код возврата обратен. Получается вот такой код:

system($cmd) and die;

А возможности выполнять левую программу в рамках того же процесса нет?

KblCb ★★★★★
() автор топика

А ловить сигнал SIGINT (или как оно там) нельзя что-ли? Или в это момент его ловит исполняемая программа а не сам perl?

marsijanin ★★
()
Ответ на: комментарий от marsijanin

полагаю, что если вызов происходит через system(), то ловит именно та программа. Придётся скрипт переписывать с fork() и wait().

amoralyrr ★☆
()
Ответ на: комментарий от marsijanin

Судя по всему. Мне думается что это выглядит так: я запускаю скрипт который живёт в процессе. System порождает новый процесс, который в добавок ко всему ещё и ведёт себя как последний баш (из этого делаем вывод, что он просто порождает баш в котором и исполняется программа и возвращает то что ему вернул этот баш). Когда я нажимаю Ctrl+C, сигнал перехватывает программа, которая в этот момент работает. Я могу поставить проверку кода возврата, но как уже сказано выше у баша и у перла они строго противоположны.

KblCb ★★★★★
() автор топика
Ответ на: комментарий от KblCb

Почему противоположны? В системе это число, у баша - булеан. Просто баш по-своему отображает числа на булеаны :)

Так чем тебе не нравится system and die? Для наглядности можно system==0 and die, как раз как в примере из "perldoc -f system".

alexsaa
()
Ответ на: комментарий от alexsaa

Кажется надо запускать программу через open2 - тогда она не будет иметь никакого отношения к терминалу и ^C получит именно ваш скрипт, который его имеет.

OxiD ★★★★
()
Ответ на: комментарий от OxiD

Да, а запущенная программа умрет т.к не сможет писать в канал.

Хотя может и не умереть, думаю что в обработчике SIGINT стоит принудительно послать всем порожденным процессам что-то вроде SIGTERM.

OxiD ★★★★
()
Ответ на: комментарий от OxiD

Спасибо. Я уже победил сырость. Если убивается программа запускается функция (такой правильный die), если скрипт ловит SIGINT запускается она же.

KblCb ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.