我想做以下事情 -
#starting code
sleep(1000);
#remaining code
启动代码会运行并停留在“睡眠”状态。在一段时间之后(<< 1000),一些其他过程将通过打破此睡眠(可能通过发送信号)来唤醒该过程,并且程序的其余部分将运行。
我必须在Windows 上使用perl 5.6.1 ,它不支持警报。我尝试了一些信号,如SIGINT,SIGFPE等但失败了。请提出一些替代方案。
答案 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);
}