UNIX文件的共享
在使open函数
自动创建文件时,即不带选项 O_CREAT,O_EXCL(如果文件已经存在,则出错.如果不存在则创建该文件),以避免抹掉原有文件的记录.
同样在open和creat之间也可能导致问题.例如进程A执行open没有检测到原有文件,然后调度到进程B创建文件并写入了一些东西.这是进程A继续执行creat部分,新创建的文件会清除进程B创建的文件.需要引入记录锁机制(APUE Chapter 14.3). 记录锁record locking的功能是:当一个进程读或者修改文件的某个部分时,阻止其他进程修改同一文件.UNIX系统内核没有使用文件记录的概念,更适合的而属于应该是字节范围锁,它锁定的只是文件的一个区域. Linux2.4 以上的内核支持flock函数(锁住整个文件), fcntl记录锁和lockf.
锁的类型分为两种F_RDLCK共享读锁和独占写锁F_WRLCK.基本规则是:多个进程在一个给定的字节上可以有一把共享的读锁,但是在一个给定字节上只能有一个进程独用一把写锁.即如果在某个字节上已经有一把独占性写锁,则不能再对它加任何读锁. 不同进程之间锁请求: 读锁 写锁 无锁 允许 允许 一个或多个读锁 允许 拒绝 一个写锁 拒绝 拒绝 相同进程之间锁请求: 如果一个进程对一个文件区间已经有一把锁,该进程后面又企图在同一文件区间再加一个锁,那么新锁将替换老锁. 加读锁时,该描述副是读打开的.加写锁锁好是写打开的. F_GETLK 判断由flockptr所描述的锁是否会被另一把锁所排斥.如果存在一把锁,它阻止创建由flockptr锁描述锁.如果不存在,则除了将l_type设置为F_UNLCK; F_SETLK F_SETLKW F_SETLK的阻塞版本.如果请求创建的锁已经可用,可进程被唤醒. 锁的隐含集成和释放: (1).进程中止时,所有建立的锁都释放. (2).关闭一个描述符,则该进程通过这一描述符可以引用的任何一把锁(前提是这些锁由该进程设置的)都将释放.例如 fd1=open(pathname, …); read_lock(fd1, …); fd2 = dup(fd1); close(fd2); 释放了fd2,这时fd1设置的锁也会被释放. fork产生的子进程不集成父进程锁设置的锁.子进程需要调用fcntl才能获得自己的锁.这样防止父进程和子进程同时写一个文件. 在执行exec后,新程序可以继承原执行程序的锁.但是注意,如果对一个文件描述符设置了close-on-exec那么exec时关闭文件描述符,相应的文件所有锁都被释放了. 建议锁又称协同锁.对于这种类型的锁,内核只是提供加减锁以及检测是否加锁的操作,但是不提供锁的控制与协调工作.也就是说,如果应用程序对某个文件进行操作时,没有检测是否加锁或者无视加锁而直接向文件写入数据,内核是不会加以阻拦控制的.因此,建议锁,不能阻止进程对文件的操作,而只能依赖于 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |