首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Linux系统编程学习札记(十一)守护进程

2012-09-11 
Linux系统编程学习笔记(十一)守护进程守护进程:守护进程是生存时间比较长的一种进程. 它们常常在系统自举

Linux系统编程学习笔记(十一)守护进程
守护进程:
守护进程是生存时间比较长的一种进程. 它们常常在系统自举时启动, 仅在系统关闭时才终止. 因为它们没有控制终端,
所以说它们是在后台运行的. 先来介绍一些Linux系统常见的守护进程:

init: 它的pid为1, 是系统守护进程, 负责启动系统服务, 这些服务通常自己也拥有守护进程.
keventd: 为在内核中运行计划执行的函数提供进程上下文.
kapmd: 对计算机系统中具有的高级电源管理提供支持.
kswapd: 页面调出守护进程(Pageout Daemon), 它通过将脏页面(Dirty Page)以低速写到磁盘上, 使这些页面在需要时仍然可以回收使用, 这种方式支持虚存子系统.
bdflush: 当可用内存达到上限时, 将脏缓冲区从缓冲池中冲洗到磁盘上.
kupdated: 将脏页面写到到磁盘上.
portmap: 提供将RPC(Remote Procedure Call, 远程过程调用)程序号映射到网络端口号的服务.
syslogd: 提供把系统消息记入日志的接口, 供需要的程序使用. 可以打印到termino也可以写到文件.
inetd: 侦听系统网络接口, 以便取得来自网络的各种网络服务请求.
crond: 在指定的日期和时间执行指定的命令. 使定期地执行相关程序得意实现.
cupsd: 打印假脱机进程, 它处理对系统提出的所有打印请求.
nfsd, lockd, rpciod: 提供对网络文件系统的支持(Network File System).
2. 编程规则:
1)要调用umask将文件模式创建屏蔽字设置为0.
2)调用fork, 然后使父进程退出. 这样做为了实现下面几点:
3)如果该守护进程是作为一条简单shell命令启动的, 那么父进程终止使得shell认为这条命令已经执行完毕. 3)
4)子进程继承了父进程的进程组ID, 但具有一个新的进程ID, 这就保证了子进程不是一个进程组的组长进程. 这对于第三步的setsid调用是不要的前提.
5)调用setsid以创建一个新会话, 使得调用进程:
成为新会话的首进程.
成为一个新进程组的组长进程.
没有控制终端.
6)将当前工作目录更改为根目录,这是为了防止当前工作目录在mount的文件系统中,而UNIX可以确保共同都有的目录是根目录
7)关闭不再需要的文件描述符.
某些守护进程打开/dev/null,并dup其为filedes 0 1 2, 使标准输入、标准输出、错误输出都不会产生任何效果.
例子:

#include <unistd.h>#include <stdlib.h>#include <fcntl.h>#include <syslog.h>#include <string.h>#include <errno.h>#include <stdio.h>#include <sys/stat.h>#define LOCKFILE "/var/run/daemon.pid"#define LOCKMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)extern int lockfile(int);int already_running(void){int fd;char buf[16];fd = open(LOCKFILE,O_RDWR | O_CREAT, LOCKMODE);if(fd < 0){syslog(LOG_ERR,"can't open %s: %s", LOCKFILE, strerror(errno));exit(1);}if(lockfile(fd) < )){if(errno == EACCES || errno == EAGAIN ){close(fd);return 1;:}syslog(LOG_ERR,"can't lock %s : %s",LOCKFILE,strerror(errno));exit(1);}ftruncate(fd,0);sprintf(buf,"%ld",(long)getpid());write(fd,buf,strlen(buf)+1);return 0;}

5、守护进程惯例:
1)如果一个守护进程使用了文件锁,文件通常存储在/var/run目录下,守护进程可能需要超级用户权限来创建它,名字通常是name.pid,name通常是守护进程或服务
的名字。
2)如果守护进程支持配置选项,它们通常存储在/etc下,配置文件通常是name.conf,name是守护进程的名字。
3)守护进程可以通过命令行启动,但是他们通常在系统初始化脚本(/etc/rc*或者/etc/init.d/*)。如果守护进程需要自动启动,我们需要安排init去重新启动它,
我们在/etc/initab中添加一个respawn的项。
4)若守护进程有一配置文件,那么当更改了配置文件后,守护进程可能需要被停止,然后再启动,以使配置文件的更改生效。为避免这种麻烦,某些守护进程将捕捉SIGHUP信号,当它们接收到该信号时,重读配置文件。
参考:
《Advanced Programming in Unix Environment》

热点排行