青山です。
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>