守护进程是在后台运行不与控制终端关联的进程。Unix系统有很多后台进程,执行不同的任务管理。
守护进程没有控制终端源于它们由系统初始化脚本启动。守护进程也可以从终端启动,这样守护进程必须亲自脱离与控制终端的关联,避免与作业控制终端会话管理、终端产生信号等发送任何不期望的交互,也可以避免在后台运行的守护进程非预期地输出到终端。
守护进程启动方法:
1)在系统启动阶段,由系统初始化脚本启动;
这些脚本位于/etc目录或/etc/rc开头的某个目录。这些脚本启动的守护进程拥有超级用户特权;
如:inetd超级服务器、web服务器、邮件服务器
2)许多网络服务器由inetd超级服务器启动,ientd监听网络请求,每当请求到达,启动相应的实际服务器(Telent服务器、FTP服务器)
3)cron守护进程按照规则定期执行一些程序,由它启动的执行的程序作为守护进程运行;
4)at命令用于指定将来某个时刻的程序执行。这些程序的执行时刻到来时,通常由cron守护进程执行;
5)守护进程可以从用户终端在前台或后台启动。
守护进程没有控制终端,当有事发生时需要有输出消息的方法。syslog函数是输出这些消息的标准方法,它把这些消息发送给syslogd守护进程。
syslogd守护进程
syslogd守护进程由某个初始化脚本启动,系统工作期间一直运行。
1)读取配置文件,通常为/etc/syslog.conf 指定本守护进程可能收取的各种日志消息该如何处理。消息可能添加到一个文件,或写到指定用户的登录窗口,或被转发给另一个主机上的syslogd进程;
2)创建一个Unix域数据报套接字,捆绑路径名/var/run/log(或/dev/log)
3)创建一个UDP套接字,捆绑514端口
4)打开路径名/dev/klog,内核的错误消息是这个设备的输入,
此后syslogd守护进程在一个无限循环中运行:调用select等待它的三个描述符(分别来自第2、3、4步)之一变为可读,读入日志消息,并按照配置文件进行处理。
如果守护进程收到SIGHUP信号,就重新读取配置。
通过创建一个Unix域数据报套接字,我们就可以从自己的守护进程通过syslogd绑定的路径名发送我们的消息达到发送消息的目的。
更简单的接口是使用syslog函数。
也可以创建一个UDP套接字,通过环回地址和端口514发送消息。
较新的syslogd实现禁止创建UDP套接字,因为允许任何进程往这个套接字发送UDP数据会让系统容易遭受拒绝服务攻击。
syslog函数
既然守护进程没有控制终端,不能把消息fprintf到stderr上。
守护进程登记消息的技巧就是调用syslog函数。
#include <syslog.h>
void syslog(int priority, const char *message, ...);参数priority是级别level和设施facility两者的组合。
facility和level的目的在于,允许在/etc/syslog.conf 文件中统一配置来自同一给定设置的所有消息,或统一配置具有相同级别的所有消息。
syslog被应用首次调用时,创建一个Unix域数据套接字,然后调用connect连接到由syslogd守护进程创建的Unix域数据套接字。
















