| Summary: | Не отрабатывает alarm из Time::HiRes | ||
|---|---|---|---|
| Product: | Sisyphus | Reporter: | Andriy Stepanov (stanv) <stanv> |
| Component: | perl-base | Assignee: | viy <viy> |
| Status: | CLOSED FIXED | QA Contact: | qa-sisyphus |
| Severity: | major | ||
| Priority: | P3 | CC: | at, crux, ldv, mike, php-coder, rider, viy |
| Version: | unstable | ||
| Hardware: | all | ||
| OS: | Linux | ||
#!/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 +++
|
Для 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 срабатывает как ожидается.