locking - 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.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 记录锁定很难在多线程进程中使用)。
推荐阅读
- java - 为什么我的 Spring Boot 应用程序中出现“无法解析 ch.qos.logback:logback-core:1.2.3”?
- python - Numpy - 如何对子数组进行矢量化
- powershell - Powershell 禁止所有安装程序启动的重新启动
- java - onclick 滚动后有效
- java - 具有多个数据集(超过 2 个)的 LineChart 的不同 YAxis 缩放
- javascript - 为什么我无法使用 v-for 获取值?
- mongodb - 在本地 docker 中运行时从 Spring Boot 应用程序连接到 mongo 服务器时出错
- android - 如何在颤动中对齐两个文本小部件?
- javascript - 将 $(this).text 与类内容一起使用
- postgresql - 在 postgresql12 中使用序列字段进行表分区