ユーザ用ツール

サイト用ツール


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