ファイルの排他機能を実装

http://www3.pf-x.net/~spider-man/cgi-bin/hiki/hiki.cgi?gss

ファイルの排他に失敗したら0.5[s]おきに3回までリトライするようにした。

def lock_file(file)
  # 排他可否フラグ
  lock = false
  3.times {
    if file.flock(File::LOCK_EX|File::LOCK_NB)
      lock = true
      break
    end
    # 0.5[s] sleepする
    sleep 0.5
  }
  # 排他結果を取得する
  return lock
end

0.5[s]ってのは勘ですが、その間にもう一つ別のプロセスが排他しようといたらどうなるんだろうなぁ・・・。


そもそも、ファイルを開いて排他をかける前に編集されたらどうなるんだろう?
という疑問が起こったのでお試しプログラムを書いてみる


list.txt を用意して2行書いて下記を実行

file = open("list.txt" , "a+")
puts "今のうちにファイルを編集して..."
STDIN.gets
puts "行数 => " + file.read.count("\n").to_s 
file.puts("add new line")

- 結果 -

今の内にファイルを編集して... #2行ほど追加する
行数 => 4

そしてlist.txtには一行新しく追加されていた。


ファイルを開いて排他をかけた後に編集すれば問題ないってことか。
"a+" で開いた場合の書き込み位置はファイルの末尾で保証されるんだろうな。