首页 > 解决方案 > glibc 中的flock() 与 fcntl() 语义

问题描述

相关:

据说flock()(BSD-locks) 和fcntl()(POSIX record-level locks) 给用户提供了不兼容的语义,特别是在锁定释放方面。

但是, inglibc flock()是根据 POSIX 实现的fcntl()。(我在官方 git repo 上检查了这个,这里只是一个可查看的链接)

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

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

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

标签: lockingposixglibcflockfcntl

解决方案


在 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 记录锁定很难在多线程进程中使用)。


推荐阅读