Linux守护进程简介和实例详解

简介

守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进程.Linux的大多数服务器就是用守护进程实现的.比如,Internet服务器inetd,Web服务器httpd等.同时,守护进程完成许多系统任务.比如,作业规划进程crond,打印进程lpd等.

下面是linux系统中常见的一些守护进程.

amd:自动安装NFS(网络文件系统)守侯进程
apmd:高级电源管理 
Arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和IP地址对数据库 
Autofs:自动安装管理进程automount,与NFS相关,依赖于NIS 
Bootparamd:引导参数服务器,为LAN上的无盘工作站提供引导所需的相关信息 
crond:Linux下的计划任务 
Dhcpd:启动一个DHCP(动态IP地址分配)服务器 
Gated:网关路由守候进程,使用动态的OSPF路由选择协议 
Httpd:WEB服务器 
Inetd:支持多种网络服务的核心守候程序 
Innd:Usenet新闻服务器 
Linuxconf:允许使用本地WEB服务器作为用户接口来配置机器 
Lpd:打印服务器 
Mars-nwe:mars-nwe文件和用于Novell的打印服务器 
Mcserv:Midnight命令文件服务器 
named:DNS服务器 
netfs:安装NFS、Samba和NetWare网络文件系统 
network:激活已配置网络接口的脚本程序 
nfs:打开NFS服务 
nscd:nscd(Name Switch Cache daemon)服务器,用于NIS的一个支持服务,它高速缓存用户口令和组成成员关系 
portmap:RPC portmap管理器,与inetd类似,它管理基于RPC服务的连接 
postgresql:一种SQL数据库服务器 
routed:路由守候进程,使用动态RIP路由选择协议 
rstatd:一个为LAN上的其它机器收集和提供系统信息的守候程序 
ruserd:远程用户定位服务,这是一个基于RPC的服务,它提供关于当前记录到LAN上一个机器日志中的用户信息 
rwalld:激活rpc.rwall服务进程,这是一项基于RPC的服务,允许用户给每个注册到LAN机器上的其他终端写消息 
rwhod:激活rwhod服务进程,它支持LAN的rwho和ruptime服务 
sendmail:邮件服务器sendmail 
smb:Samba文件共享/打印服务 
snmpd:本地简单网络管理候进程 
squid:激活代理服务器squid 
syslog:一个让系统引导时起动syslog和klogd系统日志守候进程的脚本 
xfs:X Window字型服务器,为本地和远程X服务器提供字型集 
xntpd:网络时间服务器 
ypbind:为NIS(网络信息系统)客户机激活ypbind服务进程 
yppasswdd:NIS口令服务器 
ypserv:NIS主服务器 
gpm:管理鼠标 
identd:AUTH服务,在提供用户信息方面与finger类似

守护进程的编程要点

守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同,造成不同Unix环境下守护进程的编程规则并不一致.下面将介绍Linux下守护进程的编程要点并给出详细实例.

不同Unix环境下守护进程的编程规则并不一致.所幸的是守护进程的编程原则其实都一样,区别在于具体的实现细节不同.这个原则就是要满足守护进程的特性.编程要点如下:

  1. 在后台运行.为避免挂起控制终端将Daemon放入后台执行.方法是在进程中调用fork使父进程终止,让Daemon在子进程中后台执行.
  2. 脱离控制终端,登录会话和进程组.有必要先介绍一下Linux中的进程与控制终端,登录会话和进程组之间的关系:进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID).登录会话可以包含多个进程组.这些进程组共享一个控制终端.这个控制终端通常是创建进程的登录终端.控制终端,登录会话和进程组通常是从父进程继承下来的.我们的目的就是要摆脱它们,使之不受它们的影响.方法是在第1点的基础上,调用setsid()使进程成为会话组长.(说明:当进程是会话组长时setsid()调用失败.但第一点已经保证进程不是会话组长.)setsid() 调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离.由于会话过程对控制终端的独占性,进程同时与控制终端脱离.
  3. 禁止进程重新打开控制终端.现在,进程已经成为无终端的会话组长.但它可以重新申请打开一个控制终端.可以通过使进程不再成为会话组长来禁止进程重新打开控制终端.
  4. 关闭打开的文件描述符.进程从创建它的父进程那里继承了打开的文件描述符.如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误.
  5. 改变当前工作目录.进程活动时,其工作目录所在的文件系统不能卸下.一般需要将工作目录改变到根目录.对于需要转储核心,写运行日志的进程将工作目录改变到特定目录如/tmpchdir(“/”).
  6. 重设文件创建掩模.进程从创建它的父进程那里继承了文件创建掩模.它可能修改守护进程所创建的文件的存取位.为防止这一点,将文件创建掩模清除:umask(0).
  7. 处理SIGCHLD信号.处理SIGCHLD信号并不是必须的.但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求.如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源.如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能.在Linux下可以简单地将SIGCHLD信号的操作设为SIG_IGN.这样,内核在子进程结束时不会产生僵尸进程.

守护进程实例

守护进程实例包括两部分:主程序test.c和初始化程序init.c.主程序每隔一分钟向/tmp目录中的日志test.log报告运行状态.初始化程序中的init_daemon函数负责生成守护进程.读者可以利用init_daemon函数生成自己的守护进程.
1.init.c清单

#include < unistd.h >
#include < signal.h >
#include < sys/param.h >
#include < sys/types.h >
#include < sys/stat.h >
void init_daemon(void)
{
	int pid;
	int i;
	if(pid=fork())
		exit(0);//是父进程,结束父进程
	else if(pid< 0)
		exit(1);//fork失败,退出 

	//是第一子进程,后台继续执行
	setsid();//第一子进程成为新的会话组长和进程组长,并与控制终端分离
	if(pid=fork())
		exit(0);//是第一子进程,结束第一子进程
	else if(pid< 0)
		exit(1);//fork失败,退出  

	//是第二子进程,继续,第二子进程不再是会话组长
	for(i=0;i< NOFILE;++i)//关闭打开的文件描述符
		close(i);  

	chdir(“/tmp”);//改变工作目录到/tmp  

	umask(0);//重设文件创建掩模
	return;
} 

2.test.c清单

#include < stdio.h >
#include < time.h >
extern void init_daemon(void);//守护进程初始化函数
main()
{
	FILE *fp;
	time_t t;
	init_daemon();//初始化为Daemon
	while(1)//每隔一分钟向test.log报告运行状态
	{
		sleep(60);//睡眠一分钟
		if((fp=fopen(“test.log”,”a”)) >=0)
		{
			t=time(0);
			fprintf(fp,”I’m here at %s\n”,asctime(localtime(&t)) );
			fclose(fp);
		}
	}
} 

Linux守护进程简介和实例详解

时间: 2024-10-20 09:47:41

Linux守护进程简介和实例详解的相关文章

Linux 查看系统硬件信息(实例详解)

cpu lscpu命令,查看的是cpu的统计信息. [email protected]:~$ lscpu Architecture: i686 #cpu架构 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian #小尾序 CPU(s): 4 #总共有4核 On-line CPU(s) list: 0-3 Thread(s) per core: 1 #每个cpu核,只能支持一个线程,即不支持超线程 Core(s) per socket:

Linux备份数据库,mysqldump命令实例详解

mysqldump是mysql数据库中备份工具,用于将MYSQL服务器中的数据库以标准的sql语言的方式导出,并保存到文件中. 语法: mysqldump (选项) 选项: --add-drop-table :在每个创建数据表语句前添加删除数据库的语句  --add-locks:备份数据库表时锁定数据库表  --all-databases:备份mysql服务器上的所有数据库  --comments:添加注释信息  --compact:压缩模式,产生更少的输出  --complete-insert

Linux系统编程之--守护进程的创建和详解【转】

本文转载自:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务.Linux系统的大多数服务器就是通过守护进程实现的.常见的守护进程包括系统日志进程syslogd. web服务器httpd.邮件服务器sendmail和数据库服务器

Linux守护进程详解(init.d和xinetd)

一 Linux守护进程 Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程来执行的.守护进程是生存期长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.他们常常在系统引导装入时启动,在系统关闭时终止.linux系统有很多守护进程,大多数服务器都是用守护进程实现的.同时,守护进程完成许多系统任务,比如,作 业规划进程crond.打印进程lqd等.有些书籍

Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程

上一篇文章主要讲述了Android的TouchEvent的分发过程,其中有两个重要的函数:onInterceptTouchEvent和onTouchEvent,这两个函数可被重装以完成特定的逻辑.onInterceptTouchEvent的定义为于ViewGroup中,默认返回值为false,表示不拦截TouchEvent.onTouchEvent的定义位于View中,当ViewGroup要调用onTouchEvent时,会利用super.onTouchEvent.ViewGroup调用onTo

linux基础-磁盘阵列(RAID)实例详解

磁盘阵列(RAID)实例详解 raid技术分类 软raid技术 硬raid技术 Raid和lvm的区别 为什么选择用raid RAID详解 RAID-0 RAID-1 RAID-5 Raid-10 Raid的管理 案例:创建一个raid10+冗余盘 磁盘阵列(RAID)实例详解 Raid(磁盘阵列)级别介绍 Raid有"廉价磁盘冗余阵列"的意思,就是利用多块廉价的硬盘组成磁盘组,让数据分部储存在这些硬盘里面,从而达到读取和写入加速的目的:也可以用作数据的冗余,当某块硬盘损毁后,其他硬盘

《HTML 5网页开发实例详解》样章、内容简介、前言

http://spu.jd.com/1167757597.html http://product.dangdang.com/23484942.html 样章 http://download.csdn.net/download/hdzn0603/7421803 内容简介 <HTML 5网页开发实例详解>从实际的应用场景出发,结合当下的热门技术,深入浅出地介绍了 HTML 5所包含的各项新技术.本书分为 14章.第 1~4章介绍了 HTML 5和浏览器的发展史. HTML 5新特性的使用,最新的前

Linux计划任务Crontab实例详解教程

说明:Crontab是Linux系统中在固定时间执行某一个程序的工具,类似于Windows系统中的任务计划程序 下面通过详细实例来说明在Linux系统中如何使用Crontab 操作系统:CentOS 一.安装crontab yum install vixie-cron  #安装 chkconfig crond on  #设为开机启动,先要安装chkconfig(yum install chkconfig) service crond start  #启动 service crond stop  

Linux网络编程——进程池实现过程详解(1)

目录 进程池 父进程的实现流程 子进程的实现流程 进程池 父进程的实现流程 1.定义数据结构pChild,申请子进程数目的结构体空间 2.通过循环,socketpair创建全双工管道,创建子进程,将子进程pid,管道对端,是否忙碌等信息存储 3.socket,bind,listen,对应的端口处于监听状态 netstat 4.epoll_create创建epfd,监控socketFd和所有子进程的管道对端 5.while(1)循环 epoll_wait等待客户端的请求及子进程是否有通知 如果so