[英]Does sleep get interrupted when any signal is received in perl?
我有這個簡單的perl守護進程:
#!/usr/bin/perl
use strict;
use warnings;
use Proc::Daemon;
Proc::Daemon::Init;
my $continue = 1;
$SIG{TERM} = sub { $continue = 0 };
$SIG{USR1} = sub { do_process(1) };
# basic daemon
boxesd_log("started boxesd");
while ($continue) {
do_process(0);
sleep(30);
}
boxesd_log("finished boxesd");
exit(0);
# required subroutines
sub do_process {
my ($notified) = @_;
boxesd_log("doing it $notified");
}
但有些事情是行不通的。
守護程序啟動時,它會每30秒記錄一次,而不會發出預期的通知:
Sat Oct 30 21:05:47 2010 doing it 0 Sat Oct 30 21:06:17 2010 doing it 0 Sat Oct 30 21:06:47 2010 doing it 0
當我使用kill -USR1 xxxxx
將USR1
信號發送到進程時出現問題。 輸出不是我所期望的:
Sat Oct 30 21:08:25 2010 doing it 1 Sat Oct 30 21:08:25 2010 doing it 0
我得到兩個連續的條目,一個來自信號處理子程序,另一個來自永遠運行的循環。 每當收到USR1
信號時,似乎睡眠就會中斷。
到底是怎么回事?
在您的程序將處理輸入信號的意義上,睡眠中斷,但循環將繼續(返回睡眠狀態),直到收到TERM信號。 這是sleep()函數的記錄行為:
如果進程收到諸如“SIGALRM”之類的信號,則可能會中斷。
請注意,如果您需要休眠30秒,即使被信號中斷,您也可以確定睡眠的秒數,然后再次休眠:
while (1)
{
my $actual = sleep(30);
sleep(30 - $actual) if $actual < 30;
}
PS。 您可以閱讀更多關於perldoc perlipc中信號處理的信息,以及W. Richard Stevens的幾乎所有unix編程書。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.