更改 flock (util-linux) 源以便在 exec() 上关闭锁

Change flock (util-linux) source so that locks are closed on exec()

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

如果您想创建 flock 实用程序的本地变体,而不是替换系统的 flock,这就是您要处理的内容:

在现代 Linux 上,flock(1) 程序是 flock(2) 系统调用的包装器(较旧的 Linux 有一个 flock(3) 而不是库函数,它具有不同的语义)。 flock(2) 的文档明确且明确地说:

Locks created by flock() are preserved across an execve(2).

没有规定要在 exec 上关闭 flock 锁。但是,它还说:

Locks created by flock() are associated with an open file table entry. This means that duplicate file descriptors (created by, for example, fork(2) or dup(2)) refer to the same lock, and this lock may be modified or released using any of these descriptors. Furthermore, the lock is released either by an explicit LOCK_UN operation on any of these duplicate descriptors, or when all such descriptors have been closed.

因此,您可以选择使用 fcntl() 来标记要在执行时关闭的文件描述符。当 FD 关闭时(在 exec 上),flock 锁也将被删除,前提是同一打开的文件描述上没有其他句柄。然而,显然,FD 作为该方法的一部分被关闭,这可能是不希望的结果。此外,如果同一打开文件描述上的其他句柄在 exec 中存活(这可以被视为一项功能),则释放锁是无效的。