Linux 中,flock 对文件加锁
在Linux中,flock是一个用于对文件加锁的实用程序,它可以帮助协调多个进程对同一个文件的访问,避免出现数据不一致或冲突等问题。以下是对flock的详细介绍:
基本原理
flock通过在文件上设置锁来控制多个进程对该文件的并发访问。当一个进程对文件加锁后,其他进程若也试图对同一文件进行不相容的加锁操作(取决于锁的类型),则会被阻塞,直到第一个进程释放锁为止。这样就确保了在同一时刻只有一个(或特定数量的,依据锁类型)进程能够以特定的方式访问文件。
命令格式
flock命令的基本格式如下:
flock [选项] <文件描述符或文件名> <要执行的命令>
例如:
flock -x /tmp/myfile.txt echo "This is a test"
在这个例子中,-x是选项,表示排他锁(后面会详细介绍锁的类型),/tmp/myfile.txt是要加锁的文件名,echo "This is a test"是在获取锁之后要执行的命令。
锁的类型
-
排他锁(Exclusive Lock,简称 -x或–exclusive):
- 当一个进程对文件加上排他锁后,其他进程不能再对该文件加任何类型的锁(包括排他锁和共享锁),直到这个进程释放锁为止。
- 排他锁用于确保在锁被持有时,只有加锁的这个进程能够对文件进行读写操作,常用于对文件进行独占性的修改操作,比如写入新数据、替换文件内容等。
-
共享锁(Shared Lock,简称 -s或–shared):
- 若一个进程对文件加上共享锁,其他进程可以继续对该文件加共享锁,但不能加排他锁。
- 共享锁通常用于多个进程需要同时读取文件内容的情况,这样多个进程可以并发地获取共享锁并读取文件,而不会互相干扰,但当有进程要对文件进行修改(需要加排他锁)时,就必须等待所有持有共享锁的进程都释放锁之后才能进行。
常用选项
-
-n或–nb(Non-blocking):
- 作用:以非阻塞方式尝试加锁。如果无法立即获得所需的锁(比如文件已经被其他进程加了不相容的锁),则不会等待,而是立即返回一个错误状态码,并且继续执行后续的操作(如果有)。
- 示例:
flock -n -x /tmp/myfile.txt echo "This is a test",如果无法获得排他锁,echo命令将不会被执行,程序会继续往下进行处理,而不是一直等待锁的释放。
-
-w或–wait <等待时间>:
- 作用:指定等待锁的最长时间。如果在规定时间内无法获得锁,则返回一个错误状态码。
- 示例:
flock -w 10 -x /tmp/myfile.txt echo "This is a test",表示最多等待10秒来获取排他锁,若10秒内未获取到,则echo命令不会被执行,程序继续后续处理。
-
-u或–unlock:
- 作用:用于手动释放锁。一般情况下,当加锁时指定的命令执行完毕后,
flock会自动释放锁,但在某些特殊情况下,比如需要提前结束加锁状态,可以使用这个选项来手动释放锁。 - 示例:假设已经通过
flock -x /tmp/myfile.txt some_command加了排他锁,在some_command执行过程中,出于某种原因需要提前释放锁,可以执行flock -u /tmp/myfile.txt来实现。
- 作用:用于手动释放锁。一般情况下,当加锁时指定的命令执行完毕后,
应用场景
-
文件并发访问控制:
- 当多个进程需要同时访问一个文件,如日志文件,一些进程可能只是读取文件内容用于分析或监控,而另一些进程可能需要写入新的日志记录。通过使用
flock设置共享锁和排他锁,可以确保读取进程可以并发读取(使用共享锁),而写入进程在写入时能够独占文件(使用排他锁),避免了数据混乱。
- 当多个进程需要同时访问一个文件,如日志文件,一些进程可能只是读取文件内容用于分析或监控,而另一些进程可能需要写入新的日志记录。通过使用
-
资源协调:
- 在一些脚本或程序中,可能需要协调多个子进程对某个资源(以文件形式存在,比如配置文件)的访问。
flock可以用来确保每个子进程按照预期的方式访问资源,防止冲突,保证系统的稳定运行。
- 在一些脚本或程序中,可能需要协调多个子进程对某个资源(以文件形式存在,比如配置文件)的访问。
-
防止文件覆盖:
- 当两个或多个进程可能同时尝试对同一个文件进行修改操作时,如替换文件内容或添加新内容,使用排他锁可以确保只有一个进程能够成功进行修改,避免文件被多个进程同时修改导致的数据丢失或混乱。
注意事项
- 文件描述符与文件名:可以使用文件描述符(如通过
open函数打开文件后得到的描述符)或文件名来指定要加锁的对象。使用文件描述符时,要确保描述符对应的文件没有被关闭,否则可能导致锁无法正常释放或出现其他异常情况。 - 锁的继承性:在子进程中,如果父进程对某个文件加了锁,子进程一般会继承父进程的锁状态。但这也需要根据具体的编程语言和实现来确定,在某些情况下,可能需要在子进程中重新进行加锁操作,以确保锁的正确使用。
- 锁的释放:一般情况下,当加锁时指定的命令执行完毕后,
flock会自动释放锁,但如果在执行过程中出现异常情况(如进程被杀死、命令执行中断等),可能需要手动释放锁(使用-u选项),以避免文件被后续进程无法正常获取锁的情况。
flock是Linux中一个很有用的工具,用于协调多个进程对文件的访问,通过合理设置锁的类型、选项等来满足不同的应用场景需求,保障文件访问的有序性和数据的一致性。

相关文章:
Linux 中,flock 对文件加锁
在Linux中,flock是一个用于对文件加锁的实用程序,它可以帮助协调多个进程对同一个文件的访问,避免出现数据不一致或冲突等问题。以下是对flock的详细介绍: 基本原理 flock通过在文件上设置锁来控制多个进程对该文件的并发访问。…...
CentOS下载ISO镜像的方法
步骤 1:访问CentOS官方网站 首先,打开浏览器,输入CentOS的官方网站地址:Download 在网站上找到ISO镜像的下载链接,通常位于“Downloads”或类似的页面上。 选择所需的CentOS版本和架构(如x86_64…...
Node.js 入门指南:从零开始构建全栈应用
🌈个人主页:前端青山 🔥系列专栏:node.js篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来node.js篇专栏内容:node.js-入门指南:从零开始构建全栈应用 前言 大家好,我是青山。作…...
MYSQL 真实高并发下的死锁
https://pan.baidu.com/s/1nM3VQdbkNZhnK-wWboEYxA?pwdvwu6 下面是风控更新语句 ------------------------ LATEST DETECTED DEADLOCK ------------------------ 2023-08-04 01:00:10 140188779017984 *** (1) TRANSACTION: TRANSACTION 895271870, ACTIVE 0 sec starting …...
Zookeeper 简介 | 特点 | 数据存储
1、简介 zk就是一个分布式文件系统,不过存储数据的量极小。 1. zookeeper是一个为分布式应用程序提供的一个分布式开源协调服务框架。是Google的Chubby的一个开源实现,是Hadoop和Hbase的重要组件。主要用于解决分布式集群中应用系统的一致性问题。 2. 提…...
设计模式之结构型模式---装饰器模式
目录 1.概述2.类图3.应用场景及优缺点3.1 应用场景3.2 优缺点3.2.1 优点3.2.2 缺点 4.实现4.1 案例类图4.2 代码实现4.2.1 定义抽象构建角色4.2.2 定义具体构建角色4.2.3 定义抽象装饰器角色4.2.4 定义具体装饰角色4.2.5 装饰器模式的使用 1.概述 装饰器模式是指在不改变现有对…...
Android Pair
Pair在Android中是一种轻量级的工具类,并不是严格意义上的数据结构。 数据结构是一组有组织的方式来存储和管理数据的方式,如数组、链表、栈、队列、树、图等,它们有自己的特性和操作规则。而Pair更像是一个简单的封装,用于在需要…...
华为荣耀曲面屏手机下面空白部分设置颜色的方法
荣耀部分机型下面有一块空白区域,如下图红框部分 设置这部分的颜色需要在themes.xml里面设置navigationBarColor属性 <item name"android:navigationBarColor">android:color/white</item>...
《C#语法一篇通》,有20万字,需8MB字节,宜48小时阅读,没准会继续完善
本文摘录了C#语法的主要内容,接近20万字。 所有鸡汤的味道都等于马尿! 如果你相信任何所谓的鸡汤文章,智商堪忧。 计算机语言没有”好不好“之说,骗子才会告诉你哪个语言好,学好任何一本基础语言(C&#…...
嵌入式硬件工程师的职业发展规划
嵌入式硬件工程师可以按照以下阶段进行职业发展规划: 1. **初级阶段(1-3 年) ** - **技术学习与积累**: **电路基础强化**: 深入学习模拟电路和数字电路知识,能够熟练分析和设计基本的电路,…...
QT for android 问题总结(QT 5.15.2)
1.配置好的sdk,显示设置失败 Android SDK Command-line Tools run. Android Platform-Tools installed. Command-line Tools (latest) 版本过高导致报错 ,下载一个低版本的latest ,替换掉之前latest中的文件。即可,latest 路径如…...
PyTorch实战-手写数字识别-MLP模型
1 需求 包懂,40分钟掌握PyTorch深度学习框架,对应神经网络算法理论逐行讲解用PyTorch实现图像分类代码_哔哩哔哩_bilibili 10分钟入门神经网络 PyTorch 手写数字识别_哔哩哔哩_bilibili pytorch tutorial: PyTorch 手写数字识别 教程代码 从零设计并训…...
(附项目源码)Java开发语言,基于Java的高校实验室教学管理系统的设计与开发 50,计算机毕设程序开发+文案(LW+PPT)
摘 要 随着高校实验室教学与管理的复杂性增加,传统的手动管理系统已经无法满足日益增长的需求。实验室教学不仅涉及到学生的教学安排和管理,还需要对实验设备、实验材料、实验室资源等进行有效的调配和管理。而目前实验室教学管理的各项工作,…...
【日常问题排查小技巧-连载】
线上服务CPU飙高排查 先执行 top,找到CPU占用比较高的进程 id,(比如 21448) jstack 进程 id > show.txt(jstack 21448 > show.txt) 找到进程中CPU占用比较高的线程,线程 id 转换为 16 进…...
elastic search查找字段的方法
一,比如:elastic search 查找id为“ien9292voewew”的方法 此id为主键id,意思就是唯一id,在ES中是_id, 在 Elasticsearch 中,如果你想要查找特定 ID 的文档,可以使用 _get API。以下是如何通过 RESTful 请求或使用 Python 客户端来查找 ID 为 ien9292voewew 的文档的方…...
MATLAB下的四个模型的IMM例程(CV、CT左转、CT右转、CA四个模型),附下载链接
基于IMM算法的目标跟踪。利用卡尔曼滤波和多模型融合技术,能够在含噪声的环境中提高估计精度,带图像输出 文章目录 概述源代码运行结果代码结构与功能1. 初始化2. 仿真参数设置3. 模型参数设置4. 生成量测数据5. IMM算法初始化6. IMM迭代7. 绘图8. 辅助函…...
无人机之中继通信技术篇
一、定义与原理 无人机中继通信技术是指通过无人机搭载中继设备,将信号从一个地点传输到另一个地点,从而延长通信距离并保持较好的通信质量。其原理类似于传统的中继通信,即在两个终端站之间设置若干中继站,中继站将前站送来的信号…...
阳光保险隐忧浮现:业绩与股价双双而下,张维功能否力挽狂澜?
10月28日晚间,作为国内新生代险企,也是一家赴港上市的保险集团——阳光保险(HK:06963)一口气对外正式披露了三则财务报告,分别是集团旗下阳光人寿和阳光财险今年前三季度未经审议的财务数据,以及截至三季度…...
【OJ题解】在字符串中查找第一个不重复字符的索引
💵个人主页: 起名字真南 💵个人专栏:【数据结构初阶】 【C语言】 【C】 【OJ题解】 目录 1. 引言2. 题目分析示例: 3. 解题思路思路一:双重循环思路二:哈希表 4. C代码实现5. 代码详解6. 时间和空间复杂度分析7. 优化方…...
处理配对和拆分内容 |【python技能树知识点1~2 习题分析】
目录 一、编程语言简史(配对)题目要求:程序设计: 二、 编程语言发明家(拆分)题目要求程序实现while和for循环 python技能树知识点中的一些习题练习和分析。熟悉python编程模式和逻辑。 一、编程语言简史&am…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
