【问题标题】:Why does flock use a descriptor or file为什么flock使用描述符或文件
【发布时间】:2014-04-24 13:32:08
【问题描述】:

查看flock 后,我有点困惑。基本上有两种形式:

flock [options] <file|directory> <command> [command args]
flock [options] <file descriptor number>

现在如果我想使用第二种形式,我需要使用exec 200&lt;&gt; file。然后我用flock 200 锁定文件。

现在我阻止了我的脚本破坏file,因为它需要在这样做之前获取锁。仍然为什么我必须先创建描述符?我可以在不使用该描述符的情况下对file 进行操作。

那我为什么要强制创建描述符呢?

【问题讨论】:

  • 您需要创建一个描述符,因为您使用的命令需要一个文件描述符。如果您不想创建描述符,请使用第一种形式。
  • @chepner 是的,显然第一种形式直接采用命令我经常使用该文件,在获取锁和再次释放它之间有很多命令。所以我不能用第一个
  • 啊,我不想打开子shell
  • @mjb4,了解flock 的关键之一是您不需要调用flock -u 来释放锁——它会在附加文件描述符后立即释放to 已关闭。因此,如果您没有打开描述符,您将无法在多个命令中使您的锁定持续。

标签: linux bash shell sh flock


【解决方案1】:

与更传统的锁定机制相比,使用flock() 或与之密切相关的fcntl(LOCK_EX) 机制的主要优势之一是无需在重新启动或其他不干净的关闭情况下执行清理。

这是可能的,因为锁是通过文件描述符附加的;当该文件描述符关闭时——无论是通过正常关闭、SIGKILL 还是断电——不再持有锁。

当您使用底层的flock() 系统调用(flock 命令行工具调用该系统调用)时,该锁定将持续与您的文件描述符一样长。因此,如果您希望在多个命令的持续时间内打开文件上的单个锁,则需要在该时间段内保持描述符。

如果flock 没有这个设计要求,它就无法在与它们关联的进程退出时自动关闭和清理锁。这将使flock 的用处大大降低。

【讨论】:

  • 好的,谢谢,这是一个非常有趣的理由,而且确实很有用!所以你还指出的是,即使我认为我将该描述符用作互斥锁(这是相当隐含的)我应该继续这样做并且不在乎我打开了那个描述符。
  • 一个忘了把它放在一个问题中!是否有更明确的方式来实现此文件锁定,或者这是实现锁定的“默认”方式?
  • @mjb4 对不起——我不太明白你的问题是什么意思。比什么更明确? (“实现”?)
  • 嗯,也许这只是我的感觉。但是打开一个文件描述符然后不使用它但在不使用该描述符的情况下更改文件对我来说似乎非常隐含。因为描述符不应该是互斥锁!
  • ...无论如何,不​​要将描述符视为互斥锁本身,而是将其视为互斥锁上的句柄
【解决方案2】:

flock(2) 系统调用——因此是flock 命令——只能在打开文件时锁定打开的文件。一旦文件句柄关闭,锁就会被释放。

由于命令退出时所有打开的文件句柄都会关闭,因此无法运行flock filename 来锁定文件。

该文件要么必须提前打开,以便在flock 退出时不会关闭,要么可以由flock 打开并通过flock 调用的命令对其进行操作,直到命令和flock 退出,释放锁。

【讨论】:

  • 我不会说“不可能”。请参阅stackoverflow.com/questions/24388009/… 中给出的getLock 函数。当然,这只是处理 FD 的糖,但它可能对查看这个问题的人有所帮助。 :)
猜你喜欢
  • 2018-03-10
  • 2014-03-14
  • 2017-04-13
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 2013-03-20
相关资源
最近更新 更多