[Perl]



タイムアウトの処理にはALRMシグナルを使用します。以下の例ではWHOISサーバにWHOIS情報の取得にいきます。サーバへのコネクションのタイムアウトはdieで強制終了しますが、実際にはサーバとのコネクションよりも、データを受け取るまでにタイムアウトが起きるようです。そのため、一定時間内にデータを受信できなかった場合、サーバに接続し直し、再度情報を取得するようにしています。



!/usr/bin/perl
my $whois_result;
while(!$whois_result){
   ($whois_result) = &GET_WHOIS('ksknet.net', 'whois.nsiregistry.com:43');
}

sub GET_WHOIS{
my($domain) = shift;
my($whois_server) = shift;


use IO::Socket;
my ($socket, @result);
print "Get whois info for $domain\n";
print "Connecting to $whois_server\n";
print $scoket = IO::Socket::INET->new(PeerAddr => "$whois_server",
Timeout=>3) || die $!;
print "\tConntected\n" if($socket);


eval {
local $SIG{ALRM} = sub { die "timeout\n" };
alarm (5); #タイムアウトまでの時間


###タイムアウトまでに行う処理###
print $socket "$domain\n";
@result = <$socket>;
###タイムアウトまでに行う処理###


alarm (0);
};


alarm(0); #eval{}の外で0にするのを忘れずに。


$socket->close() || die $@;


#タイムアウト時の処理
if ($@ =~ /timeout/){
   print "Timeout occured while recieving data! Retrying...\n";
   return();
}


return($result);
}



広告
初めてのPerl 初めてのPerl
¥ 3,780 / 売り上げランク: 10349 / 379 ページ

いわゆるリャマ本として知られる定番書

初めてのとあるが初心者向きではないと思う。
よくできてはいるが、、。

新版Perl言語プログラミングレッスン入門編 新版Perl言語プログラミングレッスン入門編
¥ 2,835 / 売り上げランク: 15202 / 512 ページ

非常に分かりやすい。
今までにも様々な参考書に目を通してきていたが、その中でもこの本かなり読みやすく、丁寧に書かれていた。
初心者には特にお勧め。
初心者以外の方でも軽く目を通す価値はあると思う。

Code Reading―オープンソースから学ぶソフトウェア開発技法 Code Reading―オープンソースから学ぶソフトウェア開発技法
¥ 5,460 / 売り上げランク: 22828 / 523 ページ

CodeCompleteとCodeReadingを併せて読むとよいと、
組込み系のSESSAMEプロジェクトのメーリングリストと、
OS系のTOPPERSプロジェクトのメーリングリストで推薦を受けました。

CodeCompleteは読んだことがあったので、CodeReadingを読んでいます。

オープンソースを仕事にしているので、たいへん役立っています。

MISRA-Cは研修で取り上げてきたので、本書も研修の資料としても取り上げるように準備中です。