From: jkuro@... (Jun Kuroda) Date: 1997-05-07T17:24:03+09:00 Subject: [ruby-list:2910] thread and fork 黒田です。 ruby - version 1.0-970425 (i686-linux) 上で添付するプログラ ムの実行結果が以下のようになります。 thread の時 l.24 の sleep で眠ったままになってます。 - l.62 TRUE -- thread run f run t run f run t run f run t run f run t run f run t timeout (thread) end run f run f run f run f run f run f end - -- - l.62 FALSE -- fork run f run t run f run t run f run t run f run t run f run t time out (fork) timeout (thread) end end - -- - -- class TimeOut < Exception end def timeout_thread(sec) begin x = Thread.current y = Thread.start { sleep sec x.raise TimeOut, "timeout (thread)" if x.alive? } begin yield rescue TimeOut print $!, "\nend\n" end ensure Thread.kill y if y && y.alive? end end def timeout_fork(sec) pid = fork if (pid == nil) sleep sec print "time out (fork)\n" exit else for i in 0..10 begin break if (Process.waitpid(pid, Process::WNOHANG) != 0) rescue break end print "run f\n" ret = i sleep 1 end begin Process.kill(9,pid) rescue end print "end\n" end ret end def main_f ret = timeout_fork(5) # print ret, "\n" if ret end def main_t ret = timeout_thread(5){ for i in 0..10 print "run t\n" sleep 1 end } # print ret, "\n" if ret end if TRUE #FALSE print "thread\n" f = Thread.new{ main_f } t = Thread.new{ main_t } while f.alive?||t.alive? end else print "fork\n" if fork != nil main_f else main_t end end - -- - -- 黒田 淳 (くろだ じゅん)