博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux文件锁flock
阅读量:7082 次
发布时间:2019-06-28

本文共 1010 字,大约阅读时间需要 3 分钟。

Linux文件锁flock

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

 

来源:

 

转载地址:http://hrlml.baihongyu.com/

你可能感兴趣的文章
树的高度
查看>>
iOS.KVC.setValue:forKey:
查看>>
转:设计模式六大原则(3):依赖倒置原则
查看>>
转:快速排序的一个小问题没想明白,求助各位
查看>>
eclipse rcp 打包出适合不同操作系统和操作位数.
查看>>
简单的个人博客建站
查看>>
使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)...
查看>>
POJ 3080 Blue Jeans、POJ 3461 Oulipo——KMP应用
查看>>
python3中input()方法报错traceback变量未定义的解决方法
查看>>
animation渐进实现点点点等待效果实例页面
查看>>
配置 ssh无密码登陆
查看>>
java读取和写入浏览器Cookies
查看>>
熟悉常用的HDFS操作
查看>>
SCM软件配置管理 (一)SVN 与 CVS
查看>>
js闭包
查看>>
CocoaPods Setting up CocoaPods master repo无反应时的处理
查看>>
linux驱动系列之s3c2440内存布局
查看>>
asp.net上传文件大小限制
查看>>
javascript基础拾遗——词法作用域
查看>>
该来的年终总结,还是来了
查看>>