一、守护进程的出错记录
守护进程不像普通程序,在调试的时候可以使用gdb或是在编译的时候出现在终端上的报错原因和行号,所以在编写守护进程的时候出错处理就变得十分重要。
所以守护进程就有它自己的出错记录方式,一般有三种方式产生出错日志:
1. 内核例程可以调用log函数,但是这一方式牵涉到内核,暂不研究
2. 调用syslog函数产生日志消息,这个是我们要掌握的
3. 通过TCP/IP链接的进程可以将日志消息发送到UDP端口514,需要网络编程,也不讨论
二、关于第二种方式的讨论
Syslog是Linux中的系统日志管理服务,该机制决定的不同种类的信息发向何处,比如紧急消息就发送给系统管理员并在控制台显示,警告消息则发送到一个记录文件中。该机制提供了3个函数接口,分别是openlog,syslog和closelog.
关于理论方面也就这些,用代码来实现一个守护进程的例程才是方便理解的
编译 运行 进程查看
//ubuntu 16.o4
[root@localhost daemon]# gcc daemon.c
[root@localhost daemon]# ./a.out
[root@localhost daemon]# ps -ef|grep a.out
root 1322 1 0 10:31 ? 00:00:00 ./a.out
root 1339 2790 0 10:31 pts/1 00:00:00 grep a.out
[root@localhost daemon]# cat /var/log/syslog
Apr 27 10:31:27 localhost a.out: child2 will sleep for 10s
Apr 27 10:31:37 localhost a.out: child2 will exit
Apr 27 10:31:37 localhost a.out: child1 noticed that child2 has exited
参考书籍 《UNIX环境高级编程》 《嵌入式Linux应用程序开发详解》
守护进程不像普通程序,在调试的时候可以使用gdb或是在编译的时候出现在终端上的报错原因和行号,所以在编写守护进程的时候出错处理就变得十分重要。
所以守护进程就有它自己的出错记录方式,一般有三种方式产生出错日志:
1. 内核例程可以调用log函数,但是这一方式牵涉到内核,暂不研究
2. 调用syslog函数产生日志消息,这个是我们要掌握的
3. 通过TCP/IP链接的进程可以将日志消息发送到UDP端口514,需要网络编程,也不讨论
二、关于第二种方式的讨论
Syslog是Linux中的系统日志管理服务,该机制决定的不同种类的信息发向何处,比如紧急消息就发送给系统管理员并在控制台显示,警告消息则发送到一个记录文件中。该机制提供了3个函数接口,分别是openlog,syslog和closelog.
关于理论方面也就这些,用代码来实现一个守护进程的例程才是方便理解的
代码中先建立起来一个守护进程,然后再该守护进程中建立一个子进程,该子进程先暂停10S然后自动退出,并且由守护进程收集其子进程的退出消息。其中子进程和守护进程的退出消息都在/var/log/message中输出。子进程退出后,守护进程循环停止,其时间间隔为10S。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <syslog.h>
#define MAXFILE 65535
int create_daemon()
{
int i ;
setsid();
chdir("/");
umask(0);
for(i = 0 ;i < MAXFILE ; i++){
close (i);
}
}
int main(int argc , char **argv)
{
pid_t child1,child2;
child1 = fork();
if(child1 < 0 )
perror("fork error");
else if(child1 > 0)
exit(1);
create_daemon();
child2 = fork();
if(child2 < 0)
perror("fork error");
else if(child2 == 0){
syslog(LOG_INFO,"child2 will sleep for 10s");
sleep(10);
syslog(LOG_INFO , "child2 will exit");
exit(0);
}
else{
waitpid(child2,NULL,0);
syslog(LOG_INFO,"child1 noticed that child2 has exited");
closelog();
while(1){
sleep(10);
}
}
return 0;
}
编译 运行 进程查看
//ubuntu 16.o4
[root@localhost daemon]# gcc daemon.c
[root@localhost daemon]# ./a.out
[root@localhost daemon]# ps -ef|grep a.out
root 1322 1 0 10:31 ? 00:00:00 ./a.out
root 1339 2790 0 10:31 pts/1 00:00:00 grep a.out
[root@localhost daemon]# cat /var/log/syslog
Apr 27 10:31:27 localhost a.out: child2 will sleep for 10s
Apr 27 10:31:37 localhost a.out: child2 will exit
Apr 27 10:31:37 localhost a.out: child1 noticed that child2 has exited
参考书籍 《UNIX环境高级编程》 《嵌入式Linux应用程序开发详解》