进程控制开发之:Linux守护进程
syslog是Linux中的系统日志管理服务,通过守护进程syslogd来维护。该守护进程在启动时会读一个配置文件"/etc/syslog.conf"。该文件决定了不同种类的消息会发送向何处。例如,紧急消息可被送向系统管理员并在控制台上显示,而警告消息则可被记录到一个文件中。
该机制提供了3个syslog相关函数,分别为openlog()、syslog()和closelog()。下面就分别介绍这3个函数。
(1)syslog相关函数说明。
通常,openlog()函数用于打开系统日志服务的一个连接;syslog()函数是用于向日志文件中写入消息,在这里可以规定消息的优先级、消息输出格式等;closelog()函数是用于关闭系统日志服务的连接。
(2)syslog相关函数格式。
表7.9列出了openlog()函数的语法规范。
表7.9 openlog()函数语法
所需头文件 | #include <syslog.h> | |
函数原型 | void openlog (char *ident, int option , int facility) | |
函数传入值 | ident | 要向每个消息加入的字符串,通常为程序的名称 |
option | LOG_CONS:如果消息无法送到系统日志服务,则直接输出到系统控制终端 | |
LOG_NDELAY:立即打开系统日志服务的连接。在正常情况下,直接发送到第一条消息时才打开连接 | ||
LOG_PERROR:将消息也同时送到stderr上 | ||
LOG_PID:在每条消息中包含进程的PID | ||
facility:指定程序发送的消息类型 | LOG_AUTHPRIV:安全/授权信息 | |
LOG_CRON:时间守护进程(cron及at) | ||
LOG_DAEMON:其他系统守护进程 | ||
LOG_KERN:内核信息 | ||
LOG_LOCAL[0~7]:保留 | ||
LOG_LPR:行打印机子系统 | ||
LOG_MAIL:邮件子系统 | ||
LOG_NEWS:新闻子系统 | ||
LOG_SYSLOG:syslogd内部所产生的信息 | ||
LOG_USER:一般使用者等级信息 | ||
LOG_UUCP:UUCP子系统 |
表7.10列出了syslog()函数的语法规范。
表7.10 syslog()函数语法
所需头文件 | #include <syslog.h> | |
函数原型 | void syslog(int priority, char *format, ...) | |
函数传入值 | priority:指定消息的重要性 | LOG_EMERG:系统无法使用 |
LOG_ALERT:需要立即采取措施 | ||
LOG_CRIT:有重要情况发生 | ||
LOG_ERR:有错误发生 | ||
LOG_WARNING:有警告发生 | ||
LOG_NOTICE:正常情况,但也是重要情况 | ||
LOG_INFO:信息消息 | ||
LOG_DEBUG:调试信息 | ||
format | 以字符串指针的形式表示输出的格式,类似printf中的格式 |
表7.11列出了closelog()函数的语法规范。
表7.11 closelog函数语法
所需头文件 | #include <syslog.h> |
函数原型 | void closelog(void) |
(3)使用实例。
这里将上一节中的示例程序用syslog服务进行重写,其中有区别的地方用加粗的字体表示,源代码如下所示:
/* syslog_daemon.c利用syslog服务的守护进程实例 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <syslog.h>
int main()
{
pid_t pid, sid;
int i, fd;
char *buf = "This is a Daemon\n";
pid = fork(); /* 第一步 */
if (pid < 0)
{
printf("Error fork\n");
exit(1);
}
else if (pid > 0)
{
exit(0); /* 父进程推出 */
}
/* 打开系统日志服务,openlog */
openlog("daemon_syslog", LOG_PID, LOG_DAEMON);
if ((sid = setsid()) < 0) /*第二步*/
{
syslog(LOG_ERR, "%s\n", "setsid");
exit(1);
}
if ((sid = chdir("/")) < 0) /*第三步*/
{
syslog(LOG_ERR, "%s
- 进程控制开发之:Linux进程概述(08-13)
- 进程控制开发之:Linux进程控制编程(08-13)
- 进程控制开发之:实验内容(08-13)
- REDIce-Linux--灵活的实时Linux内核(11-12)
- linux文件系统基础(02-09)
- Linux标准趋向统一(11-12)