ファイルの排他機能を実装
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+" で開いた場合の書き込み位置はファイルの末尾で保証されるんだろうな。