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: $!";