Linux flock 原理(shell进阶)

简介: flock申请的锁对象是处于 内核空间层的全局级别的open file table中的。

flock申请的锁对象是处于 内核空间层的全局级别的open file table中的。


回忆一下OS是如何打开一个文件的?


首先一个文件对应一个fd,fd是维护在用户空间,通过索引对应到内核空间的fd表。程序是无法直接打开文件的,需要请内核帮忙。用户空间使用fd在内核中调用open函数,当然可以调用多次,调用多次在open file中就会记录多条记录。然后在内核空间的文件级别层的inode表找到对应的inode(这个inode表是从硬盘上copy过来的,并附加上一些额外的信息), 将此文件加载到虚拟内存中此时这个文件就被打开了。


注意:


内核层面的inode 表和open file表是一对多的关系。


fd表 中存在复制的fd,这两个fd可能指向同一个lock

2edf5490d6f648b8bf537bf29b827280.png

如何理解man flock中的这段文字呢?1997cbf6d4434a63a6ffc3a1bede08fb.png

588bcd3adc034457abbd13d2ec05844b.png

 Locks created by flock() are associated with an open file table entry.  This means that duplicate file descriptors  (created  by,  for  example,  fork(2)  or
       dup(2))  refer  to  the  same lock, and this lock may be modified or released using any of these descriptors.  Furthermore, the lock is released either by an
       explicit LOCK_UN operation on any of these duplicate descriptors, or when all such descriptors have been closed.

这段话主要说明了文件描述符上的锁和文件上的锁的区别 , 因为存在fork的子进程使用同一把锁。当手动释放锁文件时,open file table entry中的fd关联的锁消失。如果释放的是某个fd的锁,则锁还是存在并生效的。


open file table上维护的其他特殊信息

de6298a1c683437fa0fcec2510446fb9.png

对于多个进程同一文件都能正确工作。每个进程都有它自己的文件表项,其中也有它自己的当前文件位移量。但是,当多个进程写同一文件时,则可能产生预期不到的结果。


假定有两个独立的进程 A和B,都对同一文件进行添加操作。每个进程都已打开了该文件,但未使用 O _ A P P E N D标志。此时各数据结构之间的关系如图中所示一样。每个进程都有它自己的文件表项,但是共享一个 v节点表项。假定进程A调用了l s e e k,它将对于进程A的该文件的当前位移量设置为1 5 0 0字节(当前文件尾端处)。然后内核切换进程使进程 B运行。进程B执行l s e e k,也将其对该文件的当前位移量设置为 1 5 0 0字节(当前文件尾端处)。然后B调用w r i te,它将B的该文件的当前文件位移量增至 1 6 0 0。因为该文件的长度已经增加了,所以内核对 v节点中的当前文件长度更新为 1 6 0 0。然后,内核又进行进程切换使进程 A恢复运行。当A调用w r i t e时,就从其当前文件位移量 ( 1 5 0 0 )处将数据写到文件中去。这样也就代换了进程 B刚写到该文件中的数据。

--update 2022年3月24日14:04:00

劝告锁

flock和fcntl都属于劝告式锁(Advisory Lock),如果同步的进程遵循游戏规则,操作之前先申请锁,就能起到同步的作用;但是如果进程无视劝告式锁的存在,不遵循游戏规则,不申请锁直接操作文件或文件的某个区域,内核也不会阻止这种操作。


目录
相关文章
|
3月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
|
3月前
|
算法 Linux Shell
Linux实用技能:打包压缩、热键、Shell与权限管理
本文详解Linux打包压缩技巧、常用命令与原理,涵盖.zip与.tgz格式操作、跨系统传文件方法、Shell运行机制及权限管理,助你高效使用Linux系统。
Linux实用技能:打包压缩、热键、Shell与权限管理
|
3月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
|
5月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
629 1
|
9月前
|
安全 Linux
【Linux】阻塞信号|信号原理
本教程从信号的基本概念入手,逐步讲解了阻塞信号的实现方法及其应用场景。通过对这些技术的掌握,您可以更好地控制进程在处理信号时的行为,确保应用程序在复杂的多任务环境中正常运行。
319 84
|
7月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
221 4
|
7月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
443 3
|
8月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
672 25
|
8月前
|
Linux Shell
shell_42:Linux参数移动
总的来说,参数移动是Linux shell脚本中的一个重要概念,掌握它可以帮助我们更好地处理和管理脚本中的参数。希望这个解释能帮助你理解和使用参数移动。
193 18
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单