2

看完之后flock有点迷茫。基本上有两种形式:

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

现在,如果我想使用第二种形式,我需要使用exec 200<> file. 然后我用flock 200.

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

那么为什么我不得不创建一个描述符呢?

4

2 回答 2

4

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

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

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

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

于 2014-03-18T18:48:32.713 回答
2

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

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

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

于 2014-03-18T18:24:32.737 回答