一、守護進程的出錯記錄
守護進程不像普通程序,在調試的時候可以使用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應用程序開發詳解》