定义: 守护进程 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      一般TCPnowait,UDPwait

login-name     /etc/passwd 中的用户名,一般为root

server-program exec使用的全路径名

server-program-arguments exec使用的参数

 

不过应当注意的是最近版本好像不使用这个方法了,而是使用xinetd.*的方式,也有一定的格式,