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

 头文件:#include<sys/file.h>
 函数:定义函数 int flock(int fd,int operation);
 
1.阐述
flock,建议性锁,不具备强制性。一个进程使用flock将文件锁住,另一个进程可以直接操作正在被锁的文件,修改文件中的数据,原因在于flock只是用于检测文件是否被加锁,针对文件已经被加锁,另一个进程写入数据的情况,内核不会阻止这个进程的写入操作,也就是建议性锁的内核处理策略。
 
2.flock操作类型
(1)LOCK_SH 共享锁,多个进程可以使用同一把锁,常被用作读共享锁;

(2)LOCK_EX 排他锁,同时只允许一个进程使用,常被用作写锁;

(3)LOCK_UN 释放锁;

(4)LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。

3.应用(供两种工作模式:阻塞与非阻塞类型。)

(1)进程使用flock尝试锁文件时,如果文件已经被其他进程锁住,进程会被阻塞直到锁被释放掉

服务会阻塞等待直到锁被释放:
flock(lockfd,LOCK_EX)

(2)在调用flock的时候,采用LOCK_NB参数,在尝试锁住该文件的时候,发现已经被其他服务锁住,会返回错误,errno错误码为EWOULDBLOCK

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

ret  = flock(lockfd,LOCK_EX|LOCK_NB)

return:ret = -1, errno = EWOULDBLOCK

4.flock所释放:

(1)调用LOCK_UN参数来释放文件锁

(2)关闭该文件的方式来释放文件锁(flock会随着进程的关闭而被自动释放掉)

5.使用flock检测进程是否已经存在

int checkexit(char* pfile){
if (pfile == NULL)
return -1; int lockfd = open(pfile,O_RDWR);//pfile 执行程序所在路径
if (lockfd == -1)
return -2;//打开文件出错 int iret = flock(lockfd,LOCK_EX|LOCK_NB)
if (iret == -1)
return -3;//该进程已经存在 return 0;
}

出处:http://blog.csdn.net/jiang1013nan/article/details/17849499

最新文章

  1. Hadoop伪分布式集群环境搭建
  2. Python之路3【第一篇】Python基础
  3. 【大结局】《从案例中学习JavaScript》之酷炫音乐播放器(四)
  4. Auto Mapper04(MVC中的配置)
  5. The JSP specification requires that an attribute name is preceded by whitespace
  6. EL表达式简介
  7. C#的枚举数(Enumerator)和可枚举类型(Enumerable)
  8. 避免Java应用中NullPointerException的技巧和最佳实践
  9. linux process 相关命令
  10. poj 2892 &amp;&amp;hdu 1540 Tunnel Warfare
  11. 基于.Net的单点登录(SSO)解决方案
  12. JS代码放在head和body中的区别分析
  13. JS属性描述符
  14. python注释中文
  15. Java基础总结--IO总结1
  16. python基础1 day2
  17. Goldwell平台官网简介-欢迎咨询经理罗琪
  18. 识别你的ADFS是什么版本的(Which version of ADFS is running)
  19. Ceph万兆内网与系统万兆迁移
  20. c#4.8-4.11学习总结

热门文章

  1. LeetCode第五题:Longest Palindromic Substring
  2. ABP 学习系列 - 目录
  3. SPI驱动框架-1(DM8127 Linux2.6.37为例)
  4. SQL 由人员汇总到部门树递归合计总数函数
  5. Resque基本
  6. [Chapter 3 Process]Practice 3.2 Including the initial parent process, how many processes are created by the program shown in Figure?
  7. 2015.3.11 VS异步控件及进度条结合应用
  8. Java8 日期和时间实用技巧
  9. DDD学习笔录——简介领域驱动设计的实践与原则
  10. DAY11-MYSQL索引原理与慢查询优化