我发现了flock(1)
的样板代码,它看起来很有前景。现在我想在盲目使用它之前了解组件。
这些函数似乎使用了flock
的第三种形式
flock[-sxun][-w timeout]fd
第三种形式在shell脚本中很方便,通常使用以下方式:
(
flock -s 200
# ... commands executed under lock ...
) 200>/var/lock/mylockfile
我丢失的部分(来自示例包装器函数)是这个符号
eval "exec $LOCKFD>"$LOCKFILE""
或flock
手册页的简写
200>/var/lock/mylockfile
这能实现什么?
我注意到flock
的后续命令传递了一个值,而不是初始重定向中的值,导致flock
抱怨
flock: 50: Bad file descriptor
flock
似乎正在使用文件描述符作为映射来知道要对哪个文件进行操作。不过,为了使其工作,这些描述符必须仍然存在并与文件关联,对吧?
重定向完成后,创建了锁定文件,文件不是关闭了,与打开的文件相关的文件描述符也蒸发了吗?我以为文件描述符只与打开的文件关联。
这是怎么回事?
200>/var/lock/mylockfile
这创建了一个文件/var/lock/mylockfile
,该文件可以通过子外壳内的文件描述符200写入。数字200是一个任意的数字。选择一个高数字可以减少子外壳内的任何命令"注意到"额外文件描述符的机会。
(通常,stdin、stdout和stderr分别使用文件描述符0、1和2。这个数字可能低至3。)
flock -s 200
然后使用flock
通过先前创建的文件描述符来锁定文件。它需要对200>
中的>
提供的文件进行写访问。请注意,这种情况发生在上述重定向之后。