簡體   English   中英

在perl中收到任何信號時,睡眠會中斷嗎?

[英]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 xxxxxUSR1信號發送到進程時出現問題。 輸出不是我所期望的:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM