[[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

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS