每天进步一点点——Linux文件锁编程flock
转载请注明出处:http://blog.csdn.net/cywosp/article/details/30083015
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3l3b3Nw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
1. 从文件里读取序号。2. 使用这个序号完毕应用程序定义的任务。3. 递增这个序号并将其写回文件里。
为了防止出现这样的情况,Linux提供了flock(对整个文件加锁)、fcntl(对整个文件区域加锁)两个函数来做进程间的文件同步。同一时候也可以使用信号量来完毕所需的同步。但通常使用文件锁会更好一些。由于内核可以自己主动将锁与文件关联起来。
#include <sys/file.h>
// Returns 0 on success, or -1 on errorint flock (intfd,
int operation);
operation能够赋例如以下值:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3l3b3Nw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
下图是进程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()放置的锁。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
每天进步一点点——Linux文件锁编程flock的更多相关文章
- Linux文件锁学习-flock, lockf, fcntl
参考 linux中fcntl().lockf.flock的区别 这三个函数的作用都是给文件加锁,那它们有什么区别呢? 首先flock和fcntl是系统调用,而lockf是库函数.lockf实际上是f ...
- Linux文件锁flock
Linux文件锁flock 在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要锁操作来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock. flock,建议性锁 ...
- linux文件锁flock【转】
转自: https://www.cnblogs.com/kex1n/p/7100107.html linux文件锁flock 在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要 ...
- Linux文件锁flock ,检测进程是否已经存在
在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要锁操作来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock. 头文件:#include<sys/fil ...
- Linux 文件锁flock 实现两个进程相互监听存活状态
表头文件 #include<sys/file.h> 定义函数 int flock(int fd,int operation); 函数说明 flock()会依参数operation所指 ...
- linux系统编程之文件与io(五)
上一节中已经学习了文件描述符的复制,复制方法有三种,其中最后一种fcntl还并未使用到,关于这个函数,不光只有复制文件描述符的功能,还有其它一些用法,本节就对其进行一一剖析: fcntl常用操作: 这 ...
- Linux 文件锁
当多个进程同时访问操作同一个文件时,我们怎么保证文件数据的正确性. linux通常采用的方法是文件上锁,来避免共享资源的产生竞争状态. 文件锁包括建议性锁和强制性的锁: 建议性的锁 :顾名思义,相对温 ...
- Linux 系统编程
简介和主要概念 Linux 系统编程最突出的特点是要求系统程序员对它们工作的的系统的硬件和操作系统有深入和全面的了解,当然它们还有库和系统调用上的区别. 系统编程分为:驱动编程.用户空间编程和网络编程 ...
- Linux系统编程【转】
转自:https://blog.csdn.net/majiakun1/article/details/8558308 一.Linux系统编程概论 1.1 系统编程基石 syscall: libc:标准 ...
随机推荐
- poj3764(dfs+Trie树+贪心)
题目链接:http://poj.org/problem?id=3764 分析:好题!武森09年的论文中有道题CowXor,求的是线性结构上的,连续序列的异或最大值,用的办法是先预处理出前n项的异或值, ...
- iOS ,呼叫捕获抛出勉未知方法的障碍
iOS 捕获未知方法的调用,避勉抛出异常 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 ...
- Effective C++:条款38:通过一个复杂的模具has-a要么“基于一些实现”
(一) public继承是"is-a"关联,"has-a"或"依据某物实现出(is-implemented-in-terms-of)"的意思 ...
- 下拉刷新,上拉装载许多其他ListView
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanVuaHVhaG91c2U=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- GCC的使用(编译,链接,运行)
以下这三篇日志非常的好,真的非常的好.介绍使用gcc编译,链接,运行c程序. 1.http://lveyo.iteye.com/blog/240578 2.http://lveyo.iteye.com ...
- auto property synthesis will not synthesize proterty ;it will be implementedby its superclass, use @
Auto property synthesis will not synthesize property 'title'; it will be implemented by its supercla ...
- 远程centos改动yum源
yum -y install unzip发现运行不了,说是找不到unzip的包,搜索发现时由于yum源的问题,那我就改动yum吧, 在网上找到的方法是这么说的: 1. cd /etc/yum.repo ...
- Eclipse 快捷键整理
Alt+/:代码提示Ctrl+/:注释/取消注释Ctrl+D:删除光标所在行Ctrl+K:将光标停留在变量上,按Ctrl+K键可以查找到下一个同样的变量Shift+Ctrl+K:和Ctrl+K查找的方 ...
- 外网SSH访问内网LINUX的N种方法
外网SSH访问内网LINUX的N种方法 http://www.nat123.com/Pages_8_260.jsp 一,动态公网IP环境 1,环境描述: 路由器分配的是动态公网IP,且有路由管理权限, ...
- python : 批量下载R语言库包
soupR.py 代码例如以下 # -*- coding: cp936 -*- import urllib import urllib2 import os, re from BeautifulSou ...