1

这非常简单,但似乎不起作用。我正在使用 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 的等价物,但它是跨进程而不是线程的。根据我在网上阅读的内容,文件锁应该足够了。

4

1 回答 1

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
于 2014-02-14T08:07:10.400 回答