每天进步一点点——Linux文件锁编程flock
转载请注明出处:http://blog.csdn.net/cywosp/article/details/30083015
1. 从文件里读取序号。2. 使用这个序号完毕应用程序定义的任务。3. 递增这个序号并将其写回文件里。
为了防止出现这样的情况,Linux提供了flock(对整个文件加锁)、fcntl(对整个文件区域加锁)两个函数来做进程间的文件同步。同一时候也可以使用信号量来完毕所需的同步。但通常使用文件锁会更好一些。由于内核可以自己主动将锁与文件关联起来。
#include <sys/file.h>// Returns 0 on success, or -1 on errorint flock (intfd, int operation);
operation能够赋例如以下值:
下图是进程A先设置了锁,进程B后设置锁的支持情况:
在实际操作过程中,參数operation能够指定相应的值将共享锁转换成相互排斥锁(反之亦然)。
将一个共享锁转换成相互排斥锁,假设还有一个进程要获取该文件的共享锁则会堵塞。除非operation參数指定了LOCK_NB标记,即:(LOCK_SH | LOCK_NB)。锁的转换过程不是一个原子操作。在转换的过程中首先会删除既有的锁,然后创建新锁。
此外。锁会在对应的文件描写叙述符被关闭之后自己主动释放。
同一时候,当一个文件描写叙述符被复制时(dup()、dup2()、或一个fcntl() F_DUPFD操作),新的文件描写叙述符会引用同一个文件锁。
flock(fd, LOCK_EX);new_fd = dup(fd);flock(new_fd, LOCK_UN);
从而我们能够得知新的文件描写叙述符指向了同一个锁。所以,假设通过一个特定的文件描写叙述符获取了一个锁而且创建了该描写叙述符的一个或多个副本,那么,假设不显示的调用一个解锁操作,仅仅有当文件描写叙述符副本都被关闭了之后锁才会被释放。
flock (fd, LOCK_EX);if (0 == fork ()) {flock (fd, LOCK_UN);}
通过fork()创建的锁在exec()中会得以保留(除非在文件描写叙述符上设置了close-on-exec标记而且该文件描写叙述符是最后一个引用底层的打开文件描写叙述的描写叙述符)。
fd1 = open ("test.txt", O_RDWD);fd2 = open ("test.txt", O_RDWD);flock (fd1, LOCK_EX);flock (fd2, LOCK_EX);
- 仅仅能对整个文件进行加锁。这样的粗粒度的加锁会限制协作进程间的并发。假如存在多个进程,当中各个进程都想同一时候訪问同一个文件的不同部分。
- 通过flock()仅仅能放置劝告式锁。
- 非常多NFS实现不识别flock()放置的锁。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4748797.html,如需转载请自行联系原作者
每天进步一点点——Linux文件锁编程flock相关推荐
- Linux文件锁学习-flock, lockf, fcntl
参考 linux中fcntl().lockf.flock的区别 这三个函数的作用都是给文件加锁,那它们有什么区别呢? 首先flock和fcntl是系统调用,而lockf是库函数.lockf实际上是f ...
- linux lockf文件锁存在,进程停止,Linux文件锁学习-flock, lockf, fcntl
这三个函数的作用都是给文件加锁,那它们有什么区别呢? 首先flock和fcntl是系统调用,而lockf是库函数.lockf实际上是fcntl的封装,所以lockf和fcntl的底层实现是一样的,对文 ...
- linux系统编程之文件与I/O(六):fcntl 函数与文件锁
2013-05-14 11:26 8290人阅读 评论(2) 收藏 举报 分类: linux系统编程(19) 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.fcntl函数 功能:操纵文 ...
- [Linux C编程]Linux文件锁
Linux C 文件锁 Linux系统中,文件上锁的函数有两个flock和fcntl ,前者主要是加建议性锁,后者既可以加建议性锁(默认)也可以加强制性锁,而且它还可以给某一记录进行上锁,即所谓的记录 ...
- Linux文件锁flock
转自: http://blog.csdn.net/jiang1013nan/article/details/17849499 作者: 鱼翅1013 转发原因: 作者从一个理解的角度描述,真经验 在多个 ...
- linux web高级编程,寒假学习 第16.17天 (linux 高级编程)
寒假学习 第16.17天 (linux 高级编程) 笔记 总结 一.进程的基本控制(进程的同步) 1.进程的常见控制函数 pause sleep/usleep atexit on_exit i ...
- Linux系统编程之文件IO
Linux系统编程之文件IO 文件IO第一天 一.标准IO基本概念 1.1c语言函数 (c库函数) 调用实现某一个功能,(API) 1.2系统调用:内核中的程序接口,应用程序和硬件设备之间的中间层 1 ...
- linux系统编程需要什么,若想成为一名Linux下编程高手,必须能对各种系统调用有透彻的了解...
原标题:若想成为一名Linux下编程高手,必须能对各种系统调用有透彻的了解 什么是系统调用? Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用.用户可以通过系统调用命令在自己的应用 ...
- Linux 系统编程总结 (未完待续)
前言 我记得去年说过要讲一些干货分享给大家,Linux 系统编程是linux 驱动开发入门的条件 有人说为什么? mmap select read write open ioctl socket po ...
最新文章
- Git环境搭建与基本使用方法
- 计算机网络:socket-udp
- 服务器水冷系统仿真,水冷漫谈(三)——水冷散热器仿真方法
- linux update语句,关于Update语句的调整(5-1)
- console对象的方法log、info、warn、error的区别及几个实用的方法
- c# Invoke和BeginInvoke
- 小小的 likely 背后却大有玄机!
- python画折线图代码实现_python如何绘制分布折线图 python绘制分布折线图代码示例...
- STM8 ADC转换模式-------连续模式
- 论文|Item2vec中值得品味的8个经典tricks
- Mac OS 下创建txt文本文件
- 五、隐函数微分法和逆函数导数 六、指数与对数函数导数、对数微分法 七、第一次考试复习
- (坦克警戒大战)技术服务支持
- 30件 鸟logo - 企业logo设计 - logo免费
- 科技学术论文润色经验——分享1
- 阿里巴巴待遇这么好,为什么还有这么多人离职?--转载
- 加密通信(三):CA证书
- 房间类游戏后台框架(三)—大厅服务器
- 白内障手术后诊断PHP,单眼PHPV+先天性白内障患儿, 3岁11个月手术,术后注意事项...
- 匹马抢三关:讯飞翻译机3.0的破障之战
热门文章
- rrdtool 修改水印logo
- CSS有效的编写代码
- VS2005中删除最近打开的项目和文件的记录
- java ftp下载文件源码_java实现ftp文件下载的源代码
- 一键ghost奥运版_超详细的纯净版windows系统重装示例
- matlab与python通信_python和matlab之间数据传输方法
- rocketmq python 一个进程订阅多个topic_玩转不同业务场景,这些RabbitMQ特性会是得力助攻...
- 如何保证接口的幂等性?
- 富国银行是如何为公有云转型做准备的
- 在 Kubuntu 21.04 中安装和升级 KDE Plasma 5.2