我想做以下事情 -
#starting code
sleep(1000);
#remaining code
起始代码将运行并卡在“睡眠”状态。一段时间后(<<1000),其他一些进程会通过打破这个睡眠(可能通过发送信号)来唤醒这个进程,然后程序的其余部分将运行。
我必须在 Windows上使用 perl 5.6.1 ,它不支持警报。我尝试了一些信号,如 SIGINT、SIGFPE 等,但失败了。请提出一些替代方案。
我想做以下事情 -
#starting code
sleep(1000);
#remaining code
起始代码将运行并卡在“睡眠”状态。一段时间后(<<1000),其他一些进程会通过打破这个睡眠(可能通过发送信号)来唤醒这个进程,然后程序的其余部分将运行。
我必须在 Windows上使用 perl 5.6.1 ,它不支持警报。我尝试了一些信号,如 SIGINT、SIGFPE 等,但失败了。请提出一些替代方案。
你在使用信号处理程序吗?如果没有,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 上运行良好。
好吧,如果我想效仿
$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);
}