linux文件锁详解(设计文件很底层的操作)
linux低级文件编程中也讲到 多用户多任务操作系统中非常重要的一个内容就是文件锁.用户在更新文件时,期望可以使用某种机制,防止两种进程同时更新文件同一区域而造成丢失,或者防止文件内容在未更新完毕时被读取等并发引起的问题,这种机制就是文件锁. 进程在操作文件期间,可以使用文件锁,锁定文件中的敏感部分,防止其他进程越权操作该部分数据.函数fcntl提供了对文件任意区域置锁的能力,既可以锁住全部文件,又可以锁住文件的部分记录,故文件锁又成为"记录锁". 根据文件锁的访问方式,可以区分读锁和写锁两种.读锁又名共享锁,它用来防止进程读取的文件记录被更改.文件记录可以同时设置多个读锁,但当有一个读锁存在时,就不能在该记录出设置写锁. 写锁又名互斥锁,它用来保证文件更改记录时不被干扰,确保文件一致性和完整性,防止写丢失或读"脏"数据.文件记录一旦设置了写锁,就不能再设置任意锁,除非写锁接触. 文件记录在同一时刻,可以设置多个读锁,单仅能设置一个写锁,并且读、写不能不能同时存在. 当函数fntl专用于锁操作时,其原型为: int fcntl(int fildes,int cmd,struct flock *arg); 其中,结构flock用于描述文件锁的信息,定义于"fcntl.h"中,如下表示:
当函数fcntl专用于锁时,参数cmd的三种取值: F_GETLK F_SETLK F_SETLKW {文件锁最典型的应用于两个方面:一个锁定文件中的临界数据,比如并发投票时文件记录的投票数;二是利用具有互斥性质的写锁,实现进程的并发控制} 2)文件锁操作 在锁机制的使用中,最常见的操作有锁的请求、释放和测试等,这些操作代买基本类似 以下函数都是作者自己做的封装: (1)测试锁 设计函数SeeLock,它查询文件描述符fd对应文件的锁信息,其原型为: void SeeLock(int fd,int start,int len); 函数查询描述符fd对应文件从偏移start出开始的len字节中的锁信息
(2)申请读锁 共享锁申请函数GetReadLock,原型为: void GetReadLock(int fd,int start,int len); 以阻塞模式在文件描述符fd相应的文件中申请共享读锁,锁定的区域从偏移start处开始的len字节
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |