Linux多进程之间的文件锁详解
2015-09-18 15:38
573 查看
之前对于文件的操作通常在一个进程中完成,最近需要在两个进程中对同一个文件进行操作。故想到了文件锁。linux下可以使用flock()函数对文件进行加锁解锁等操作。简单介绍下flock()函数:
1. 函数原型 int flock(int fd,int operation);
2. 表头文件 #include<sys/file.h>
3. 函数说明:flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。
4. 参数 operation有下列四种情况:
LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。
LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。
LOCK_UN 解除文件锁定状态。
LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。
5. 单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。
6. 返回值 返回0表示成功,若有错误则返回-1,错误代码存于errno。
7. 示例代码:首先运行程序1, 紧接着运行程序2(运行程序1后20秒内要运行程序2否则看不到现象)。现象是程序1执行起来以后,开始倒计时;此时运行程序2会阻塞在加锁处;当程序1运行20秒后关闭文件,并释放文件锁后,程序2会开始运行。
1. 函数原型 int flock(int fd,int operation);
2. 表头文件 #include<sys/file.h>
3. 函数说明:flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。
4. 参数 operation有下列四种情况:
LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。
LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。
LOCK_UN 解除文件锁定状态。
LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。
5. 单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。
6. 返回值 返回0表示成功,若有错误则返回-1,错误代码存于errno。
7. 示例代码:首先运行程序1, 紧接着运行程序2(运行程序1后20秒内要运行程序2否则看不到现象)。现象是程序1执行起来以后,开始倒计时;此时运行程序2会阻塞在加锁处;当程序1运行20秒后关闭文件,并释放文件锁后,程序2会开始运行。
/** * 程序1 */ int main(void) { FILE *fp = NULL; int i = 20; if ((fp = fopen("./file_lock.test", "r+b")) == NULL) //打开文件 printf("file open error!\n"); if (flock(fp->_fileno, LOCK_EX) != 0) //给该文件加锁 printf("file lock by others\n"); while(1) //进入循环,加锁时间为20秒,打印倒计时 { printf("%d\n", i--); sleep(1); if (i == 0) break; } fclose(fp); //20秒后退出,关闭文件 flock(fp->_fileno, LOCK_UN); //文件解锁 return 0; } /** * 程序2 */ int main(void) { FILE *fp = NULL; int i = 0; if ((fp = fopen("./file_lock.test", "r+b")) == NULL) //打开文件 printf("file open error!\n"); flock(fp->_fileno, LOCK_EX); //文件加锁 while(1) //进入循环 { printf("%d\n", i++); sleep(1); } fclose(fp); //关闭文件 flock(fp->_fileno, LOCK_UN); //释放文件锁 return 0; }
相关文章推荐
- Centos7搭建php+mysql环境(整理篇)
- Centos硬件信息查看命令
- CentOS安装JAVA后JAVA版本不对的问题
- 为你的Archlinux Chromium安装flash插件
- Linux系统下MySQL数据库的备份和恢复
- Linux系统函数read说明
- SuperMap iServer 7C(2015) war包在Linux上的WebSphere 部署
- centos下安装Python之MySQLdb
- centos杀死进程命令
- nfs挂载磁盘以及自启动挂载
- CentOS6.4安装Bugzilla
- 组建自己的Linux-01准备环境
- Linux同步机制 - 多线程开发总结
- Linux同步机制 - 多线程开发总结
- Linux系统函数open和close(04)---open函数错误信息获取
- kali-linux 安装流程
- linux管理rpm包
- linux 项目自动部署脚本
- 【Linux】修改环境变量
- linux安装kettle