详解Linux文件锁flock

发布时间 - 2026-01-10 21:57:45    点击率:

在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要锁操作来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock。

flock,建议性锁,不具备强制性。一个进程使用flock将文件锁住,另一个进程可以直接操作正在被锁的文件,修改文件中的数据,原因在于flock只是用于检测文件是否被加锁,针对文件已经被加锁,另一个进程写入数据的情况,内核不会阻止这个进程的写入操作,也就是建议性锁的内核处理策略。

flock主要三种操作类型:

  • LOCK_SH,共享锁,多个进程可以使用同一把锁,常被用作读共享锁;
  • LOCK_EX,排他锁,同时只允许一个进程使用,常被用作写锁;
  • LOCK_UN,释放锁;

进程使用flock尝试锁文件时,如果文件已经被其他进程锁住,进程会被阻塞直到锁被释放掉,或者在调用flock的时候,采用LOCK_NB参数,在尝试锁住该文件的时候,发现已经被其他服务锁住,会返回错误,errno错误码为EWOULDBLOCK。即提供两种工作模式:阻塞与非阻塞类型。

服务会阻塞等待直到锁被释放:

flock(lockfd,LOCK_EX)

服务会返回错误发现文件已经被锁住时:

ret = flock(lockfd,LOCK_EX|LOCK_NB)

同时ret = -1, errno = EWOULDBLOCK

flock锁的释放非常具有特色,即可调用LOCK_UN参数来释放文件锁,也可以通过关闭fd的方式来释放文件锁(flock的第一个参数是fd),意味着flock会随着进程的关闭而被自动释放掉。

flock其中的一个使用场景为:检测进程是否已经存在;

int checkexit(char* pfile)
{
  if (pfile == NULL)
  {  
    return -1; 
  }  
  int lockfd = open(pfile,O_RDWR);
  if (lockfd == -1) 
  {  
    return -2; 
  }  
  int iret = flock(lockfd,LOCK_EX|LOCK_NB);
  if (iret == -1) 
  {  
    return -3; 
  }  

  return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# 文件锁  # linux  # flock  # flock命令  # linux 可执行文件与写操作的同步问题(文件读写操作产生的锁机制)  # 浅析Linux下一个简单的多线程互斥锁的例子  # linux shell之文件锁  # Linux多线程锁属性设置方法  # linux中各种锁机制的使用与区别详解  # 锁住  # 多个  # 加锁  # 第一个  # 两种  # 很容易  # 可以通过  # 三种  # 可以直接  # 可以使用  # 不具备  # 该文件  # 大家多多  # 与非  # 只允许  # 过程中  # 称之为  # 错误码  # strong  # ul 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  如何在万网利用已有域名快速建站?  如何用西部建站助手快速创建专业网站?  Laravel如何配置和使用缓存?(Redis代码示例)  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  如何在腾讯云服务器上快速搭建个人网站?  Laravel如何升级到最新版本?(升级指南和步骤)  JavaScript Ajax实现异步通信  实例解析Array和String方法  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  无锡营销型网站制作公司,无锡网选车牌流程?  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  jquery插件bootstrapValidator表单验证详解  如何在IIS管理器中快速创建并配置网站?  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  Python并发异常传播_错误处理解析【教程】  JavaScript如何实现错误处理_try...catch如何捕获异常?  如何获取免费开源的自助建站系统源码?  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  昵图网官网入口 昵图网素材平台官方入口  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  如何实现javascript表单验证_正则表达式有哪些实用技巧  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  详解Android——蓝牙技术 带你实现终端间数据传输  如何在IIS服务器上快速部署高效网站?  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  Laravel如何实现一对一模型关联?(Eloquent示例)  JavaScript如何实现继承_有哪些常用方法  再谈Python中的字符串与字符编码(推荐)  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel如何使用Eloquent进行子查询  如何快速搭建支持数据库操作的智能建站平台?  做企业网站制作流程,企业网站制作基本流程有哪些?  Android GridView 滑动条设置一直显示状态(推荐)  如何快速生成ASP一键建站模板并优化安全性?  JavaScript实现Fly Bird小游戏  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Laravel怎么在Blade中安全地输出原始HTML内容  怎么用AI帮你为初创公司进行市场定位分析?  如何挑选优质建站一级代理提升网站排名?  Laravel怎么使用artisan命令缓存配置和视图  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  如何快速选择适合个人网站的云服务器配置?