以下のスクリプトでflockの動作を検証してみた。
当たり前の話かもだけど、よく混乱するのでメモ。
つぎ | |||||
SH | EX | SH | NB | EX | 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