资源描述:
《【linux学习笔记-13】基本进程通信--文件锁》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、【linux学习笔记-13】基本进程通信--文件锁(2009-03-1614:06:17)标签:linux进程通信文件锁fcntl()lockf()代码实例it分类:学习公社在Linux系统中,进程运行在自己的虚拟内存空间中,如何协调不同虚拟地址空间中的进程访问一个非共享资源,文件加锁是基本进程通信方法之一。可以使用fcntl()、lockf()、flock()实现文件锁,进而实现进程之间的通信。1.fcntl()【函数介绍】调用形式(执行失败返回-1):intfcntl(intfd,intcmd);intfcntl(intfd,intcm
2、d,longarg);intfcntl(intfd,intcmd,structflock*lock);fcntl()的功能不只是给文件加锁,也可以修改打开文件的性质。对于给文件增加非强制文件锁时,参数lock指向的结构体flock定义如下:structflock{...shortl_type;//锁类型,可以为:F_RDLOCK/F_WRLOCK/F_UNLOCK,F_RDLOCK/F_WRLOCK为获得文件锁读/写权限,F_UNLOCK为释放文件锁shortl_whence;//l_start的起始点,可以为SEEK_SET,SEEK_C
3、UR,SEEK_ENDoff_tl_start;//锁的起始偏移值off_tl_len;//锁定大小pid_tl_pid;....};该函数返回errno,如果为EAGAIN或者EACCES,表示其他进程已经拥有该文件的锁,本次操作被禁止。其他值的含义略去。【实例】#include#include#include#includeintmain(intargc,char*argv[]){intfd;structflocklock;intcount=0;if(argc!=
4、2){printf("Usage:%sfilename.",argv[1]);return1;}fd=open(argv[1],O_RDWR);if(fd<0){printf("Openfilefailed.");return1;}lock.l_type=F_WRLCK;//设置写锁lock.l_whence=0;//从文件起始位置开始lock.l_start=0;//偏移值为0lock.l_len=0;//整篇加锁while(fcntl(fd,F_SETLK,&lock)<0){if(errno==EAGAIN
5、
6、errno==E
7、ACCES)//被其他进程加锁了{if(++count<5){sleep(1);//加锁申请最多持续5s}else{fcntl(fd,F_GETLK,&lock);//否则放弃之前打印当前文件被那个进程加了锁,F_GETLK为获得加锁信息printf("Pid:%ldprocessfindpid%ldprocesslockthefile%s.",(long)getpid(),(long)lock.l_pid,argv[0]);return1;}}else{printf("Error:execfunctionfcntlfailed."
8、);return1;}}printf("Pid:%ldprocesslockedthefile.",(long)getpid());sleep(8);//占用文件的时间,这里可以是对文件的一些操作printf("Pid:%ldprocessreleasethefile.",(long)getpid());return0;}【执行结果】如果在main函数中进程获得文件锁以后sleep8秒(时间大于另一个进程申请锁的最大时间)://releaseafter8second.gaolu@gaolu-desktop:~$gaolu@gaolu
9、-desktop:~$gaolu@gaolu-desktop:~$gcc-ofilelocksystemcall2.cgaolu@gaolu-desktop:~$gaolu@gaolu-desktop:~$gaolu@gaolu-desktop:~$gaolu@gaolu-desktop:~$./filelocktestlock.dat&./filelocktestlock.dat&./filelocktestlock.dat&Pid:6270processlockedthefile.[1]6270[2]6271[3]6272gaolu@g
10、aolu-desktop:~$Pid:6271processfindpid6270processlockthefile./filelock.Pid:6272processfind