相关:一个,两个
指出flock()
(BSD-LOCKS)和fcntl()
(POSIX记录级锁)提供了用户不兼容的语义,尤其是在锁定发布方面。
但是,在glibc
中,flock()
是根据POSIX fcntl()
实现的。(我在官方的git repo上检查了一下,这只是一个可见的链接)
https://code.woboq.org/userspace/glibc/sysdeps/posix/posix/flock.c.html#18
/*此文件实现
flock' function in terms of the POSIX.1
fcntl' 锁定机制。在4BSD中,这是两个不兼容的锁定机制, 也许有不同的语义?*/
这些事实如何结合在一起?
在Linux上,flock
是系统调用。flock
锁和fcntl
锁是独立的,并且不会互相干扰(至少在本地文件系统上)。
GLIBC源文件sysdeps/posix/flock.c
实际上未在Linux上使用。真正的实现是sysdeps/unix/sysv/linux/syscalls.list
中此行生成的系统调用包装器:
flock - flock i:ii __flock flock
ofd锁是另一种锁,但它们确实与Posix唱片锁相互作用。但是,它们在多个线程中具有更合理的行为,并且关闭一个描述符不会释放同一过程持有的同一基础文件的所有锁(这使得Posix记录锁定在多线程过程中很难使用)。
注意。这是完全错误的,请参阅公认的答案。由于它具有一些有用的链接
,因此仍保持活力好吧,这很乏味-fcntl
使用相同的flock
struct与参数,并从 crocess相关文件锁(上述我的符号中的posix记录级锁)以 l_pid
字段值为基础。
glibc文档在打开文件上说明锁:
打开文件说明锁使用与过程相关的锁相同的结构群作为参数(请参阅文件锁),并且在标题文件fcntl.h中也声明了命令值的宏。要使用它们,必须在包含任何标头文件之前定义宏_gnu_source。
...
与过程相关锁相比,任何用作打开文件说明锁定命令的结构群都必须将l_pid值设置为0。,结构群中的L_PID字段将设置为-1,以表明锁与过程无关。
另外,请参见有关过程相关文件锁的Glibc Doc