进程同步:fcntl 文件记录锁

问:为什么要使用文件锁?
答:当多个用户共同使用、操作一个文件的情况时,Linux采用的方法就是给文件上锁,来避免共享的资源产生竞争的状态。

问:文件锁有哪些类型?
答:文件锁包括建议性锁和强制性锁。一般情况下,内核和系统都不适用建议性锁,采用强制性锁的影响很大,每次读写操作都必须检查是否有所存在。

问:建议性锁/强制性锁的定义?
建议性锁是指给文件上锁后,只在文件上设置了一个锁的标识。其他进程在对这个文件进程操作时,可以检测到锁的存在,但这个锁并不能阻止它对这个文件进行操作。这就好比红绿灯,当亮红灯时,告诉你不要过马路,但如果你一定要过,也拦不住你。
强制性锁则是当给文件上锁后,当其他进程要对这个文件进程不兼容的操作(如上了读锁,另一个进程要写),则系统内核将阻塞后来的进程直到第一个进程将锁解开

问:怎样实现文件上锁?
答:在Linux中,实现文件上锁的函数有lockf() 和fcntl() ,其中lockf()用于对文件施加建议性锁,而fcntl() 不仅可以施加建议性锁,而且可以施加强制性锁。fcntl()还能对文件的某一记录上锁,也就是记录锁。记录锁又可分读取锁(共享锁)和写入锁(排斥锁),文件的同一部分不能同时建立读取锁和写入锁。


借助fcntl函数来实现锁机制

int fcntl(int fd, int cmd, .../* struct flock *flockptr */ );2:
   F_GETLK   GET:用来测试锁,注意是测试而不是获取锁
   F_SETLK   SET:用来[非阻塞式]加锁(trylock)、解锁(unlock)
   F_SETLKW  SET:用来[阻塞式]加锁(lock)、解锁(unlock)3struct flock {
      short l_type;    	锁的类型:F_RDLCK共享读锁 、F_WRLCK独占写锁 、F_UNLCK解锁
      
      short l_whence;  	偏移位置:SEEK_SETSEEK_CURSEEK_END 
      off_t l_start;    起始偏移字节数
      off_t l_len;     	长度
      
      //当文件被上锁时,使用测试锁F_GETLK时,l_pid将被赋值为当前对文件加锁的进程的pid
      pid_t l_pid;     	持有该锁的进程ID
    };
    
对整个文件加锁:(l_start=0、l_whence=SEEK_SET)指向文件起始位置,l_len设为0

F_SETLK 、F_SETLKW 加锁 / 解锁
在这里插入图片描述


F_GETLK 测试是否能加type类型的锁
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值