我在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操作期間無法處理信號。 –