进程学习:4-守护进程的出错记录

一、守护进程的出错记录

       守护进程不像普通程序,在调试的时候可以使用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应用程序开发详解》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值