在调查flock
后,我有点困惑。基本上有两种形式:
flock [options] <file|directory> <command> [command args]
flock [options] <file descriptor number>
现在,如果我想使用第二种形式,我需要使用exec 200<> file
。然后我用flock 200
锁定文件。
现在我阻止我的脚本毁掉file
,因为它需要在执行此操作之前获取锁定。为什么我必须先创建描述符?我可以完全正常地操作file
而不使用该描述符。
那么为什么我被迫创建描述符?
答案 0 :(得分:4)
与更传统的锁定机制相比,使用flock()
- 或与fcntl(LOCK_EX)
机制密切相关的一个主要优势是,无需使用在重启或其他不干净的关机场景中执行清理。
这是可能的,因为锁是通过文件描述符附加的;当该文件描述符被关闭时 - 无论是通过正常关闭,SIGKILL还是断电 - 都不再保持锁定。
当您使用flock()
命令行工具调用的基础flock
系统调用时 - 只要您的文件描述符执行,该锁就会持续。因此,如果您希望在多个命令的持续时间内打开文件上的单个锁,则需要在该时间段内保留描述符。
如果flock
没有此设计要求,则只要与其关联的进程退出,就无法自动关闭和清理锁定。这会使flock
的用处少得多。
答案 1 :(得分:2)
flock(2)
系统调用 - 以及flock
命令 - 只能在打开文件时将其锁定。关闭文件句柄后,锁定即被释放。
由于在命令退出时所有打开的文件句柄都关闭,因此无法运行flock filename
来锁定文件。
该文件必须以高级方式打开,以便在flock
退出时不会关闭,或者可以通过flock打开并通过flock
调用的命令进行操作,直到命令和flock退出,释放锁定。