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

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

二:辅助文件锁。辅助文件锁就是要锁住某一文件的时候,建立另一临时
文件来表明该文件已被加锁,此项技术的关键性在于如何使该临时文件被
唯一地创立,比如你有一文件叫yourdata,临时文件叫yourdata.lck,那
么应该保证这个作为锁的yourdata.lck如果已经被一个进程创建了,那么
另外一个进程试图创建它的时候必须失败。

该技术有什么大用处呢?呵呵比如两台工作站共享一磁盘阵列,或通过NFS
共享某一文件系统,两工作站各有一个进程读写共享磁盘阵列或者是NFS上
的同一文件,那么flock还行得通吗?

        进程A调用flock:OS,告诉那一头的哥们儿B,悠着点儿写 ;)
        OS:痴线。。。我有我的打开文件表,他有他的,我做的标记他
            又看不到,孩子,偶们穷,没有共享内存,只有共享的盘。。。
        进程A:oh。。。那就只好在共享盘上作个标记比如钻个窟窿来
            通知那一头的哥们儿呵呵。。

所以这种情况下,应该饶过操作系统,做自己的锁:辅助文件锁。。。

辅助文件锁生成的方法及原理:

1.用open调用,当open的选项同时指定O_CREAT和O_EXCL时,如果该文件
已经存在,open就失败,下面给出一个我常用的模块lockfile.c,里面提
供了加锁和解锁函数:

#include        <stdio.h>
#include        <sys/types.h>
#include        <fcntl.h>
#include        <unistd.h>

#define         LOCKPERMS       0600
#define         TRUE            0
#define         FALSE           -1

char            lock[64];

int lockfile(char *file)
{
        int     fd;
        int     timeout = 0;
        sprintf(lock, "%s.lck", file);
        while ((fd = open(lock, O_RDWR|O_CREAT|O_EXCL, LOCKPERMS)) < 0) {
                if (++timeout == 10) return FALSE;
                usleep(500000);
                continue;
        }
        close(fd);
        return TRUE;
}

int unlockfile(char *file)
{
        sprintf(lock, "%s.lck", file);
        return(unlink(lock));
}

--

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

        ******************************************************
※ 修改:.trueip 于 Sep 26 15:13:54 修改本文.[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)
页面执行时间:2.071毫秒