(from http://blog.csdn.net/liuben/archive/2008/03/21/2204418.aspx)

引言

Daemon程序,又称为守护进程,通常在系统后台长时间运行,由于没有控制终端而无法与前台交互。Daemon程序一般作为系统服务使用,Linux系统中运行着很多这样的守护进程,如iptablesnfsypbinddhcpd等。

Daemon设计原则

Daemon程序设计主要原则包括:

(1)       程序运行后调用fork,并让父进程退出。子进程获得一个新的进程ID,但继承了父进程的进程组ID

(2)       调用setsid创建一个新的session,使自己成为新session和新进程组的leader,并使进程没有控制终端(tty)

(3)       设置文件创建mask0,避免创建文件时权限的影响。

(4)       关闭不需要的打开文件描述符。因为Daemon程序在后台执行,不需要于终端交互,通常就关闭STDINSTDOUTSTDERR。其它根据实际情况处理。

(5)       Daemon无法输出信息,可以使用SYSLOG或自己的日志系统进行日志处理。(可选)

(6)       编写管理DaemonSHELL脚本,使用serviceDaemon进行管理和监控。(可选)

Daemon程序框架

int init_daemon(void)

{

  pid_t pid;

  int i;

 

  /* parent exits , child continues */

  if((pid = fork()) < 0)

    return -1;

  else if(pid != 0)

    exit(0);

 

  setsid(); /* become session leader */

 

  for(i=0;i< NOFILE ;++i) /* close STDOUT, STDIN, STDERR, */

    close(i);

 

  umask(0); /* clear file mode creation mask */

  return 0;

}

 

void sig_term(int signo)

{

  if(signo == SIGTERM)  /* catched signal sent by kill(1) command */

  {

     wsio_logit("", "wsiod stopped\n");

     exit(0);

 }

}

 

/* main program of daemon */

int main(void)

{

if(init_daemon() == -1){

printf("can't fork self\n");

exit(0);

  }

  wsio_logit("", "wsiod started\n");

  signal(SIGTERM, sig_term); /* arrange to catch the signal */

 

  while (1) {

    // Do what you want here

    … …

  }

  exit(0);

}