Не прерывается ли сон при получении какого-либо сигнала в perl? - PullRequest
5 голосов
/ 31 октября 2010

У меня есть простой демон 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

Проблема возникает, когда я посылаю процессу USR1 сигнал, используя kill -USR1 xxxxx. Выход не то, что я ожидаю:

Sat Oct 30 21:08:25 2010 doing it 1
Sat Oct 30 21:08:25 2010 doing it 0

Я получаю две непрерывные записи, одну из подпрограммы обработки сигналов и другую из постоянно работающего цикла. Кажется, что сон прерывается всякий раз, когда принимается сигнал USR1.

Что происходит?

1 Ответ

8 голосов
/ 31 октября 2010

Сон прерывается в том смысле, что ваша программа будет обрабатывать входящий сигнал, но цикл будет продолжаться (возвращаться в спящий режим) до получения сигнала TERM.Это задокументированное поведение для функции sleep () :

Может быть прервано, если процесс получает сигнал, такой как "SIGALRM".

Обратите внимание, что если вам нужно поспать 30 секунд, даже если он прерван сигналом, вы можете определить количество спящих секунд, а затем снова поспать для остатка:

while (1)
{
    my $actual = sleep(30);
    sleep(30 - $actual) if $actual < 30;
}

PS.Вы можете прочитать больше об обработке сигналов в perldoc perlipc и практически в любой книге по программированию для Unix W.Ричард Стивенс .:)

...