发信人: tcpip (俺的昵称改了), 信区: cnunix
标  题: 本地进程间通信第一讲:文件加锁(一)
发信站: 哈工大紫丁香 (Sun Sep 26 15:09:41 1999), 转信

发信人: cpu (奔腾的心), 信区: Solaris
发信站: 华南网木棉站 (Fri Jul 31 16:01:47 1998), 转信

注:此系列乃本人偷闲之作,写作时间仓促,因此未必够详尽,肯定有错误
不足之处,欢迎RE上来活跃本板讨论气氛,看见本板也有文章上了十大,俺
cpu心里边那个甜哪。。。

某些时候几个有合作关系的进程需要共享同一个文件,一起读没什么问题,
但是一起写的时候呢?呵呵,的确有必要提供一种机制,保证一个进程想痛
痛快快地写一回的时候,中间不要有别的进程插进来呵呵,文件加锁就提供
这样一种互斥的机制,保证了合作进程写共享资源的“完整性”。

下面详细介绍几种文件锁建立的方法:

一:4.3BSD的指导性封锁

     #include <sys/file.h>

     int flock( fd, operation)
     int fd, operation;
     fd是个打开文件的描述符,operation则是锁的性质,有以下几种:
        LOCK_SH:共享锁
        LOCK_EX:互斥锁
        LOCK_UN:解除封锁
        LOCK_NB:非阻塞性操作选项

这是一个BSD风格的调用,在solaris下面可以用/usr/ucb/cc来编译相关模
块。flock主要提供对已经打开的文件的“指导性封锁”,泥调用了flock,
就是通知操作系统:偶用着fd关联的文件呢,让哥们儿都注意一下。。。
呵呵,要是有哥们儿不守规矩那也就没法子了,所以叫“指导性”封锁;)

一个打开的文件可以同时有几个公享锁,但是只能有一个互斥锁。主要用到
的是互斥锁,偶实在想不出共享锁有什么大的用处呵呵,欢迎补充!!至于
非阻塞操作,是相对于阻塞操作而言,阻塞操作会一直等待操作系统返回一
个确切的结果,而非阻塞的操作当操作不成功时立即返回,此时全局变量
errno的值为EWOULDBLOCK,几乎所有的非阻塞调用都是这个样子了,有这个
选项,泥就可以灵活地根据程序需要来确定你的调用方式,比如

        result = flock(fd, LOCK_EX | LOCK_NB);
        if (result == -1 && errno == EWOULDBLOCK) {
                ...
        }
就是要求非阻塞的方式得到互斥锁。对于相互合作的进程,每一次的写事务
必须包含三个步骤:加锁,写公享文件,解锁,下面给出阻塞调用的例子:

        ...
        if (flock(fd, LOCK_EX) == -1) {
                perror("flock LOCK_EX");
                ...
        }
        write something into file ...;
        if (flock(fd, LOCK_UN) == -1) {
                perror("flock LOCK_UN");
                ...
        }
        ...

--

        ******************************************************
                
               青岛啤酒,可能是世界上最好的啤酒 。。。 。。。

        ******************************************************
※ 修改:.trueip 于 Sep 26 15:13:28 修改本文.[FROM: dns.mtlab.hit.ed]
--
※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: dns.mtlab.hit.ed]

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: trueip.bbs@melon.gzn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.184毫秒