Ruby的File :: LOCK_UN似乎不起作用

时间:2014-02-14 08:00:19

标签: ruby file-locking flock

这非常简单,但似乎不起作用。我正在使用Ruby的File#flock方法。首先,我锁定一个文件,然后我释放锁,然后我尝试再次锁定它。第二个锁失败,就像文件仍然被锁定一样。这是来自irb会话的直接复制粘贴。我正在使用在Ubuntu 13.04上运行的Ruby 2.1.0p0。

$ irb
>> File.open('/tmp/asdf', 'r+').flock(File::LOCK_EX)
=> 0
>> File.open('/tmp/asdf', 'r+').flock(File::LOCK_UN)
=> 0
>> File.open('/tmp/asdf', 'r+').flock(File::LOCK_EX)
^CIRB::Abort: abort then interrupt!
        from (irb):3:in `call'
        from (irb):3:in `flock'
        from (irb):3
        from /usr/local/rvm/rubies/ruby-2.1.0/bin/irb:11:in `<main>'

第二个LOCK_EX尝试只是挂起,就像文件仍然被锁定一样。从上面的复制粘贴中可以看出,我不得不使用Ctrl-C中止第二次尝试。

知道为什么解锁在这里不起作用?

作为参考,我需要这个的原因是因为我试图获得相当于Mutex但跨进程而不是线程。根据我在网上看到的内容,文件锁定就足够了。

1 个答案:

答案 0 :(得分:1)

实际上,我只是在发布问题后才发现它。回想起来,这很明显,但LOCK_UN必须在同一个文件句柄上工作,当然。像这样:

$ irb
>> f = File.open('/tmp/asdf', 'r+')
=> #<File:/tmp/asdf>
>> f.flock(File::LOCK_EX)
=> 0
>> f.flock(File::LOCK_UN)
=> 0
>> f = File.open('/tmp/asdf', 'r+')
=> #<File:/tmp/asdf>
>> f.flock(File::LOCK_EX)
=> 0