【问题标题】:Why flock() works differently when the File object is new?为什么当 File 对象是新的时,flock() 的工作方式不同?
【发布时间】:2018-10-26 15:24:19
【问题描述】:

这是代码,它可以工作:

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

但是,这个不起作用:

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

你能解释一下这是为什么吗?我的实际问题是如何使第二个 sn-p 工作?

【问题讨论】:

  • 你怎么理解,第二个例子不起作用?
  • @Milovidov 很好,我运行它并没有打印出Works! :)
  • 因为它不应该打印 'Works!' :)
  • 第一个 sn-p 有 same 文件描述符用于两次锁定尝试,而第二个 sn-p - 不同 个。比再读一遍图连采夫的第二句话。

标签: ruby io


【解决方案1】:

如何让第二个sn-p工作?

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

至于为什么会发生这种情况,请参阅flock(2) 上的documentation

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

【讨论】:

  • 但是我想给flock()打两次电话。我希望它在第二次通话中起作用,就像在第一次通话中一样。我需要使用一个新的File 对象。
  • @yegor256:是的,是的,只要解锁它,然后你可以再次锁定它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 2012-11-26
  • 2017-04-17
  • 2014-06-20
相关资源
最近更新 更多