glibc中的flock()与fcntl()语义

时间:2019-03-21 15:22:49

标签: locking posix glibc flock fcntl

相关:onetwo

据说flock()(BSD锁)和fcntl()(POSIX记录级锁)为用户提供了不兼容的语义,特别是在锁释放方面。

但是,在glibc中,flock()是根据POSIX fcntl()实现的。 (我在官方git repo上进行了检查,这只是可见链接)

https://code.woboq.org/userspace/glibc/sysdeps/posix/flock.c.html#18

  

/ *此文件实现flock' function in terms of the POSIX.1 fcntl'      锁定机制。在4BSD中,这是两种不兼容的锁定机制,      也许有不同的语义? * /

这些事实如何结合在一起?

2 个答案:

答案 0 :(得分:1)

在Linux上,flock is a system callflock锁和fcntl锁是独立的,并且不会互相干扰(至少在本地文件系统上)。

glibc源文件sysdeps/posix/flock.c并未在Linux上实际使用。真正的实现是从sysdeps/unix/sysv/linux/syscalls.list的此行生成的系统调用包装器:

flock             -       flock           i:ii    __flock         flock

OFD锁是另一种锁,但是它们确实与POSIX记录锁交互。但是,它们具有多个线程的更合理的行为,并且关闭一个描述符并不会释放同一进程所拥有的同一基础文件的所有锁(这使得POSIX记录锁定在多线程进程中很难使用)。

答案 1 :(得分:0)

注意。这是完全错误的,请参阅接受的答案。由于它具有一些有用的链接,因此仍然保持活动状态

嗯,这很无聊– fcntl使用相同的flock结构作为参数,并区分打开文件锁(在我的符号中为BSD锁)与与过程相关的文件锁(在上面的符号中为POSIX记录级锁),以l_pid字段值为基础。

glibc docs on Open File Description Locks

  

打开的文件描述锁使用与进程相关的锁相同的struct flock作为参数(请参见文件锁),并且命令值的宏也在头文件fcntl.h中声明。要使用它们,必须在包含任何头文件之前定义宏_GNU_SOURCE。

     

...

     

与进程相关的锁相反,用作打开文件描述锁命令的参数的任何结构群必须将l_pid值设置为0。此外,在F_GETLK或F_OFD_GETLK请求中返回有关打开文件描述锁的信息时, ,则struct flock中的l_pid字段将设置为-1,以指示该锁与进程无关。

另外,请参见glibc doc on process-associated file locks