2015-10-19 3 views
1

Я нахожусь в Windows с клубничным perl. У меня есть приложение GUI.pl, которое запускает script.pl, которые запускают some.exe. Скрипт perl работает как прокси для STDIN/OUT/ERR между приложением GUI и some.exe. Проблема в том, что я не могу убить some.exe процесс в цепочке GUI.pl -> script.pl -> some.exe.Обработчики сигналов Perl и WIndows

GUI.pl посылает TERM в script.pl

# GUI.pl 
my $pid = open my $cmd, '-|', 'script.pl'; 
sleep 1; 
kill 'TERM', $pid; 

script.pl подхватить 'TERM' и пытается убить some.exe

# script.pl 
$SIG{TERM} = \&handler; 
my $pid = open my $cmd, '-|', 'some.exe'; 
sub handler { 
    kill 'TERM', $pid; 
} 

С эта схема, процесс some.exe продолжает выполняться. Я уже много узнал о сигналах, но до сих пор не понимаю, как решить эту проблему.

Благодарим заранее.


И одно из решений она является использование threads:

# script.pl 
use threads; 
use threads::shared; 

$SIG{BREAK} = \&handler; 

my $pid :shared; 

async { 
    $pid = open my $cmd, '-|', 'some.exe' 
}->detach; 

# 1 second for blocking opcode. After sleep handler will be applied 
sleep 1;  

sub handler { 
    kill 'TERM', $pid; 
} 

ответ

0

Я бы с осторожностью относиться к использованию сигналов «убить» на Windows, так как они ты POSIX вещь. http://perldoc.perl.org/functions/kill.html

Но я думаю, что проблема здесь возможно из-за Deferred Signals. В частности, если вы отправляете сигнал процессу, интерпретатор будет ждать, пока он «безопасен» для его обработки. В середине «some.exe» вряд ли будет.

Использование kill сигналов таким образом не является особенно хорошей формой IPC. См. perlmonks: Signals Vs. Windows для некоторого полезного обсуждения.

+0

Это объяснение неверно. Процесс отсрочки, зарегистрированный в Отложенных сигналах, не используется для сигналов Windows. – ikegami

+0

Что я нашел в этом объяснении, так это то, что я не могу обрабатывать сигнал во время операции ввода-вывода. –

0

Сигналы на окнах очень своеобразны. Возможно, вам повезло с сигналами INT или QUIT, чем TERM. Мое обширное исследование того, как обрабатываются сигналы Perl и Windows, here.

TL; DR: В Windows TERM может завершить процесс в Windows, но его невозможно обработать. INT и QUIT, и их поведение по умолчанию заключается в прекращении процесса. Если вы используете псевдопроцессы Windows (это то, что вы получаете, если вы вызываете fork в Windows), тогда все быстро усложняется.

+0

'kill TERM => $ pid' [посылает Ctrl-Break] (http://perl5.git.perl.org/perl.git/blob/3ec400f5ce53ea1a56d283bc6bf59e75762df058:/win32/win32.c#l1258), который может быть [ обрабатываются] (http://perl5.git.perl.org/perl.git/blob/3ec400f5ce53ea1a56d283bc6bf59e75762df058:/win32/win32.c#l2142). [Я не могу проверить это, потому что по какой-то причине я не могу обработать какие-либо сигналы.] – ikegami

Смежные вопросы