快速业务通道

UNIX文件的共享

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-03-30
在使open函数

自动创建文件时,即不带选项 O_CREAT,O_EXCL(如果文件已经存在,则出错.如果不存在则创建该文件),以避免抹掉原有文件的记录.

  1. if ((fd=open(pathname, O_WRONLY)) < 0) {
  2. if(errno == ENOENT) { //no such file or directory
  3. if ((fd = creat(pathname, mode)) < 0)
  4. err_sys(“creat error”);
  5. } else {
  6. err_sys(“open error”);
  7. }
  8. }

同样在open和creat之间也可能导致问题.例如进程A执行open没有检测到原有文件,然后调度到进程B创建文件并写入了一些东西.这是进程A继续执行creat部分,新创建的文件会清除进程B创建的文件.需要引入记录锁机制(APUE Chapter 14.3).

记录锁record locking的功能是:当一个进程读或者修改文件的某个部分时,阻止其他进程修改同一文件.UNIX系统内核没有使用文件记录的概念,更适合的而属于应该是字节范围锁,它锁定的只是文件的一个区域.

Linux2.4 以上的内核支持flock函数(锁住整个文件), fcntl记录锁和lockf.

  1. #include <fcntl.h>
  2. int fcntl(int filedes, int cmd, …/*struct flock */);
  3. struct flock{
  4. short l_type; /*F_RDLCK, F_WRLCK or F_UNLCK*/
  5. /*共享读锁,独占性写锁和解锁一个区域*/
  6. off_t l_start; /*offset in bytes, relative to l_whence*/
  7. /*要加锁的区域起始字节偏移量*/
  8. short l_whence; /*SEEK_SET, SEEK_CUR, SEEK_END*/
  9. off_t l_len; /*length, in bytes; 0 means lock to EOF*/
  10. /*为了锁住整个文件需要将whence,start设为SEEK_SET 0, l_len为0*/
  11. pid_t l_pid; /*returned with F_GETLK*/
  12. };

锁的类型分为两种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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号