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

全部博文(200)

文章存档

2009年(12)

2008年(190)

我的朋友

分类:

2008-12-25 19:09:12

13.6 daemon conventions

其实就是一些damnon的特点:

1Daemonlockfile一般都位于/var/run下,格式为daemonname.pid,且内容为pid.一般这个目录只有root有权限建立文件。

2Daemon的启动一般都是自动的,由init来启动,需要在/ect/init.d/* 或者/etc/rc*里面的script里启动。当然也可以在命令行里手动启动。

3Daemon如果有配置文件,一般都在/etc目录下,格式为daemonname.conf

4. 一般daemon在启动的时候读取conf文件,但是最好在运行过程中,也能够接收到请求重新读取配置文件,一般都是通过接收SIGHUP信号后来读取配置文件的。

 

我们说由于我们不想打断当前daemon的执行,我们可以使用多线程,一个线程专门用来负责为daemon处理信号,而其他的线程将所有信号屏蔽。当然也可以不用多线程。这就要求最好在处理信号的时候占用较少的时间。此外,由于类unix系统中对多线程的实现各不相同,因此你很难确定究竟要将这个信号发给哪个pid,当然,目前我用的suse是严格按照posix的规定来做的,我们可以用多线程来处理信号并重新读取配置文件。

如下就是一个使用多线程来接收信号并重新读取配置文件的例子;

#include "apue.h"

#include

#include

 

sigset_t    mask;

 

extern int already_running(void);

 

void

reread(void)

{

    /* ... */

}

 

void *

thr_fn(void *arg)

{

    int err, signo;

 

    for (;;) {

        err = sigwait(&mask, &signo);

        if (err != 0) {

            syslog(LOG_ERR, "sigwait failed");

            exit(1);

        }

 

        switch (signo) {

        case SIGHUP:

            syslog(LOG_INFO, "Re-reading configuration file");

            reread();

            break;

 

        case SIGTERM:

            syslog(LOG_INFO, "got SIGTERM; exiting");

            exit(0);

 

        default:

            syslog(LOG_INFO, "unexpected signal %d\n", signo);

        }

    }

    return(0);

}

 

int

main(int argc, char *argv[])

{

    int                 err;

    pthread_t           tid;

    char                *cmd;

    struct sigaction    sa;

 

    if ((cmd = strrchr(argv[0], '/')) == NULL)

        cmd = argv[0];

    else

        cmd++;

 

    /*

     * Become a daemon.

     */

    daemonize(cmd);

 

    /*

     * Make sure only one copy of the daemon is running.

     */

    if (already_running()) {

        syslog(LOG_ERR, "daemon already running");

        exit(1);

    }

 

    /*

     * Restore SIGHUP default and block all signals.

     */

    sa.sa_handler = SIG_DFL;

    sigemptyset(&sa.sa_mask);

    sa.sa_flags = 0;

    if (sigaction(SIGHUP, &sa, NULL) < 0)

        err_quit("%s: can't restore SIGHUP default");

    sigfillset(&mask);

    if ((err = pthread_sigmask(SIG_BLOCK, &mask, NULL)) != 0)

        err_exit(err, "SIG_BLOCK error");

 

    /*

     * Create a thread to handle SIGHUP and SIGTERM.

     */

    err = pthread_create(&tid, NULL, thr_fn, 0);

    if (err != 0)

        err_exit(err, "can't create thread");

    /*

     * Proceed with the rest of the daemon.

     */

    /* ... */

    exit(0);

}

如下是不使用多线程的例子:

#include "apue.h"
#include 
#include 
 
extern int lockfile(int);
extern int already_running(void);
 
void
reread(void)
{
    /* ... */
}
 
void
sigterm(int signo)
{
    syslog(LOG_INFO, "got SIGTERM; exiting");

    exit(0);

}

 

void

sighup(int signo)

{

    syslog(LOG_INFO, "Re-reading configuration file");

    reread();

}

int

main(int argc, char *argv[])

{

    char                *cmd;

    struct sigaction    sa;

    if ((cmd = strrchr(argv[0], '/')) == NULL)

        cmd = argv[0];

    else

        cmd++;

 

    /*

     * Become a daemon.

     */

    daemonize(cmd);

 

    /*

     * Make sure only one copy of the daemon is running.

     */

    if (already_running()) {

        syslog(LOG_ERR, "daemon already running");

        exit(1);

    }

 

    /*

     * Handle signals of interest.

     */

    sa.sa_handler = sigterm;

    sigemptyset(&sa.sa_mask);

    sigaddset(&sa.sa_mask, SIGHUP);

    sa.sa_flags = 0;

    if (sigaction(SIGTERM, &sa, NULL) < 0) {

        syslog(LOG_ERR, "can't catch SIGTERM: %s", strerror(errno));

        exit(1);

    }

    sa.sa_handler = sighup;

    sigemptyset(&sa.sa_mask);

    sigaddset(&sa.sa_mask, SIGTERM);

    sa.sa_flags = 0;

    if (sigaction(SIGHUP, &sa, NULL) < 0) {

        syslog(LOG_ERR, "can't catch SIGHUP: %s", strerror(errno));

        exit(1);

    }

 

    /*

     * Proceed with the rest of the daemon.

     */

    /* ... */

    exit(0);

}

阅读(1320) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~