-1

我想做以下事情 -

#starting code

sleep(1000);

#remaining code

起始代码将运行并卡在“睡眠”状态。一段时间后(<<1000),其他一些进程会通过打破这个睡眠(可能通过发送信号)来唤醒这个进程,然后程序的其余部分将运行。

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

4

2 回答 2

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 上运行良好。

于 2012-05-17T19:11:52.360 回答
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);
}
于 2012-05-17T19:39:38.657 回答