3

我发现样板flock(1)代码看起来很有希望。现在我想在盲目使用之前了解组件。

似乎这些功能正在使用第三种形式flock

群 [-sxun] [-w 超时] 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正在使用文件描述符作为映射来知道要对哪个文件进行操作。但是,为了使其正常工作,这些描述符必须仍然存在并与文件相关联,对吗?

重定向完成并创建锁定文件后,文件是否已关闭,与打开文件关联的文件描述符是否已蒸发?我认为文件描述符只与打开的文件相关联。

这里发生了什么?

4

1 回答 1

4
200>/var/lock/mylockfile

这将创建一个文件,该文件/var/lock/mylockfile可以通过子外壳内的文件描述符 200 写入。数字 200 是任意数字。选择一个较大的数字会减少子外壳内的任何命令“注意到”额外文件描述符的机会。

(通常,文件描述符 0、1 和 2 分别由 stdin、stdout 和 stderr 使用。这个数字可能低至 3。)

flock -s 200

然后flock用于通过先前创建的文件描述符锁定文件。它需要对>in200>提供的文件的写访问权。请注意,这发生上述重定向之后。

于 2014-02-10T23:24:44.093 回答