分类:
2008-12-25 19:08:45
13.5 single-instance
daemons
这可以看作是一个技巧,即只允许某程序运新一个copy。不允许多个。一般的方法是建立(如果不存在)或者打开(如果已存在)一个特定的文件,且给这个文件加writelock。当程序退出的时候,就自动将写锁给消除了。需要注意的是,file lock 以及file
record lock,是一种kernel机制,它是直接加在v-node上的,所以不管你进程里对一个文件对应了几个descriptor,(如用dup可以复制descriptor),不管你调用了几次open操作(从而在系统中生成了多个file table entry,对应一个v-node),只要你关闭了一个descriptor,或者file
table entry。那么系统就会找到对应的v-node,将加在该文件上的,你这个process的锁去掉。
如果别的进程也来加锁,当然就不行了。
为了能够方便别人知道哪个进程给这个文件加了锁,一般,加锁成功的进程会将自己的进程pid写到这个文件里面。
#include
#include
#include
#include
#include
#include
#include
#include
#define LOCKFILE "/var/run/daemon.pid"
#define LOCKMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
extern int lockfile(int);
int
already_running(void)
{
int fd;
char buf[16];
fd = open(LOCKFILE, O_RDWR|O_CREAT, LOCKMODE);
if (fd < 0) {
syslog(LOG_ERR, "can't open %s: %s", LOCKFILE, strerror(errno));
exit(1);
}
if (lockfile(fd) < 0) {
if (errno == EACCES || errno == EAGAIN) {
close(fd);
return(1);
}
syslog(LOG_ERR, "can't lock %s: %s", LOCKFILE, strerror(errno));
exit(1);
}
ftruncate(fd, 0);
sprintf(buf, "%ld", (long)getpid());
write(fd, buf, strlen(buf)+1);
return(0);
}