我有以下問題,我已在這兩個迷你Perl腳本中重新構建。 這是主要的腳本:在關閉文件句柄時向Perl腳本發送信號
#!/usr/bin/perl
$SIG{INT} = \&signal_handler_one;
open(my $pipe, "|-", "/home/pa/Desktop/POC2");
close $pipe;
sub signal_handler_one{
print "This is expected to print\n";
}
在第三行它會打開一個管道,這個腳本:
#!/usr/bin/perl
$SIG{INT} = \&signal_handler_two;
sleep(10);
sub signal_handler_two{
print "This isn't expected to print\n";
}
的問題是,當我開始了第一個腳本,然後發送SIGINT給它,而它正在關閉第4行的管道,signal_handler_two被觸發而不是signal_handler_one。爲什麼它的行爲如此?有沒有辦法解決這個問題(我的目標是讓signal_handler_one執行)。
編輯: 我最初使用Ctrl + C在終端上發送信號,導致打印出「This is not expected to print」。但是當我使用kill從另一個終端向父進程發送信號時,它只是忽略它。
編輯2: 我終於解決它不使用開放拿到管,而是由人工分叉,execing然後等待孩子而不是僅僅調用接近 。現在一切似乎都很好。看起來這種行爲是特定於我的環境的,但如果任何人都能重現同樣的錯誤,請告訴我。
所以第二個腳本是'POC2'?你如何發送信號?你怎麼知道它是在第一個腳本關閉管道的時候? – Borodin
我通過終端上的Ctrl + C發送它。關閉呼叫阻塞,直到第二個過程終止,因此我有10秒的時間窗口讓我在正確的時間發送Ctrl + C。是的,POC2是第二個劇本。 – Void
我想你會發現Ctrl-C將信號發送到最近激活的進程。你可以更具選擇性地讓第一個程序用'print'$$ \ n「'來報告PID,然後在命令行上用'kill -s INT 1234'報告,用實際的PID替換'1234' – Borodin