- 论坛徽章:
- 0
|
守护进程是在后台运行且不与任何控制终端关联的进程。既然守护进程没有控制终端,当有事情发生时,它们得有输出消息的某种方法,syslog函数是输出这些消息的标准方法,它把这些消息发送给syslogd守护进程。
源自Berkeley的syslogd实现在启动时执行以下步骤:
1,读取配置文件。通常为/etc/syslog.conf的配置文件指定本守护进程可能收取的各种日志消息应该如何处理。
2,创建一个Unix域数据报套接口,给字捆绑路径名/var/run/log(在某些系统上是/dev/log)
3,创建一个UDP套接口,给它捆绑端口514(syslog服务使用的端口号)
4,打开路径名为/dev/klog。来自内核的任何出错消息看着像是这个设备的输入。
syslog守护进程在一个无限循环中运行:调用select以等待它的在2,3,4步中创建的描述字之一变为可读;读入日志消息,并按照配置文件进行处理。如果守护进程收到SIGHUP信号,那就重新读取配置文件。不过较新的syslogd实现禁止创建UDP套接口,除非管理员明确要求,因为允许任何进程往这个套接口发送UDP数据报造成系统易遭拒绝服务攻击。
syslog函数
既然守护进程没有控制终端,它们就不能把消息fprintf到sterr上,从守护进程中登记消息的常用技巧就是调用syslog函数。
#include
void syslog( int priority, const char *message, ... );
本函数的priority参数是级别(level)与设施(facility)两者的组合。message参数类似printf格式串,不过增设了%m规范,它将被替换成与当前errno值对应的出错消息。level的默认值是LOG_NOTICE,facility的缺省值为LOG_USER。举例来说,当rename函数调用失败时,守护进程可以执行以下调用:
syslog(LOG_INFO|LOG_LOCAL2,"rename(%s,%s):%m",file1,file2);
level与facility的目的在于,允许在/ect/syslog.conf文件中统一配置来自同一给定设施的所有消息,或者统一配置具有相同级别的所有消息。假如其具有以下两行:
kern.* /dev/console
local7.debug /var/log/cisco.log
这两行指定所有内核消息登记到控制台,来自local7设施的所有debug消息添加到文件/va/log/cisco.log的末尾。
daemon_init函数
此函数可以将一个一般的进程变为守护进程,它主完完成以下几步:
1,fork一个子进程,然后终止父进程。
2,调用setsid以创建一个新对话期。
3,将当前工作目录更改为根目录。
4,将文件方式创建屏蔽字设置为0。
5,关闭不再需要的文件描述符。
其代码如下:
#define MAXFD 64
extern int daemon_proc;
int daemon_init( const char *pname, int facility)
{
int i;
pid_t pid;
if ((pid=fork())
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/94142/showart_1896646.html |
|