2014学习笔记基本进程通信文件锁.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
【linux学习笔记-13】基本进程通信--文件锁(2009-03-16 14:06:17) 标签:linux 进程通信 文件锁 fcntl() lockf() 代码实例 it 分类:学习公社 在Linux系统中,进程运行在自己的虚拟内存空间中,如何协调不同虚拟地址空间中的进程访问一个非共享资源,文件加锁是基本进程通信方法之一。 可以使用fcntl()、lockf()、flock()实现文件锁,进而实现进程之间的通信。 1.fcntl() 【函数介绍】 调用形式(执行失败返回-1): int fcntl(int fd,int cmd); int fcntl(int fd,int cmd,long arg); int fcntl(int fd,int cmd,struct flock *lock); fcntl()的功能不只是给文件加锁,也可以修改打开文件的性质。对于给文件增加非强制文件锁时,参数lock指向的结构体flock定义如下: struct flock{ ... short l_type; //锁类型,可以为:F_RDLOCK/F_WRLOCK/F_UNLOCK, F_RDLOCK/F_WRLOCK为获得文件锁读/写权限,F_UNLOCK为释放文件锁 short l_whence; //l_start的起始点,可以为SEEK_SET,SEEK_CUR,SEEK_END off_t l_start; //锁的起始偏移值 off_t l_len; //锁定大小 pid_t l_pid; .... }; 该函数返回errno,如果为EAGAIN或者EACCES,表示其他进程已经拥有该文件的锁,本次操作被禁止。其他值的含义略去。 【实例】 #include stdio.h #include unistd.h #include fcntl.h #include errno.h int main(int argc,char* argv[]) { int fd; struct flock lock; int count = 0; if(argc != 2) { printf(Usage: %s filename.\n,argv[1]); return 1; } fd = open(argv[1],O_RDWR); if(fd0) { printf(Open file failed.\n); return 1; } lock.l_type = F_WRLCK; //设置写锁 lock.l_whence = 0; //从文件起始位置开始 lock.l_start = 0; //偏移值为0 lock.l_len = 0; //整篇加锁 while(fcntl(fd,F_SETLK,lock)0) { if(errno == EAGAIN||errno == EACCES) //被其他进程加锁了 { if(++count5) { sleep(1); //加锁申请最多持续5s } else { fcntl(fd,F_GETLK,lock); //否则放弃之前打印当前文件被那个进程加了锁,F_GETLK为获得加锁信息 printf(Pid: %ld process find pid %ld process lock the file %s.\n, (long)getpid(),(long)lock.l_pid,argv[0]); return 1; } } else { printf(Error: exec function fcntl failed.\n); return 1; } } printf(Pid: %ld process locked the file.\n,(long)getpid()); sleep(8); //占用文件的时间,这里可以是对文件的一些操作 printf(Pid: %ld process release the file.\n,(long)getpid()); return 0; } 【执行结果】 如果在main函数中进程获得文件锁以后sleep8秒(时间大于另一个进程申请锁的最大时间): //release after 8 second. gaolu@gaolu-desktop:~$ gaolu@gaolu-desktop:~$ gaolu@gaolu-desktop:~$

文档评论(0)

VnznlfxuRA + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档