为什么flock使用描述符或文件

时间:2014-03-18 17:26:50

标签: linux bash shell sh flock

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

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

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

现在我阻止我的脚本毁掉file,因为它需要在执行此操作之前获取锁定。为什么我必须先创建描述符?我可以完全正常地操作file而不使用该描述符。

那么为什么我被迫创建描述符?

2 个答案:

答案 0 :(得分:4)

与更传统的锁定机制相比,使用flock() - 或与fcntl(LOCK_EX)机制密切相关的一个主要优势是,无需使用在重启或其他不干净的关机场景中执行清理。

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

当您使用flock()命令行工具调用的基础flock系统调用时 - 只要您的文件描述符执行,该锁就会持续。因此,如果您希望在多个命令的持续时间内打开文件上的单个锁,则需要在该时间段内保留描述符。

如果flock没有此设计要求,则只要与其关联的进程退出,就无法自动关闭和清理锁定。这会使flock的用处少得多。

答案 1 :(得分:2)

flock(2)系统调用 - 以及flock命令 - 只能在打开文件时将其锁定。关闭文件句柄后,锁定即被释放。

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

该文件必须以高级方式打开,以便在flock退出时不会关闭,或者可以通过flock打开并通过flock调用的命令进行操作,直到命令和flock退出,释放锁定。