LINUX Daemon程序设计

本文详细介绍了Linux下Daemon程序的设计原则及实现方法,包括通过fork和setsid创建后台进程、文件描述符处理、日志记录机制及Shell脚本管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

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

}

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 (&current_time);            /* Get current time */

        tm = localtime (&current_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;

}

Daemon 管理

Daemon 程序可以使用 service 工具进行管理,包括启动、停止、查看状态等,但前题是需要编写一个如下的简单 SHELL 脚本。

# /etc/rc.d/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 0

 

RETVAL=0

prog="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 1

esac

 

exit $RETVAL

 

OK ,到这儿为止,一个完整的 Linux Daemon 程序就完成了。

参考文献

[1] Linux C 高级程序员指南 / 毛曙福编著,北京,国防工业出版社, 2001.2

[2] CASTOR NS 源代码 http://castor.web.cern.ch/castor/

[3] 若干网络文献

### 回答1: Linux守护进程(daemon)是在后台运行的一种进程,它不与任何终端或控制台交互,而是在系统启动时启动并一直运行,直到系统关闭。它通常用于执行一些系统级任务,如网络服务、日志记录、备份等。Linux守护进程的特点是稳定、可靠、高效,可以在不影响系统性能的情况下长时间运行。 ### 回答2: Linux中的守护进程(daemon)是一种在后台运行的特殊类型进程。与普通进程相比,守护进程没有终端依附,也没有用户交互界面。它通常在系统启动时自动启动,持续运行以提供特定的服务。 守护进程的一个重要特点是与特定任务相关联。例如,网络服务守护进程可以为网络请求提供响应,日志守护进程可以定期记录系统日志。同时,守护进程还可以执行系统维护、定时作业、资源监控等任务。 守护进程的实现基于fork()系统调用和一些特定的处理。当一个守护进程启动时,它会先调用fork()创建一个子进程,然后父进程退出,子进程成为守护进程并脱离终端。接下来,守护进程会改变当前工作目录、重设文件权限、关闭不需要的文件描述符、重定向标准输入输出等,以确保它可以无阻塞地运行。 由于守护进程主要在后台运行,所以它没有交互界面。一般情况下,守护进程使用配置文件来配置自身的行为,这些配置文件可以在运行时通过修改来进行调整。此外,守护进程通常会以系统日志的形式记录自己的运行状态,方便系统管理员进行故障排查和性能优化。 总的来说,Linux中的守护进程是为了提供特定服务或执行特定任务而设计的一种后台进程。它以无终端、无交互界面的方式运行,可以自动启动并持续提供服务。守护进程在系统管理中起到了至关重要的作用,为系统运行的稳定性和功能提供了有力的支持。 ### 回答3: Linux守护进程(daemon)是在后台运行的程序,它以无人值守的方式工作,不会与用户交互。守护进程在Linux系统中是非常常见的,用于执行系统任务、管理服务等。 Linux守护进程具有以下特点: 1. 后台运行:守护进程在后台运行,不占用用户的终端,并且不需要用户的干预。它通常作为服务或系统进程运行,负责在系统启动时启动、停止和管理其他进程。 2. 无人值守:守护进程在运行期间没有用户的输入,完全自主工作。它通常会周期性地执行任务或响应特定的事件,例如系统日志记录、定时任务的执行等。 3. 脱离终端:守护进程不会与用户的终端进行交互,没有标准输入或标准输出。这使得守护进程能够在后台运行,从而不受用户登录和注销的影响。 4. 无需用户干预:守护进程在执行期间不需要用户干预。它可以自主地调整自身的行为,根据需要进行启动、停止和配置其他进程。 5. 生命周期:守护进程在系统启动时自动启动,并在系统关闭时停止。它会一直保持运行,直到系统关机或管理员手动停止。 守护进程的典型应用包括Web服务器、数据库服务器、邮件服务器等。它们能够在后台稳定运行,提供服务并处理请求,为用户提供无干扰的服务。与用户交互的程序通常是通过与守护进程进行通信,将用户请求传递给相应的处理程序完成相应的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值