From: Jamis Buck Date: 2004-02-10T09:32:11+09:00 Subject: Re: timeout w/o timeout.rb Ara.T.Howard wrote: >i'm writing some unit tests which do alot of io/select/etc - bad things to mix >with a thread based 'timeout' method... i've been using this instead: > > # a timeout method which does not fail when io blocks > trap 'SIGALRM', 'IGNORE' > class TimeoutError < StandardError; end > def timeout n > begin > trap('SIGALRM'){throw :timeout, TimeoutError.new} > cid = nil > unless((cid = fork)) > sleep n > Process.kill 'SIGALRM', Process.ppid > else > thrown = > catch(:timeout) do > ret = yield > Process.kill 'SIGKILL', cid > ret > end > raise thrown if TimeoutError === thrown > end > ensure > trap 'SIGALRM', 'IGNORE' > end > end > >any massive problems with this (this impl is a mega hack i realize)? > >does it seem like some permutation of this might be useful? something like >Process#timeout perhaps?? > >-a > > Doesn't Ruby use SIGALRM internally? I could be wrong, but if it does, you may be asking for trouble by using it in your script. - Jamis -- Jamis Buck jgb3@email.byu.edu http://www.jamisbuck.org/blog/jamis.cgi ruby -h | ruby -e 'a=[];readlines.join.scan(/-(.)\[e|Kk(\S*)|le.l(..)e|#!(\S*)/) {|r| a << r.compact.first };puts "\n>#{a.join(%q/ /)}<\n\n"'