为什么File对象是新对象时flock()的工作方式不同?

时间:2018-10-26 15:24:19

标签: ruby io

这是代码,它可以正常工作:

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>

但是,这不起作用:

f = File.new('test', File::CREAT | File::RDWR)
f.flock(File::LOCK_EX)
f.flock(File::LOCK_EX)
puts 'Works!'

您能解释为什么吗?我的实际问题是如何使第二个片段起作用?

1 个答案:

答案 0 :(得分:2)

  

如何使第二个片段起作用?

在尝试用LOCK_UN重新锁定之前,先用LOCK_EX解锁文件。或不要使用LOCK_EX

关于发生这种情况的原因,请参见flock(2)上的documentation

  

如果进程使用open(2)(或类似文件)来获取多个文件          同一文件的描述符,将处理这些文件描述符          由flock()独立进行。尝试使用以下方法之一锁定文件          这些文件描述符可能被锁所拒绝,即调用          进程已经通过另一个文件描述符放置了。