IT猫扑网:您身边最放心的安全下载站! 最新更新| 软件分类| 专题汇总| 手机版

您当前所在位置:IT猫扑网 > 操作系统 > LINUX > linux守护进程daemon

linux守护进程daemon

时间:2015-06-28 00:00 来源:IT猫扑网|http://www.itmop.com/ 作者:网管联盟 我要评论(0)

  Daemon程序简介

  Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程。

  比如,我们的网络服务程序,可以在完成创建套接口,绑定套接口,设置套接口为监听模式后,变成守护进程进入后台执行而不占用控制终端,这是网络服务程序的常用模式。UNIX下的网络服务程序,如Web  Server,FTP,Telnet一般都是由守护进程(Daemon)来实现的。守护进程不占用终端,在后台运行。UNIX的守护进程一般都命名为  *d 的形式,如httpd,telnetd等等。

  守护进程一旦脱离了终端,退出就成了问题。使用 ps axj 查出进程ID然后 kill ID 之。

  Daemon程序编写规则

  编写Daemon程序有一些基本的规则,以避免不必要的麻烦。

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

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

  3、改变当前工作目录至根目录,以免影响可加载文件系统。或者也可以改变到某些特定的目录。

  4、设置文件创建mask为0,避免创建文件时权限的影响。

  5、关闭不需要的打开文件描述符。因为Daemon程序在后台执行,不需要于终端交互,通常就关闭STDIN、STDOUT和STDERR。其它根据实际情况处理。另一个问题是Daemon程序不能和终端交互,也就无法使用printf方法输出信息了。

  另一个问题是Daemon程序不能和终端交互,也就无法使用printf方法输出信息了。我们可以使用syslog机制来实现信息的输出,方便程序的调试。

  下面是一个daemon程序的例子:(daemontest.c)

  view plaincopy to clipboardprint?

  1. #include <unistd.h>

  2. #include <sys/types.h>

  3. #include <sys/stat.h>

  4. #include <stdlib.h>

  5. #include <stdio.h>

  6. #include <syslog.h>

  7. #include <signal.h>

  8. int daemon_init(void)

  9. {

  10.     pid_t pid;

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

  12.     return(-1);

  13.   else if(pid != 0)

  14.     exit(0); /* parent exit */

  15.   /* child continues */

  16.   setsid(); /* become session leader */

  17.   chdir(&/&); /* change working directory */

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

  19.   close(0); /* close stdin */

  20.   close(1); /* close stdout */

  21.   close(2); /* close stderr */

  22.   return(0);

  23. }

  24.

  25. void sig_term(int signo)

  26. {

  27.     if(signo == SIGTERM)

  28. /* catched signal sent by kill(1) command */

  29.   {

  30.     syslog(LOG_INFO, &program terminated.&);

  31.   closelog();

  32.   exit(0);

  33.   }

  34. }

  35.

  36. int main(void)

  37. {

  38.     if(daemon_init() == -1)

  39.   {

  40.     printf(&can't fork selfn&);

  41.     exit(0);

  42.   }

  43.   openlog(&daemontest&, LOG_PID, LOG_USER);

  44.   syslog(LOG_INFO, &program started.&);

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

  46.   while(1)

  47.   {

  48.     sleep(1); /* put your main program here */

  49.   }

  50.   return(0);

  51. }

  使用如下命令编译该程序: gcc -Wall -o daemontest daemontest.c编译完成后生成名为daemontest的可执行程序,执行./daemontest来测试程序的运行。

  使用ps axj命令可以显示系统中已运行的daemon程序的信息,包括进程ID、session ID、控制终端等内容。部分显示内容:

  PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND

  1 17765 17765 17765 ?     -1 Ss 0   0:00 ./daemontest

  从中可以看到daemontest程序运行的进程号为17765。

  我们再来看看/var/log/messages文件中的信息:

  Feb  3 17:09:30 localhost daemontest[17765]: program started.

  显示了我们在程序中希望输出的信息。

  使用kill 17765命令来杀死这个进程,/var/log/messages文件中就会有如下的信息:

  Feb  3 17:12:26 localhost daemontest[17765]: program terminated.

  再使用ps axj命令检查,发现系统中daemontest进程已经没有了。

关键词标签:linux,daemon

相关阅读 安装红帽子RedHat Linux9.0操作系统教程 Tomcat9.0如何安装_Tomcat9.0环境变量配置方法 多种操作系统NTP客户端配置 Linux操作系统修改IP Linux实现SCSI硬盘热插拔及在线识别 Linux下用CDMA modem拨号上网

文章评论
发表评论

热门文章 安装红帽子RedHat Linux9.0操作系统教程 安装红帽子RedHat Linux9.0操作系统教程 Linux服务器:设计高性能网站架构-LLMP Linux服务器:设计高性能网站架构-LLMP 使用Clonezilla迁移到虚拟Linux环境 使用Clonezilla迁移到虚拟Linux环境 Linux上的MRTG流量监控中心 Linux上的MRTG流量监控中心 Linux 双网卡绑定一个IP原理及实现 Linux 双网卡绑定一个IP原理及实现 linux和windows等系统远程控制ubuntu桌面 linux和windows等系统远程控制ubuntu桌面

相关下载

人气排行 Linux下获取CPUID、硬盘序列号与MAC地址 dmidecode命令查看内存型号 linux tc实现ip流量限制 安装红帽子RedHat Linux9.0操作系统教程 linux下解压rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 关机、重启、注销 命令 查看linux服务器硬盘IO读写负载 linux命令行浏览器的使用方法 Linux NFS服务固定端口及防火墙配置 U盘安装Ubuntu 10.04 Linux清除用户登录记录和命令历史方法