青山です。

TCPsocket.open のタイムアウト処理には何か有効な方法があるでしょうか?
Perl では、alarm というのを使っていますが、これは Ruby には無いようで、
こんな感じで書いてはみたものの、この為だけに telnet.rb で thread を使
うのも... と、外していました。

def alarm(wait_time)
  @timer.exit if @timer
  if not 0 == wait_time
    @end_time = Time.now + wait_time
    @timer = Thread.start{
               sleep(wait_time)
               Process.kill('ALRM', Process.pid)
             }
  end
  @end_time - Time.now
end

def initialize(options)
  略
  alarm(@options["Timeout"])
    trap("ALRM"){ STDERR.print("Timed out.\n"); exit }
    @sock = TCPsocket.open(@options["Host"], @options["Port"])
  alarm(0)
  略
end

しかし、つい最近 thread は require しなくても使える事を知り(組み込みク
ラスと同程度の扱いなんですね)、それならば入れようかと思っています。た
だ、alarm は他の所に入れてもらった方が良いような気もしますが、どうしま
しょうか?

あと、調べればわかりそうなのですが、ちょっと手抜きして質問。

    trap("ALRM"){ STDERR.print("Timed out.\n"); exit }

ここで、exit ではなく、return nil のような処理をしたいのですが、どのよ
うにすれば良いでしょうか?


青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>