据说flock()
(BSD-locks)和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中,这两个是不兼容的锁定机制,可能具有不同的语义? * /
这些事实如何结合在一起?
在Linux上,qazxsw poi。 qazxsw poi lock和qazxsw poi lock是独立的,不会相互干扰(至少在本地文件系统上)。
glibc源文件flock
is a system call实际上并未在Linux上使用。真正的实现是在flock
中从这一行生成的系统调用包装器:
fcntl
OFD锁是另一种锁,但它们确实与POSIX记录锁交互。但是,它们在多个线程中具有更合理的行为,并且关闭一个描述符不会释放由同一进程持有的相同底层文件的所有锁(这使得POSIX记录锁定在多线程进程中很难使用)。
注意。这是完全错误的,请参阅接受的答案。因为它有一些有用的链接,所以仍然保持活着
嗯,这非常沉闷 - sysdeps/posix/flock.c
使用相同的sysdeps/unix/sysv/linux/syscalls.list
结构作为参数,并在flock - flock i:ii __flock flock
字段上区分打开文件锁(上面的符号中的BSD锁)与进程相关的文件锁(上面我的符号中的POSIX记录级锁)价值基础。
fcntl
:
打开文件描述锁使用与进程相关的锁相同的struct flock作为参数(请参阅文件锁),并且命令值的宏也在头文件fcntl.h中声明。要使用它们,必须在包含任何头文件之前定义宏_GNU_SOURCE。
...
与进程相关的锁相反,任何用作打开文件描述锁定命令的参数的结构集都必须将l_pid值设置为0.此外,在F_GETLK或F_OFD_GETLK请求中返回有关打开文件描述锁的信息时,l_pid struct flock中的字段将设置为-1,表示该锁未与进程关联。
另外,请参阅flock