linux下的deamon进程

字体: | 打印

 设计一个linux下的deamon进程,关键只有几个:

    1.fork两次。
    2.fork第一次和第二次之间成为进程组头。
    3.改变工作目录。
    4.忽略信号。
    5.设置读写掩码。

    一下是一个从网络搜集到的例程,非常好的演示了上述要点,存此备忘。

QUOTE:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <syslog.h>

void main(int argc, char ** argv)
{
    time_t now;
    int childpid, fd, fdtablesize;
    int error, in, out;

    /*忽略终端 I/O信号,STOP信号*/
    signal(SIGTTOU,SIG_IGN);
    signal(SIGTTIN,SIG_IGN);
    signal(SIGTSTP,SIG_IGN);
    signal(SIGHUP,SIG_IGN);

    /*父进程退出,程序进入后台运行*/
    if( fork()!=0 )
    {
        exit(1);
    }
    if( setsid()<0 )
    {
        exit(1); /*创建一个新的会议组*/
    }

    /*子进程退出,孙进程失去控制终端了*/
    if( fork()!=0 )
    {
        exit(1);
    }
    if( chdir("/tmp")==-1 )
    {
        exit(1);
    }

    /*关闭打开的文件描述符,包括标准输入、标准输出和标准错误输出*/
    fd=0;
    for(fdtablesize=getdtablesize(); fd< fdtablesize;fd++)
    {
        close(fd);
    }

    umask(0);/*重设文件创建掩码*/
    signal(SIGCHLD,SIG_IGN);/*忽略SIGCHLD信号*/

    /*此处,可以做自己想做的服务例程代码。一般是一个死循环,如果要可以控制的退出的话,可以设置获取信号。下面示例一下一个写log的例程
    */

    /*写log,测试结果*/
    syslog(LOG_USER|LOG_INFO,"守护进程测试!\n");

    while(1)
    {
        time(&now);
        syslog(LOG_USER|LOG_INFO,"当前时间:\t%s\t\t\n",ctime(&now));
        sleep(6);
    }
}
  上述程序在gcc4.0.1下编译通过,在fc4-2.6.11下稳定运行。

  syslog将连接syslogd这个服务,在/var/log/message这个文件里面输出消息,所以需要启动syslogd服务。否则在/var/log/message这个文件里面不会有显示。