我在Windows上使用Strawberry Perl。我有一些GUI.pl应用程序运行script.pl其中运行some.exe。 perl脚本作为GUI应用程序和some.exe之间的STDIN/OUT/ERR的代理。 问题是我无法杀掉链式GUI.pl中的some.exe进程 - > script.pl - > some.exe。Perl信号处理程序和WIndows
GUI.pl发送任期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;
}
这种解释是错误的。 Windows信号不使用递延信号记录的延期过程。 – ikegami
我在这个解释中发现我在IO操作期间无法处理信号。 –