68user's page 掲示板

Prev< No. 889〜890> Next  [最新発言に戻る] [過去ログ一覧]
No. 889 # 68user 2000/05/29 (月) 05:19:17
fork するなら、子プロセスで
    $SIG{ALRM} = \&timed_out;
    sub timed_out {
        die 'TIMED OUT';
    }
    alarm(10);
    while (<SOCKET>){
        print $_;
    }
    alarm(0);
などとすればいいでしょう。また、die したくなければ
    $SIG{ALRM} = \&timed_out;
    sub timed_out {
        die 'TIMED OUT';
    }
    eval {
        alarm(10);
        $buf=<SOCKET>;
        alarm(0);
    }
    if ( $@ =~ /TIMED OUT/ ){
        タイムアウトになった
    }
と eval で囲めばよいです。

4引数 select を使う方法もありますが、gethostbyname や
connect で時間がかかると対応できません。
# connect はノンブロッキング IO を使う方法がある。

並行して gethostbyname するにはどうしたらいいのかなぁ?

No. 890 # yuji 2000/05/29 (月) 13:49:39
すばやいお返事とサンプルコード、
ありがとうございます。
$SIG{ALRM}とevalを用いることで、
うまくできました。(^^)
DNSサーバーエラーなどで、
connectで時間がかかる場合があるということで、
connectと<SOCKET>の部分をalarmで
囲むカタチで利用させていただきました。
connectの部分については、
最初にIO::SocketのTimeoutを指定してみたのですが、
うまくいきませんでしたので。(^^;
$SIG{ALRM}=\&timed_out;の\は大切なのですね。
意味合いについて、調べてみたいと思います。
今後とも、よろしくお願いします。(^^)

Prev< No. 889〜890> Next  [最新発言に戻る] [過去ログ一覧]