发信人: tcpip (俺的昵称改了), 信区: cnunix
标 题: 本地进程间通信第一讲:文件加锁(四)
发信站: 哈工大紫丁香 (Sun Sep 26 15:12:43 1999), 转信
发信人: cpu (奔腾的心), 信区: Solaris
发信站: 华南网木棉站 (Fri Jul 31 20:02:43 1998), 转信
3.用link调用。link为一个已经存在的文件建立另一个新的链接名,若该
链接名已经在文件系统中,则link调用失败。利用这一特性也可以实现临
时文件锁:首先建立一个唯一的临时文件(可基于进程ID),然后试图链
接该临时文件到一”众所周知“的锁名称,若链接成功,则锁操作成功。
即该方法涉及到两个临时文件:一个标识请求锁的进程,另一个就是合作
进程争相链接的互斥资源:锁名称。比较麻烦呵呵,相信大家和我一样,
都不喜欢这种方式的锁;)。
以下是利用link调用实现lockfile和unlockfile的lockfile.c:
/* lockfile.c using link, by cpu */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#define TRUE 0
#define FALSE -1
char whoami[64];
char lockname[64];
int lockfile(char *file)
{
int fd;
int timeout = 0;
spinrtf(whoami, "%d.lck", getpid( ));
sprintf(lockname, "%s.lck", file); /* use file.lck as lock */
if ((fd = creat(whoami, 0444)) < 0) {
perror("create");
exit(-1);
}
close(fd);
while (link(whoami, lockname) < 0) {
if (++timeout == 10) return FALSE;
usleep(500000);
continue;
}
return TRUE;
}
int unlockfile(char *file)
{
sprintf(lockname, "%s.lck", file);
return(unlink(lockname));
}
--
******************************************************
青岛啤酒,可能是世界上最好的啤酒 。。。 。。。
******************************************************
※ 修改:.trueip 于 Sep 26 15:16:30 修改本文.[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.337毫秒