進程學習: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應用程序開發詳解》

發佈了51 篇原創文章 · 獲贊 27 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章