`

LINUX Daemon程序设计

阅读更多

引言

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

Daemon 设计原则

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 程序框架

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] 若干网络文献

分享到:
评论

相关推荐

    编写Linux系统下Daemon程序的方法步骤

    在Linux系统中,Daemon程序是不可或缺的一部分,它们作为后台服务长期运行,提供各种系统功能和服务。Daemon不依赖于任何终端,通常在系统启动时启动,系统关闭时终止。这类程序通常用于网络服务(如HTTP服务器)、...

    linux daemon monitor

    "daemonup-0.92"可能是一个具体的守护进程监控程序的版本号,这表明存在一个名为"daemonup"的工具,版本为0.92,专门设计用于监视和管理Linux环境中的守护进程。用户可以通过安装和配置这个工具来实现对Apache服务器...

    Linux程序设计-大纲-实验.docx

    《Linux程序设计》课程主要涵盖了Linux操作系统的基础知识、Shell编程、C程序设计以及网络程序设计等多个方面,旨在培养学生的Linux操作系统应用能力、系统程序设计能力和网络编程能力。以下是该课程的详细知识点...

    linux程序设计(第3版)

    《Linux程序设计(第3版)》是一本深入探讨Linux环境下程序开发的经典著作。这本书针对的是那些希望在Linux操作系统上进行高效程序设计的开发者。它不仅涵盖了基础的编程概念,还详细介绍了Linux系统调用、文件I/O、...

    用法PHP脚原来写Daemon程序_.docx

    这是因为Daemon程序可能需要在运行过程中创建或修改文件,而继承的文件权限掩码可能对这些操作产生限制。 除此之外,还需要注意以下几点: - **重定向标准输入、输出和错误流**:通常,Daemon进程需要将标准输入、...

    Linux高级程序_进程管理

    本教程主要探讨的是Linux高级程序设计中的进程管理,涉及到如何创建、控制、监控以及管理进程,特别是关于守护进程(Daemon)的深入理解。 首先,我们要了解什么是进程。在Linux中,进程是程序的执行实例,每个进程...

    史上最强的嵌入式底层驱动开发课程 Linux系统开发+Linux高级程序+主板开发+ARM等

    │ ├38 - Linux高级程序_进程管理_Daemon2.avi │ ├39 - Linux高级程序_进程管理_Daemon3.mp4 │ ├40 - Linux高级程序_进程间通信_Pipe1.avi │ ├41 - Linux高级程序_进程间通信_Pipe2.mp4 │ ├42 - Linux高级...

    arm linux 嵌入式 查proc的软看护程序 daemon.rar

    标题中的"arm linux 嵌入式 查proc的软看护程序"提到了在ARM架构的Linux系统上,通过`/proc`文件系统来管理软看门狗服务。`/proc`是一个虚拟文件系统,它提供了一个查看和修改内核状态的接口。 软看门狗守护进程...

    daemontool4.11中文完美版daemontool4.11中文完美版

    Butler开发,最初是为Linux系统设计的,但现在也适用于其他类UNIX系统,包括Windows。它的核心功能包括服务的自动启动、停止、监视和日志管理。对于系统管理员来说,这是一个不可或缺的工具,能够帮助他们确保系统...

    socket_daemon.rar_daemon_linux 守护进程_socket daemon._守护进程_服务 守护

    在IT行业中,守护进程(Daemon)是Linux操作系统中的一种特殊进程,它在后台运行,没有控制终端,并且通常在系统启动时启动,提供持续的服务。守护进程常用于网络服务,如HTTP服务器、FTP服务器等。Socket是网络通信...

    Linux应用程序开发指南:使用Gtk+ Gnome库

    总之,Linux应用程序开发指南:使用Gtk+ Gnome库是一门涉及多方面技术的知识体系,包括图形界面设计、事件处理、系统集成、调试技巧以及项目构建。熟练掌握这些技能,开发者就能创建出符合Gnome标准、功能强大且用户...

    Linux远程监控设计与实现

    - 服务器程序为守护进程(daemon)。 - 采用多线程技术,支持向多个监控中心报告数据。 7. **客户端功能**: - 发送鉴权信息。 - 显示服务器状态。 - 刷新服务器系统信息。 8. **时序图**: 描述了客户端与...

    daemon4.30.4-lite

    守护进程(Daemon)在计算机术语中,是指一种在后台运行并且不与终端直接关联的程序。它们通常在操作系统启动时启动,负责执行特定任务,如网络服务、定时任务、系统监控等。在Unix和类Unix系统中,如Linux,守护...

    linux编程.pdf

    - **概述**:探讨了守护进程(Daemon)的概念、启动方式及其管理。 - **学习要点**: - 守护进程的特点和用途。 - 守护进程的启动过程。 - 错误输出的处理方法。 - 创建守护进程的步骤。 #### 四、进程间通信 ...

    深入Linux内核.pdf

    内核从2.0开始,Linux增加了对模块的支持,而模块是指在引导的时候不被持久的装入内存的大程序,它们只是在需要的时候才被装入,而当它们有一段时间不使用时,便从内存中退出。 Enable loadable module support:...

    嵌入式Linux应用程序开发详解

    ### 嵌入式Linux应用程序开发详解:关键...以上概述了嵌入式Linux应用程序开发中的关键知识点,从底层硬件选择、操作系统配置到应用程序设计和测试,每一步都需要深入理解和精心设计,以确保最终产品的稳定性和效率。

    Linux远程监控设计与实现.pdf

    * 服务器是一个 daemon 程序。 * 服务器采用多线程的编程技术,可以同时支持向多个监控中心汇报数据。 4.2 客户端功能 * 客户端发送用户名/密码,通过服务器鉴权。 * 显示服务器状态。 * 刷新服务器系统信息。 ...

    嵌入式Linux应用程序开发详解第7章进程控制开发_castle4qn_linux_

    在嵌入式Linux系统中,应用程序的开发是一个关键环节,特别是在涉及进程控制的时候。本章节主要探讨了如何在Linux环境下进行进程的创建、管理、通信以及同步等操作,这些都是实现高效、稳定系统运行的核心技术。 一...

    ftdi-daemon-0.4.tar.gz_daemon

    在给定的“ftdi-daemon-0.4.tar.gz”压缩包中,我们有一个名为“ftdi-daemon”的程序,它是针对Multiclet Evolution Board特定设计的USB驱动加载守护进程(daemon)。 守护进程是一种在后台运行且不与终端关联的...

Global site tag (gtag.js) - Google Analytics