Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby';s文件::LOCK#u UN不';他似乎不在工作_Ruby_File Locking_Flock - Fatal编程技术网

Ruby';s文件::LOCK#u UN不';他似乎不在工作

Ruby';s文件::LOCK#u UN不';他似乎不在工作,ruby,file-locking,flock,Ruby,File Locking,Flock,这非常简单,但似乎不起作用。我用的是Ruby的方法。首先,我锁定一个文件,然后我释放锁,然后我尝试再次锁定它。第二次锁定失败,就像文件仍然被锁定一样。下面是来自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:

这非常简单,但似乎不起作用。我用的是Ruby的方法。首先,我锁定一个文件,然后我释放锁,然后我尝试再次锁定它。第二次锁定失败,就像文件仍然被锁定一样。下面是来自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>'
$irb
>>File.open('/tmp/asdf',r+').flock(文件::LOCK_EX)
=> 0
>>File.open('/tmp/asdf',r+').flock(文件::LOCK_UN)
=> 0
>>File.open('/tmp/asdf',r+').flock(文件::LOCK_EX)
^中止:中止然后中断!
发件人(irb):3:在“通话”中
来自(irb):3:in'flock'
来自(irb):3
from/usr/local/rvm/rubies/ruby-2.1.0/bin/irb:11:in`'
第二次锁定尝试挂起,就像文件仍然被锁定一样。从上面的复制粘贴中可以看到,我不得不用Ctrl-C中止第二次尝试

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


作为参考,我之所以需要它,是因为我试图获得与互斥等效的互斥,但要跨进程而不是线程。根据我在网上读到的内容,文件锁定应该足够了。

事实上,我刚在发布问题后就找到了答案。回想起来,这是很明显的,但是锁必须在同一个文件句柄上工作。像这样:

$ 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
$irb
>>f=File.open('/tmp/asdf','r+'))
=> #
>>f.flock(文件::LOCK_EX)
=> 0
>>f.flock(文件::LOCK_UN)
=> 0
>>f=File.open('/tmp/asdf','r+'))
=> #
>>f.flock(文件::LOCK_EX)
=> 0