定义: 守护进程 daemon 是在后台运行不受终端控制的进程。
启动方法:
1. 很多守护进程是系统初始化脚本启动的,一般在/etc目录或者/etc/rc开头的目录
2. 很多网络服务器是由inetd超级服务器启动的
3. cron守护进程按规定的时间启动某个程序,可以把你的程序定个时间由他启动
4. at命令制定某一时刻启动某个进程
5. 也可以在用户终端启动,一般在测试守护进程或者守护进程需要重启时使用
由于守护进程没有控制终端,所以他不能打印到终端上,当出现错误时,需要记录下来,就用到了下面这个函数;
<syslog.h>
void syslog(int priority, const char *message, …..) |
priority是级别(level)和设施(facility)的组合,可以查看相关文档查找level , facility
(见《unix 网络编程 第一卷》)
void openlog(const char *ient, int options, int facility) |
void closelog(void) |
用于开启和关闭log的发送
发送消息的位置为:/var/run/log (/dev/log)
路径名/dev/klog 内核中的所有出错信息作为这个设备的输入实现
怎样才能产生一个守护进程呢?
1. 首先调用fork,然后父进程终止,子进程继续运行。子进程继承了父进程的进程组号,但拥有自己的进程号,保证其不是一个进程组头
2. setsid 函数,创建一个session,(具体参见《unix环境高级编程》第九章),此时这个进程变成了新会话头,和新进程组的组长,不在控制终端
3. 忽略SIGHUP信号再次fork, 这次函数返回的是第二次生成子进程,第一次的子进程是他的父进程,并且也终止了
第三步为了保证进程不再拥有终端
inetd 守护进程
我们在网络编程时会发现,开始的几步都是基本一样的,对于服务器这一端,我们会使用socket, bind, listen ,accept 基本步骤相同,能不能把这几步形成一个总的,当有申请链接来时都调用一个进程链接,然后根据不同的申请fork子进程执行相应的程序呢?答案就是只用inetd守护进程。
inetd守护进程是Linux自己的,他作为一个守护进程,处理请求,我们要做的是给他提供当对于某种链接,某个接口的请求时所要启动的程序就可以了。
一般在/etc/inetd.conf中配置。
例如:
ftp stream tcp nowait root /usr/bin/ftpd ftpd –l
下面是针对上面的参数进行解释,一一对应。
service-name 必须是在/etc/services文件中已定义的服务名
socket-tye stream(TCP)或dgram(UDP)
protocol 不许再/etc/protocols文件中已定义:tcp或者UDP
wait-flag 一般TCP是nowait,UDP是wait
login-name /etc/passwd 中的用户名,一般为root
server-program exec使用的全路径名
server-program-arguments exec使用的参数
不过应当注意的是最近版本好像不使用这个方法了,而是使用xinetd.*的方式,也有一定的格式,