4.出錯處理
由於守護進程完全脫離了終端,因此不能只是寫到標準出錯上。通常使用的方法是使用syslog服務,將出錯信息輸入到”/var/log/message”系統日誌文件中去。Syslog是Linux中的系統日誌管理服務,通過守護進程syslog來維護。
處理過程
<1>打開syslog
<2>寫入日誌
<3>關閉syslog
頭文件
#include <syslog.h>
函數原型:
void openlog(char *ident, int option, int facility) ;
參數:
ident爲自定義標識符,
option如下
LOG_CONS
若日誌消息,不能通過U N I X域數據報發送至s y s l o g d,則將該消息寫至控制檯
LOG_NDELAY1
立即打開U N I X域數據報套接口至s y s l s g d精靈進程—不要等到記錄第一條消息。
通常,在記錄第一條消息之前,該套接口不打開
L O G_ P E R R O R
除將日誌消息發送給s y s l o g外,還將它寫至標準出錯。
L O G _ P I D
每條消息都包含進程I D此選擇項可供對每個請求都f o r k一個子進程的精靈進程使用
facility
設置f a c i l i t y參數的目的是讓配置文件可以說明,來自不同設施的消息以不同的方式進行處理
LOG_A U T H 授權程序: l o g i n . s u , g e t t y ,⋯
LOG_C R O N c r o n和a t
LOG_D A E M O N 系統精靈進程:f t p d , r o u t e d ,⋯
LOG_K E R N 內核產生的消息
LOG_L O C A L 0 保留由本地使用
LOG_L O C A L 1 保留由本地使用
LOG_L O C A L 2 保留由本地使用
LOG_L O C A L 3 保留由本地使用
LOG_LO C A L 4 保留由本地使用
LOG_LOCAL5 保留由本地使用
LOG_LOCAL6 保留由本地使用
LOG _LOCAL7 保留由本地使用
LOG _L P R 行打系統:lpd, lpc, ⋯
LOG_ M A I L 郵件系統
LOG_ N E W S U s e n e t網絡新聞系統
L O G_ S Y S L O G s y s l o g d精靈進程本身
L O G _U S E R 來自其他用戶進程的消息
L O G _U U C P U U C P系統
void syslog(int priority, char * format, ...);
參數:類似於printf(),只是將輸出換成了系統日誌
priority參數是f a c i l i t y和l e v e l的組合
l e v e l:
L O G _E M E R G 緊急(系統不可使用) (最高優先級)
L O G _A L E R T 必須立即修復的條件
L O G _C R I T 臨界條件(例如,硬設備出錯)
L O G _E R R 出錯條件
L O G _W A R N I N G 警告條件
L O G _N O T I C E 正常,但重要的條件
L O G _I N F O 信息性消息
L O G _D E B U G 調試排錯消息(最低優先級)
舉例
- #include<stdio.h>
- #include<stdlib.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<signal.h>
- #include<fcntl.h>
- #include <syslog.h>
- #define MAXF 10000
- int main()
- {
- int i,fd;
- pid_t pid;
- /*(1)openlog也可省略*/
- openlog("my_log",LOG_PID,LOG_DAEMON);
- pid=fork();/*<1> 創建子進程,結束父進程*/
- if(pid<0)
- perror("fork error!\n");
- else if(pid>0)/*父進程*/
- exit(0);
- setsid();/*<2>創建會話期,進程成爲新的會話組長和新的進程組長*/
- chdir("/");/*<3>更改當前工作目錄*/
- umask(0);/*<4>設置文件權限*/
- for(i=1;i<MAXF;i++)/*<5>關閉文件描述符*/
- close(i);
- /*每5秒,寫入文件一次*/
- while(1)
- {
- /*(2) syslog寫入/var/log/syslog 文件中*/
- syslog(LOG_ERR,"%s\n","****----open error----****\n");
- sleep(5);
- }
- }