以下は、ためしに作ったモジュールね。10秒かかったら時間切れになって、 Process.killで止める仕様にしてあるわ。
で、止めるためのpidの取得には IO.popenのリターンを使うと。
「なんでわざわざdiffを呼んでるの」って話はナシね。あくまでサンプルだから。
require 'timeout'
class String # テキスト差分を取り出す(UTF-8) def dSabunU(b) w1 = "/tmp/w1w" w2 = "/tmp/w2w" w3 = "/tmp/w3w" FileUtils.cp(self,w1) FileUtils.cp(b,w2) w1.du_conv2 w2.du_conv2 ans = nil s = [] pid = nil begin timeout(10){ com = IO.popen("diff --strip-trailing-cr \"#{w1}\" \"#{w2}\" > \"#{w3}\"") pid = com.pid s = w3.loadfile.split(/\r\n/) if s[s.length-1] =~ /ファイル末尾に改行がありません/ s[s.length-1] = nil s.compact! end ans = s.join("") } rescue Timeout::Error => e ans = nil Process.kill('SIGINT',pid) rescue end STDOUT.sync File.unlink(w1) if File.exist?(w1) == true File.unlink(w2) if File.exist?(w2) == true File.unlink(w3) if File.exist?(w3) == true ans end end