flockの検証

以下のスクリプトでflockの動作を検証してみた。
当たり前の話かもだけど、よく混乱するのでメモ。

つぎ
SHEXSH | NBEX | NB
はじめSH開く待ち開くfalseが返る
EX待ち待ちfalseが返るfalseが返る
SH | NB開く待ち開くfalseが返る
EX | NB待ち待ちfalseが返るfalseが返る

#!/usr/bin/env ruby
require 'optparse'

def prompt
  puts '[HIT ENTER]'
  STDIN.gets
end

def lock_with_prompt(file, operation)
  File.open(file, 'a') {|f|
    puts f.flock(operation)
    prompt
  }
end

lock_file = "#{__FILE__}.lock"
flock_operation = nil

opts = OptionParser.new
opts.on('-f', '--file [LOCK_FILE]') {|v| lock_file = v }
opts.on('-s', '--lock_sh') { flock_operation = File::LOCK_SH }
opts.on('-e', '--lock_ex') { flock_operation = File::LOCK_EX }
opts.on('-h', '--lock_sh_none_block') { flock_operation = File::LOCK_SH | File::LOCK_NB }
opts.on('-x', '--lock_ex_sh_none_block') { flock_operation = File::LOCK_EX | File::LOCK_NB }
opts.parse!(ARGV)

if flock_operation
  lock_with_prompt(lock_file, flock_operation)
else
  $stderr.puts opts.help
end