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 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.