微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 进程控制开发之:Linux守护进程

进程控制开发之:Linux守护进程

时间:08-13 来源:3721RD 点击:

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top