Linux多进程之间的文件锁

之前对于文件的操作通常在一个进程中完成,最近需要在两个进程中对同一个文件进行操作。故想到了文件锁。

Linux下可以使用flock()函数对文件进行加锁解锁等操作。简单介绍下flock()函数:

  表头文件  #include

  定义函数  int flock(int fd,int operation);

  函数说明 
flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。

  参数  operation有下列四种情况:

   LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。

  LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。

  LOCK_UN 解除文件锁定状态。

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

  单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。

  返回值  返回0表示成功,若有错误则返回-1,错误代码存于errno。

为了更好的移植性,对于文件的打开与关闭我选择了fopen和fclose的组合,但flock的第一个参数要求的是int类型的文件描述符。这里
对fopen返回的FILE类型的文件指针进行转换,转换为int型的文件描述符(假设open函数返回的文件描述符为fd,而fopen返回的文件指针
为*fp,则fd等价于fp->_fileno).

下面为两个进程的实例:

#include

#include

#include

#include

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;

}

#include

#include

#include

#include

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;

}

首先运行file1.c,紧接着运行file2.c(运行file1.c后20秒内要运行file2.c否则看不到现象)
现象是:file1.c执行起来以后,开始倒计时。此时运行file2.c会阻塞在加锁处。当file1.c运行20秒后关闭文件,并释放文件锁后,file2.c会开始运行。

相关阅读:

Linux多进程多线程互斥同步例子 http://www.linuxidc.com/Linux/2013-01/78394.htm

文件锁和Python多进程的使用 http://www.linuxidc.com/Linux/2012-08/69105.htm

Linux多进程_消息通信_设计思想交流 http://www.linuxidc.com/Linux/2012-02/55454.htm

关于Linux内核中多进程(线程)间同步和互斥 http://www.linuxidc.com/Linux/2011-05/36704.htm

Linux Shell实现多进程并发执行 http://www.linuxidc.com/Linux/2011-03/33918.htm

时间: 2024-11-01 14:40:52

Linux多进程之间的文件锁的相关文章

每天进步一点点——Linux编程中的文件锁之flock

转载请说明出处:http://blog.csdn.net/cywosp/article/details/30083015 1. 场景概述 在多线程开发中,互斥锁可以用于对临界资源的保护,防止数据的不一致,这是最为普遍的使用方法.那在多进程中如何处理文件之间的同步呢?我们看看下面的图: 图中所示的是两个进程在无同步的情况下同时更新同一个文件的过程,其主要的操作是: 1. 从文件中读取序号. 2. 使用这个序号完成应用程序定义的任务. 3. 递增这个序号并将其写回文件中. 从图中可得知两个进程读取分

Windows和linux虚拟机之间联网实现SSH远程连接以及VMware的3种网络模式[NAT、桥接和Host-only]

Windows和linux虚拟机之间联网实现SSH远程连接以及VMware的3种网络模式[NAT.桥接和Host-only] 作者:天齐 一.Windows和linux虚拟机之间联网实现SSH远程连接 假如我们要给主机名为mini1的虚拟机配置ip地址,需要以下几个步骤: 在linux上查看ip地址,如果linux服务器有ip地址,让它的ip地址和windows的ip地址在同一个网段,它们之间才能联网.在linux上查看ip地址的命令为"ifconfig": 发现eth0网卡没有配置i

11.python并发入门(part10 多进程之间实现通信,以及进程之间的数据共享)

一.进程队列. 多个进程去操作一个队列中的数据,外观上看起来一个进程队列,只是一个队列而已,单实际上,你开了多少个进程,这些进程一旦去使用这个队列,那么这个队列就会被复制多少份. (队列=管道+锁) 这么做的主要原因就是,不同进程之间的数据是无法共享的. 下面是使用进程队列使多进程之间互相通信的示例: 下面这个例子,就是往进程队列里面put内容. #!/usr/local/bin/python2.7 # -*- coding:utf-8 -*- import multiprocessing de

Linux系统之间实现ssh无需密码连接

有时候我们需要在Linux系统之间互相传输文件,正常登录系统是需要输入密码,但是在自动化执行的时候如果需要手动输入密码就比较麻烦了,如何实现无需密码,但是又保证系统的安全呢?这就使用到了密钥登录. 环境说明: 两台Linux(CentOS 6.7)系统: balichos   192.168.171.50 balichvm  192.168.171.51 1).分别在balichos和balichvm都安装openssh-clients,可以使用yuminstall openssh-client

Linux 多进程学习

1Linux进程概述 进程是一个程序执行一次的过程,他和程序有着本质的区别.程序是静态的,他是一些保存在磁盘上的指令有序的集合. 进程是动态的概念,他是运行者的程序,包含进程的动态创建,调度和消亡,是Linux的基本调度单位. 进程控制块(PCB)是进程的静态描述,包括进程的描述信息,进程的控制信息,以及资源信息 时间片:他轮流在每个进程的得到的时间片用完后从进程那里千回控制权 1.1进程标识 os会为每一个进程分配一个唯一的盛行ID,作为进程的标识号(pid),还有父进程ID(ppid) 所有

两台Linux机之间传送文件

最近实验室里接管了一台服务器,经常需要用到服务器与自己主机之间进行文件传输,因此,在此介绍一下两台Linux主机之间的一些操作,方便后来者. 1. Linux.Windows主机远程访问Linux服务器: 在服务器上安装vnc server,在客户端机安装vnc viewer,然后参照一些教程做就可以了. 2. 两台Linux主机进行文件上传与文件下载. 为了方便描述,我们称服务器为Linux1,我的主机为Linux2. 2.1 下面我们介绍如何从Linux1 拷贝文件回来到本地PC Linux

Windows系统与Linux系统之间资源samba共享【转】

配置SAMBA服务器来实现在Windows计算机与Linux计算机之间的用户级的资源共享,九河网络TOM[2694339173]教你怎样操作: SAMBA服务器的基本配置 配置SAMBA服务器来实现在Windows计算机与Linux计算机之间的用户级的资源共享 一.安装SAMBA服务 # yum -y install samba samba-client 二.创建samba目录 # mkdir /home/samba # touch /home/samba/hello 三.创建test用户名和密

嵌入式linux多进程编程

在主程序显示文本菜单,提供如下服务,要求每个服务都通过生成子进程来提供. 服务包括:日历信息显示,日期信息显示,判断闰年服务,文件复制功能,数字排序功能,退出功能. 代码和文档(有流程图的下载地址):http://download.csdn.net/download/jingjingxujiayou/7540893 #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <tim

Linux主机之间权限访问与开通

 近段时间,在测试和部署 Greenplum集群,在集群一开始部署的时候,以及后面测试的一些高可用功能时,都涉及到的Linux主机之间的访问权限问题. 在排查好这写问题后,有必要进行一下访问权限的梳理和总结,以便以后避免这个问题. 对于Linux主机而言,主机之间的访问,主要涉及几个问题: IP地址,ssh协议,selinux限制,iptables防火墙,/etc/hosts.allow 服务器限制. 这几个方面相互关联,其中又以ssh协议是核心和关联: ssh 协议决定了服务器连接的端口,