开发者社区> 烹茶室> 正文

Linux 下的文件锁

简介: 当进程想要修改文件的时候,申请独占锁(写锁),当进程想要读取文件数据的时候,申请共享锁(读锁)。
+关注继续查看
本文内容为 Linux 系统通用,各个语言实现可能稍有不同,但原理相同。

当多个进程或多个程序都想要修同一个文件的时候,如果不加控制,多进程或多程序将可能导致文件更新的丢失。

例如进程 1 和进程 2 都要写入数据到 a.txt 中,进程 1 获取到了文件句柄,进程 2 也获取到了文件句柄,然后进程 1 写入一段数据,进程 2 写入一段数据,进程 1 关闭文件句柄,会将数据 flush 到文件中,进程 2 也关闭文件句柄,也将 flush 到文件中,于是进程 1 的数据被进程 2 保存的数据覆盖了。

所以,多进程修改同一文件的时候,需要协调每个进程:

  • 保证文件在同一时间只能被一个进程修改,只有进程 1 修改完成之后,进程 2 才能获得修改权
  • 进程 1 获得了修改权,就不允许进程 2 去读取这个文件的数据,因为进程 2 可能读取出来的数据是进程 1 修改前的过期数据

这种协调方式可以通过文件锁来实现。

文件锁分类

文件锁分两种,

  • 独占锁(写锁)
  • 共享锁(读锁)

当进程想要修改文件的时候,申请独占锁(写锁),当进程想要读取文件数据的时候,申请共享锁(读锁)。

独占锁和独占锁、独占锁和共享锁都是互斥的。

只要进程 1 持有了独占锁,进程 2 想要申请独占锁或共享锁都将失败(阻塞),也就保证了这一时刻只有进程 1 能修改文件,只有当进程 1 释放了独占锁,进程 2 才能继续申请到独占锁或共享锁。

但是共享锁和共享锁是可以共存的,这代表的是两个进程都只是要去读取数据,并不互相冲突。

文件锁:flock 和 lockf

Linux 上的文件锁类型主要有两种:flock 和 lockf。后者是 fcntl 系统调用的一个封装。它们之间有些区别:

  • flock 来自 BSD,而 fcntl 或 lockf 来自 POSIX,所以 lockf 或 fcntl 实现的锁也称为 POSIX 锁
  • flock 只能对整个文件加锁,而 fcntl 或 lockf 可以对文件中的部分加锁,即粒度更细的记录锁
  • flock 的锁是劝告锁,lockf 或 fcntl 可以实现强制锁。所谓劝告锁,是指只有多进程双方都遵纪守法地使用 flock 锁才有意义,某进程使用 flock,但另一进程不使用 flock,则 flock 锁对另一进程完全无限制
  • flock 锁是附加在(关联在)文件描述符上的(见下文更深入的描述),而 lockf 是关联在文件实体上的。本文后面将详细分析 flock 锁在文件描述符上的现象

参考文献

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Linux】Linux文件锁
【Linux】Linux文件锁
62 0
Linux 挖矿程序把病毒文件锁住了,删不了,怎么破?(chattr)
本文就讲讲,怎么把这些加了锁的只读文件去 i 取消只读!
211 0
一文教你玩转Linux的ping命令,从此成为Linux网络高手
一文教你玩转Linux的ping命令,从此成为Linux网络高手
9 0
Linux tail命令该如何使用?这篇文章讲的十分详细!
Linux tail命令该如何使用?这篇文章讲的十分详细!
17 0
Linux中最基本的命令ls的用法有哪些?
Linux中最基本的命令ls的用法有哪些?
8 0
Linux命令小技巧:显示文件指定行的内容
Linux命令小技巧:显示文件指定行的内容
41 0
Java执行Linux命令
Java执行Linux命令
20 0
如何在Linux中优雅的使用 head 命令,用来看日志简直溜的不行
如何在Linux中优雅的使用 head 命令,用来看日志简直溜的不行
44 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Decian GNU/Linux安全合规之路
立即下载
从 Linux 系统内核层面来解决实际问题的实战经验
立即下载
冬季实战营第二期:Linux操作系统实战入门
立即下载