发信人: 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)
页面执行时间:4.027毫秒