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 锁在文件描述符上的现象

参考文献

目录
相关文章
|
12月前
|
Linux
Linux下面Crontab文件锁实现进程互斥
Linux下面Crontab文件锁实现进程互斥
118 0
Linux下面Crontab文件锁实现进程互斥
【Linux】Linux文件锁
【Linux】Linux文件锁
|
人工智能 安全 Linux
Linux 挖矿程序把病毒文件锁住了,删不了,怎么破?(chattr)
本文就讲讲,怎么把这些加了锁的只读文件去 i 取消只读!
|
4天前
|
监控 数据挖掘 Linux
探索Linux中的`sort`命令:数据处理与分析的得力助手
`sort`命令是Linux下文本数据排序利器,用于按字典、数字顺序等对行排序。关键参数有:-n(数字排序),-r(逆序),-u(去重),-k(指定字段),-t(字段分隔符)和-o(输出到文件)。在处理大文件时注意内存使用,确保字符编码一致,灵活运用管道和重定向。通过熟练使用`sort`,能提升数据分析效率。
|
4天前
|
数据挖掘 Linux 数据处理
Linux命令sprof详解
**`sprof`是Linux下的共享库性能分析工具,补充`gprof`,专注分析`.profile`文件以识别性能瓶颈。通过调用次数、执行时间数据优化资源和代码。使用参数如`-F`、`-I`、`-d`进行定制化分析。示例:先设置`LD_PROFILE`环境变量,运行程序生成`.profile`,然后用`sprof`分析。注意需用`-g`编译程序,并在代表性的负载下分析。结合其他工具如`perf`、`valgrind`提升分析效果。**
|
4天前
|
存储 数据挖掘 Linux
Linux命令split详解:大文件处理的得力助手
`split`命令是Linux用于将大文件分割成小文件的工具,常用于日志处理、备份。它支持按行数(-l)、字节数(-b)分割,并能自定义输出文件名(-a, -d)。例如,`split -b 10M largefile.txt smallfile_`会按10MB切割`largefile.txt`,生成`smallfile_`开头的文件。注意确保磁盘空间充足,避免文件名冲突,并备份原始文件。结合其他命令使用,能提高文件管理效率。
|
1天前
|
关系型数据库 MySQL Linux
Linux命令systemctl详解
`systemctl`是Linux系统用于管理systemd服务的核心命令,它与systemd守护进程交互,实现启动、停止、重启服务及查看服务状态等功能。主要参数包括`start`、`stop`、`restart`、`status`、`enable`和`disable`等。例如,启动Apache服务使用`systemctl start httpd.service`,查看服务状态用`systemctl status <service>`。使用时需注意权限,服务名通常以`.service`结尾,但命令中可省略。最佳实践包括利用tab键补全、定期查看服务状态和合理配置服务自启。
|
1天前
|
存储 安全 Linux
Linux命令sync详解
`sync`命令在Linux中用于将内存缓冲区的数据强制写入磁盘,保证数据持久性和一致性。它在关机、重启或重要文件操作前后使用,以防数据丢失。工作原理是强制将内存中的数据同步到磁盘,特点是阻塞式执行且通常无需参数。常见用法包括安全关机、数据备份和配置文件修改后确保更改生效。应注意,过度使用可能影响性能,应适时使用`fsck`检查文件系统一致性。