Chinaunix首页 | 论坛 | 博客
  • 博客访问: 986411
  • 博文数量: 200
  • 博客积分: 5011
  • 博客等级: 大校
  • 技术积分: 2479
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 15:07
文章分类

全部博文(200)

文章存档

2009年(12)

2008年(190)

我的朋友

分类:

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写到这个文件里面。

Figure 13.6. Ensure that only one copy of a daemon is running

#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);

}

阅读(1523) | 评论(0) | 转发(0) |
0

上一篇:13.4 error logging

下一篇:13.6 daemon conventions

给主人留下些什么吧!~~