[[Ruby]]
以下は、ためしに作ったモジュールね。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