更改flock(util-linux)源代码,以便在exec()

时间:2016-09-12 13:01:13

标签: locking flock

目前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上的锁闭合?

1 个答案:

答案 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中存活(可以视为一个功能),则释放锁定无效。