目前flock的工作原理如下:
% exec {MY}<test.txt
% ~/github/myflock/flock -E 101 -nx "${MY}" ; echo $?
0
% exec zsh
% exec {MY}<test.txt
% ~/github/myflock/flock -E 101 -nx "${MY}" ; echo $?
101
我希望第二次锁定成功。所以exec应该导致锁关闭。 Flock(util-linux)来源:
...
switch (opt) {
case 's':
type = LOCK_SH;
break;
case 'e':
case 'x':
type = LOCK_EX;
break;
case 'u':
type = LOCK_UN;
break;
...
while (flock(fd, type | block)) {
是否可以将某些内容传递给flock()
以使exec上的锁闭合?
答案 0 :(得分:0)
如果您要创建flock
实用程序的本地变体,而不是替换系统flock
,则这就是您正在处理的内容:
在现代Linux上,flock
(1)程序是flock
(2)系统调用的包装器(较旧的Linux具有flock
(3)库函数,有不同的语义)。 flock
(2)的文档明确无误地说:
由
flock
()创建的锁在execve
(2)中保留。
没有为exec关闭flock
锁的规定。但是,它也说:
flock
()创建的锁与打开的文件表条目相关联。这意味着重复的文件描述符(例如,由fork
(2)或dup
(2)创建)引用相同的锁,并且可以使用任何这些描述符修改或释放此锁。此外,锁定是通过对任何这些重复描述符的显式LOCK_UN
操作释放的,或者当所有这些描述符都已关闭时释放。
因此,您可以使用fcntl()
标记要在exec上关闭的文件描述符。当FD关闭时(在exec上),flock
锁也将被删除,前提是在同一个打开的文件描述中没有其他句柄。然而,显然,FD作为该方法的一部分被关闭,这可能是不期望的结果。此外,如果同一个打开文件描述中的其他句柄在exec中存活(可以视为一个功能),则释放锁定无效。