Namazu-devel-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: util::systemcmd()
From: Hajime BABA <baba@xxxxxxxxxxxxxxxx>
Subject: [namazu-devel-ja] Re: util::systemcmd()
Date: Tue, 10 Sep 2002 00:31:57 +0900 (JST)
> > > リファクタリングをさらに進めてみました。かなり整理できたかとおもい
> > > ますが、どうでしょうか。
> > コーディングスタイルの問題ですが、こんなのがいいなぁ…。
> > 見るだけでなく commit してもいいでしょうか?
> はい。もちろん commit していただいてかまいません。よろしくお願いします。
> その他にも気が付いたところがあればお願いします。
さっそく直していただいてありがとうございます。ついでにうっかり間違っ
てたコメントを直しときました。
以下に、間違いのもとの実験コードをつけときます。system() に alarm
をかけて、一定時間を越えて動くプロセスを止めるというものです。
UNIXだとたぶん動くとおもいますが、Windows では ActivePerl が alarm
を実装していないために "The Unsupported function alarm function is
unimplemented" のエラーになりました。ActivePerl じゃなければどうな
るかはわかりません。
まあ、作ってはみたものの、こいつを取り込む必要性はあまりないような
気もするので、あくまで参考までということで。
--
馬場 肇 ( Hajime BABA ) E-mail: baba@xxxxxxxxxxxxxxxx
宇宙科学研究所 宇宙科学企画情報解析センター
--
--- util.pl Tue Sep 10 01:07:23 2002
+++ util.pl.alarm Tue Sep 10 01:30:25 2002
@@ -277,13 +277,28 @@
STDOUT->fdopen($fh_out->fileno(), 'w') or cdie "Can't open fh_out: $!";
STDERR->fdopen($fh_err->fileno(), 'w') or cdie "Can't open fh_err: $!";
- # Use an indirect object: see Perl Cookbook Recipe 16.2 in detail.
- $status = system { $args[0] } @args;
+ # Set an alarm: see Perl Cookbook Recipe 16.21 in detail.
+ eval {
+ local $SIG{ALRM} = sub { die "timeout" };
+ alarm(60);
+ # Use an indirect object: see Perl Cookbook Recipe 16.2 in detail.
+ $status = system { $args[0] } @args;
+ alarm(0);
+ };
STDOUT->fdopen($saveout->fileno(), 'w') or cdie "Can't restore saveout: $!";
STDERR->fdopen($saveerr->fileno(), 'w') or cdie "Can't restore saveerr: $!";
}
+ if ($@) { # $EVAL_ERROR
+ if ($@ =~ /timeout/) {
+ dprint(_("Timeout: ") . join(' ', @args));
+ warn "Timeout: @args\n";
+ } else {
+ alarm(0);
+ }
+ }
+
# Note that the file position of filehandles must be rewinded.
$fh_out->seek(0, SEEK_SET) or cdie "seek: $!";
$fh_err->seek(0, SEEK_SET) or cdie "seek: $!";