突然在perl中打破'睡眠'

时间:2012-05-17 19:01:02

标签: windows perl multiprocessing signals sleep

我想做以下事情 -

#starting code

sleep(1000);

#remaining code

启动代码会运行并停留在“睡眠”状态。在一段时间之后(<< 1000),一些其他过程将通过打破此睡眠(可能通过发送信号)来唤醒该过程,并且程序的其余部分将运行。

我必须在Windows 上使用perl 5.6.1 ,它不支持警报。我尝试了一些信号,如SIGINT,SIGFPE等但失败了。请提出一些替代方案。

2 个答案:

答案 0 :(得分:2)

您使用的是信号处理程序吗?如果没有,SIGINT及其同类将终止您的计划。

my $parent_pid = $$;

# schedule interruption
if (fork() == 0) {
    sleep 5;
    kill 'INT', $parent_pid;
    exit;
}

# trivial signal handler so SIGINT doesn't terminate the program
$SIG{INT} = sub { };
my $n = sleep 1_000_000;
print "Slept for $n seconds.\n";

在Linux上,perl 5.6.2,这给出了输出:

Slept for 5 seconds

就此而言,我不知道为什么你说Perl 5.6不支持报警(除非你在Windows上可能?)再次设置信号处理程序或你的程序将终止。

$SIG{ALRM} = sub {};
alarm 5;
$n = sleep 1_000_000;
print "slept for $n seconds\n";

在我的Perl 5.6.2上运行正常。

答案 1 :(得分:1)

好吧,如果我想模仿

$SIG{ALRM} = \&handle_alarm;
alarm(5);
...
sleep(10);

我从

开始
use Time::HiRes qw( time sleep );  # Optional

my $alarm = time + 5;
...
my $timeout = $alarm - time;
if ($timeout <= 0) {
   handle_alarm();
} else {
   my $to_sleep = 10;
   $to_sleep = $timeout if $timeout < $to_sleep;
   sleep($to_sleep);
}