ruby:flock
ファイルの排他処理
Perlの排他制御、openしてからflockするまでの間に他プロセスに書き込みされてしまうかもしれないよ?というレアケースにまで対応する排他処理のRuby版
# 追加書き込み File.open(filepath, "a") { |f| f.flock(File::LOCK_EX) f.seek(0, File::SEEK_END) f.write(data) } # 新規作成 File.open(filepath, "w+") { |f| f.flock(File::LOCK_EX) f.rewind f.write(data) f.truncate(f.tell) } # 上書き File.open(filepath, "r+") { |f| f.flock(File::LOCK_EX) f.rewind f.write(data) f.truncate(f.tell) }
ブロック付きのopenはclose処理をブロック実行後に行ってくれる。ファイル書き込み時などに例外が発生した場合でもcloseしてくれる(ほんとか?)。信用できなければ以下のコードで
begin f = File.open(filepath, "r+") begin f.flock(File::LOCK_EX) f.rewind f.write(data) f.truncate(f.tell) ensure f.close end rescue # 例外処理コード end
ruby/flock.txt · 最終更新: 2007/10/02 17:14 by 127.0.0.1