转自: http://blog.csdn.net/jiang1013nan/article/details/17849499

作者: 鱼翅1013

转发原因: 作者从一个理解的角度描述,真经验

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

转载于:https://www.cnblogs.com/scroot/p/5197331.html

Linux文件锁flock相关推荐

  1. linux使用flock文件锁解决脚本周期内未执行完重复执行

    linux使用flock文件锁解决脚本周期内未执行完重复执行 关于flock flock 是对于整个文件的建议性锁.也就是说,如果一个进程在一个文件(inode)上放了锁,那么其它进程是可以知道的.( ...

  2. linux使用flock解决crontab任务冲突

    Linux的crontab最小的间隔是每分钟执行一次,但是如果在这一分钟之内,之前的命令并没有执行完成呢?这样就会产生冲突.接下来我介绍一个解决冲突的办法,那就是linux的flock文件锁. 格式: ...

  3. [Linux C编程]Linux文件锁

    Linux C 文件锁 Linux系统中,文件上锁的函数有两个flock和fcntl ,前者主要是加建议性锁,后者既可以加建议性锁(默认)也可以加强制性锁,而且它还可以给某一记录进行上锁,即所谓的记录 ...

  4. Linux 文件锁 fcntl 函数详解

    Linux 文件锁 fcntl 函数详解 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); ...

  5. 每天进步一点点——Linux文件锁编程flock

    转载请注明出处:http://blog.csdn.net/cywosp/article/details/30083015 1. 场景概述     在多线程开发中.相互排斥锁能够用于对临界资源的保护,防 ...

  6. Linux文件锁学习-flock, lockf, fcntl

    参考  linux中fcntl().lockf.flock的区别 这三个函数的作用都是给文件加锁,那它们有什么区别呢? 首先flock和fcntl是系统调用,而lockf是库函数.lockf实际上是f ...

  7. linux lockf文件锁存在,进程停止,Linux文件锁学习-flock, lockf, fcntl

    这三个函数的作用都是给文件加锁,那它们有什么区别呢? 首先flock和fcntl是系统调用,而lockf是库函数.lockf实际上是fcntl的封装,所以lockf和fcntl的底层实现是一样的,对文 ...

  8. Linux 文件锁的原理、实现和应用

    文件锁简介 在多数unix系统中,当多个进程/线程同时编辑一个文件时,该文件的最后状态取决于最后一个写该文件的进程.但对于有些应用程序,如数据库,各个进程需要保证它正在单独地写一个文件,这时就要用到文 ...

  9. Linux文件锁内核VFS层源码实现讲解

    此文档主要介绍Linux内核FL_FLOCK和FL_POSIX两种类型的文件锁在VFS层的实现.对强制性锁和租约锁**(lease**)不做过多的讨论.基于的内核版本为3.10.0-862.el7.x ...

最新文章

  1. 清科-2018年中国金融科技领域10强
  2. 运行python需要网吗-python搭建网站(想学Python有什么建议吗?)
  3. kong组件_Kong插件开发工具包
  4. ubuntu mysql emma_ubuntumysql客户端emma中文乱码问题解决_MySQL
  5. 以太坊Sharding FAQ
  6. CentOS7安装redis并配置外网可访问(局域网可参考)
  7. 学姐,来挑战字节最牛部门
  8. zend studio php发布_使用Zend Studio开发PHP项目
  9. MySQL数据库反向生成powerdesigner模型
  10. Flutter之BuilderContext和Widget关系浅析
  11. SQLite 3.7.13的加密解密(三)—— 创建加密解密函数
  12. Centos 6 编译安装 Apache 2.4
  13. Spring IOC核心源码学习
  14. 使用vld查看OPCode
  15. VS2013下载及安装
  16. 编程循迹小车传感器怎么定义_「老丁教乐高EV3基础编程」学完练完本课,足矣应付70%的编程要求...
  17. css 单行文本溢出显示省略号 1
  18. Mac 用py2app将写好的python代码打包成一个app
  19. 触动精灵中return-break-exit的使用总结
  20. 什么东西可以提高睡眠质量、这五款助眠好物助你摆脱困扰

热门文章

  1. 关于USB的8个问题
  2. STM32开发 -- 低功耗模式详解(1)
  3. UNIX再学习 -- 信号处理
  4. 怎么查看ftp服务器的版本信息,查看ftp服务器版本
  5. 压缩命令_Linux环境下文件压缩打包命令详解
  6. TensorFlow for Hackers - Part II
  7. 一起学设计模式-观察者模式
  8. java符号引用 直接引用_JVM的符号引用和直接引用
  9. java客户端服务器代码_Java Socket通信 客户端服务器端基本代码
  10. 双代号网络图基础算法_9个简单数学算法在管理领域的运用