Похоже, что ваш код, который спит, прерывается каким-то кодом, который устанавливает будильник.Это сделано так, что вы видите ожидаемое поведение.Другими словами, тревога * всегда должна прерывать спящий вызов.
Если вы ищете чистый perl способ спать без прерывания будильника, вы можете сделать это, установив собственный обработчик сигнала тревоги.Таким образом, когда ваш код получит сигнал тревоги, он не прервет вашу обработку.
Тем не менее, важным предупреждением является то, что это задержит любой сигнал тревоги, который был установлен другим кодом.Другой код получит сигнал тревоги поздно;после того, как ваш код завершен.Это означает, что если вы хотите хорошо играть с другими, вам лучше использовать одно из других решений.
Вот пример:
#!/usr/bin/perl
use POSIX;
use strict;
use warnings;
# set an alarm
print "Setting alarm\n";
alarm 1;
my $old_alarm;
my $snoozed;
{
# store the previous alarm handler (if any)
$old_alarm = $SIG{ALRM};
# override the alarm handler so that we don't
# get interrupted
local $SIG{ALRM} = sub {
print "got alarm; snoozing\n";
# record the fact that we caught an alarm so that
# we can propagate it when we're done
$snoozed++;
};
# sleep for a while.
for (1 .. 3) {
print "z" x $_ ,"\n";
sleep 1;
}
}
# replace the old sleep handler;
$SIG{ALRM} = $old_alarm
if $old_alarm;
# if we had to snooze fire an immediate alarm;
if ($snoozed) {
POSIX::raise(POSIX::SIGALRM);
}
Документация, на которую вы ссылаетесьнамекает, но не описывает другой симптом.Главное, о чем нужно беспокоиться, когда сон спит с помощью тревоги, - сброс настроек тревоги, когда кто-то вызывает сон.
* По-видимому, есть некоторые версии Perl (например, старый Win32), где тревога не срабатывает.прервать сон.