3

私はこのコードを持っています:

#!/usr/bin/perl
use strict;
use warnings;
my ($timeout, $size, $buffer) = (10, 10, undef);
eval {
    local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
    alarm $timeout;
    my $nread = sysread STDIN, $buffer, $size;
    # !!!! race condition !!!!!
    alarm 0;
    print "$nread: $buffer";
};
if ($@) {    
    warn $@;
}

それが正しいか?8 行目と 9 行目の間に競合状態がある可能性がありますか?

4

3 に答える 3

1

を使用するとalarm、潜在的な競合状態が発生します。

通常の解決策はalarm 0;、ブロックの後に追加するevalことです。そのため、最初のブロックalarm 0が実行されない場合でも、アラームを閉じることができます。

または、CPAN のTime::Outパッケージを使用してコードをまとめることができます。その方が安全で優れています。

于 2013-07-23T09:04:51.340 に答える