-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 に答える