Для perl-base 1:5.8.9-alt3 не срабатывает alarm из Time::HiRes Testsuit: #!/usr/bin/perl -w use Time::HiRes qw(alarm ualarm); $SIG{ALRM} = sub {die "alarm"}; alarm(1); #ualarm(1000000); while(1) { sleep 1; } В случае ualarm скрипт отрабатывает как ожидается. strace -ffv -o log2 ./1.pl 32020 rt_sigprocmask(SIG_BLOCK, [ALRM], [], 8) = 0 32020 rt_sigaction(SIGALRM, {0x7f54f1b426a0, [], SA_RESTORER, 0x7f54f17b1070}, {SIG_DFL, [], 0}, 8) = 0 32020 --- SIGALRM (Alarm clock) @ 0 (0) --- В случае alarm сигнал не приходит: 32032 rt_sigprocmask(SIG_BLOCK, [ALRM], [], 8) = 0 32032 rt_sigaction(SIGALRM, {0x7f9651b986a0, [], SA_RESTORER, 0x7f9651807070}, {SIG_DFL, [], 0}, 8) = 0 32031 +++ killed by SIGINT +++ (CTRL-C) сообщения что сигнал ALRM принят нету. На http://perldoc.perl.org/functions/alarm.html указано что не следует мешать alarm + sleep: It is usually a mistake to intermix alarm and sleep calls. (sleep may be internally implemented in your system with alarm). Тут мы как раз мы это и делаем. Но по утверждению тестовый скрипт не срабатывает на ветках 5.0/Sisyphus. На 4.X срабатывает как ожидается.
#!/usr/bin/perl -w use Time::HiRes qw(alarm ualarm); $SIG{ALRM} = sub {die "alarm"}; alarm(1); #ualarm(1000000); my ($i,$j); for ($i=0; $i<100000000; $i++) { $j+=$i^2; } Подтверждает что где-то ошибка, т.е. sleep в этом тестике роли не играет.
> strace -e setitimer perl -MTime::HiRes=ualarm -e 'ualarm 2; sleep 4' setitimer(ITIMER_REAL, {it_interval={0, 0}, it_value={0, 2}}, {it_interval={0, 0}, it_value={0, 0}}) = 0 --- SIGALRM (Alarm clock) @ 0 (0) --- +++ killed by SIGALRM +++ zsh: alarm strace -e setitimer perl -MTime::HiRes=ualarm -e 'ualarm 2; sleep 4' в случае alarm тишина: > strace -e setitimer perl -MTime::HiRes=alarm -e 'alarm 2; sleep 4' >
ping ping Что с этой ошибкой ?
Почитав полиси, предложил nmu усталый майнтейнер.
$ rpmquery perl-base perl-base-5.12.2-alt00 $ strace -e setitimer perl -MTime::HiRes=alarm -e 'alarm 2; sleep 4' setitimer(ITIMER_REAL, {it_interval={0, 0}, it_value={2, 0}}, NULL) = 0 --- SIGALRM (Alarm clock) @ 0 (0) --- +++ killed by SIGALRM +++