本文首发于 2014-08-08 17:55:32

概念

daemon 程序,又称为守护过程,通常在零碎后盾长时间运行,因为没有管制终端而无奈与前台交互。daemon程序个别作为零碎服务应用,Linux零碎中运行着很多这样的守护过程,如 iptables,nfs,ypbind,dhcpd 等。

daemon 程序设计步骤

  1. 程序运行后调用fork,并让父过程退出。子过程取得一个新的过程ID,但继承了父过程的过程组ID。
  2. 调用setsid创立一个新的session,使本人成为新session和新过程组的leader,并使过程没有管制终端(tty)。
  3. 设置文件创建mask为0,防止创立文件时权限的影响。
  4. 敞开不须要的关上文件描述符。因为 daemon 程序在后盾执行,不须要于终端交互,通常就敞开STDIN、STDOUT和STDERR。其它依据理论状况解决。
  5. daemon 无奈输入信息,能够应用SYSLOG或本人的日志零碎进行日志解决。(可选)
  6. 编写治理 daemon 的SHELL脚本,应用service对 daemon 进行治理和监控。(可选)

示例

daemon 程序源码

//这里应用本人的日志零碎,当然也能够应用SYSLOG。#define LOGBUFSZ 256     /*log buffer size*/#define LOGFILE  "/var/log/wsiod.log"  /*log filename*/int wsio_logit(char * func, char *msg, ...){        va_list args;        char prtbuf[LOGBUFSZ];        int save_errno;        struct tm *tm;        time_t current_time;        int fd_log;        save_errno = errno;        va_start (args, msg);        (void) time (¤t_time);            /* Get current time */        tm = localtime (¤t_time);        sprintf (prtbuf, "%02d/%02d %02d:%02d:%02d %s ", tm->tm_mon+1,                    tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, func);        vsprintf (prtbuf+strlen(prtbuf), msg, args);        va_end (args);        fd_log = open (LOGFILE, O_WRONLY | O_CREAT | O_APPEND, 0664);        write (fd_log, prtbuf, strlen(prtbuf));        close (fd_log);        errno = save_errno;        return 0;}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<= 2;++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);}

daemon 程序管理脚本

daemon 程序能够应用 service 工具进行治理,包含启动、进行、查看状态等,但前题是须要编写一个如下的简略SHELL脚本,比方 /etc/init.d/wsiod

#!/bin/sh## wsiod         This shell script takes care of starting and stopping wsiod.## chkconfig: 35 65 35# description: wsiod is web servce I/O server, which is used to access files on remote hosts.# Source function library.. /etc/rc.d/init.d/functions# Source networking configuration.. /etc/sysconfig/network# Check that networking is up.[ ${NETWORKING} = "no" ] && exit 0RETVAL=0prog="wsiod"WSIOARGS="-h $HOSTNAME -p 80 -t STANDALONE -k -c -d"start() {        # Start daemons.        echo -n $"Starting $prog: "        daemon /usr/local/bin/wsiod ${WSIOARGS}        RETVAL=$?        echo        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/wsiod        return $RETVAL}stop() {        # Stop daemons.        echo -n $"Shutting down $prog: "        killproc wsiod        RETVAL=$?        echo        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/wsiod        return $RETVAL}# See how we were called.case "$1" in  start)        start        ;;  stop)        stop        ;;  restart|reload)        stop        start        RETVAL=$?        ;;  status)        status wsiod        RETVAL=$?        ;;  *)        echo $"Usage: $0 {start|stop|restart|status}"        exit 1esacexit $RETVAL

daemon 程序指令

由上述脚本可知,该 daemon 程序反对的指令有 start|stop|restart|reload|status ,以启动 daemon 程序为例,指令为:

/etc/init.d/wsiod start

欢送关注我的微信公众号【数据库内核】:分享支流开源数据库和存储引擎相干技术。

题目网址
GitHubhttps://dbkernel.github.io
知乎https://www.zhihu.com/people/...
思否(SegmentFault)https://segmentfault.com/u/db...
掘金https://juejin.im/user/5e9d3e...
开源中国(oschina)https://my.oschina.net/dbkernel
博客园(cnblogs)https://www.cnblogs.com/dbkernel