unix/linux中的守護程序(daemon)類似於windows中的後台服務程序,一直在後台長時間執行的程序。它通常在系統啟動後就執行,沒有控制終端,也無法和前台的使用者互動,在系統關閉時才結束。daemon程式一般都作為服務程式使用,等待客戶端程式與它通訊。我們也把執行的daemon程式稱作守護程序。比如的網路服務程式,可以在完成建立套介面,繫結套介面,設定套介面為監聽模式後,變成守護程序進入後台執行而不占用控制終端,這是網路服務程式的常用模式。unix下的網路服務程式,如webserver(nginx、apache等),ftp(vsftp),ssh(openssh)等一般都是由守護程序(daemon)來實現的。守護程序不占用終端,在後台執行。unix的守護程序一般都命名為 *d 的形式,如httpd,vsftpd,sshd等。守護程序一旦脫離了終端,退出就成了問題,這時需要使用 ps 命令查出程序id然後再使用kill命令停止。
linux系統專門提供了乙個用來建立daemon程序的庫函式,該函式的原型是:
#inlude
intdaemon
(int nochdir,
int noclose)
;
其中引數 nochdir 指定是否要切換當前工作路徑到"/「根目錄,而引數noclose 指定是否要關閉標準輸入、標準輸出和標準出錯(即重定向到/dev/null)。在建立守護程序的時候,往往需要將程序的工作目錄修改為」/"根目錄,並將標準輸入、標準輸出和標準出錯關閉。所以這兩個引數我們一般都是傳0。
syslog是一種工業標準的協議,可用來記錄裝置的日誌。在unix系統,路由器、交換機等網路裝置中,系統日誌(system log)記錄系統中任何時間發生的大小事件。管理者可以通過檢視系統記錄,隨時掌握系統狀況。unix的系統日誌是通過syslogd這個程序記錄系統有關事件記錄,也可以記錄應用程式運作事件。通過適當的配置,我們還可以實現執行syslog協議的機器間通訊,通過分析這些網路行為日誌,藉以追蹤掌握與裝置和網路有關的狀況。
下面我們介紹一下linux系統自帶的日誌系統 syslog 函式:
一、openlog函式
#include
void
openlog
(const
char
*ident,
int option,
int facility)
函式說明:開啟日誌裝置,以供讀取和寫入.
引數說明:
1、ident:是乙個標記,ident 所表示的字串將固定的加在每行日誌的前面一標識這個日誌,通常就寫成當前程式的名稱以
作標記。
2、option:指定openlog函式和接下來呼叫的syslog函式的控制標誌。
opion
說明log_cons
如果將資訊傳送給 syslogd 守護程序時發生錯誤,直接將相關資訊輸出到終端
log_ndelay
立即開啟與系統日誌的連線(通常情況下,只有在產生第一條日誌資訊的情況下才會開啟與日誌系統的連線)
log_odelay
類似於 log_ndelay 引數,與系統日誌的連線只有在 syslog 函式呼叫時才會建立
log_perror
在將資訊寫入日誌的同時,將資訊傳送到標準錯誤輸出
log_pid
每條日誌資訊中都包含程序號
3、facility:指定記錄訊息程式的型別,與 syslogd 守護程序的配置檔案 syslog.conf 中的 facility 對應。
facility
說明log_auth
認證系統(login、su、getty等)
log_authpriv
同 log_auth 但只登陸到所選擇的單個使用者可讀的檔案中。
log_cron
cron 守護程序
log_daemon
其他系統守護程序,如 routed
log_ftp
檔案傳輸協議:ftpd、tftpd
log_kern
核心產生的訊息
log_lpr
系統印表機緩衝池:lpr、lpd
log_mail
電子郵件系統
log_news
網路新聞系統
log_syslog
由 syslogd(8)產生的內部訊息
log_user
隨機使用者程序產生的訊息
log_uucp
uucp子系統
log_local0~log_local7
本地使用保留
二、syslog函式
void
syslog
(int priority,
const
char
*format,..
.);
函式說明:寫入日誌,與檔案系統呼叫 printf使用方法類似,但在前面指定日誌級別。
引數說明:
priority:表示訊息的級別,與 syslogd 守護程序的配置檔案 syslog.conf 中的 level 對應。
log_emerg
緊急情況
log_alert
應該被立即改正的問題,如系統資料庫破壞
log_crit
重要情況,如硬碟錯誤
log_err
錯誤log_warning
警告資訊
log_notice
不是錯誤情況,但是可能需要處理
log_info
情報錯誤
log_debug
包含情報的資訊,通常指在除錯乙個程式時使用
三、closelog函式
void
closelog
(void
);
函式說明:關閉日誌裝置,與檔案系統呼叫的close類似;呼叫closelog也是可選擇的,它只是關閉被用於與syslog守護程序通訊的描述
符。
1#include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include 89
intmain
(int argc,
char
**ar**)
1018
openlog
("daemon"
, log_cons | log_pid,0)
;//開啟日誌系統,以供讀取和寫入.
19syslog
(log_notice,
"program '%s'start running\n"
, progname);20
syslog
(log_emerg,
"program '%s' running with a emergency message\n"
, progname );21
while(1
)2226closelog()
;//關閉日誌系統
2728
return0;
29}
注意:所有程式(包括linux核心) 呼叫syslog()函式的輸出相關資訊都會記錄到 /var/log/messages 日誌檔案中,因為該檔案中記錄了所有的資訊,這也意味著當前程式記錄的訊息容易被別的程式沖刷掉,所以我們在做專案寫網路程式的時候,一般會使用標準檔案io庫(fopen、fwrite()等)自己實現日誌系統,而不是直接呼叫該函式。 linux下的守護程序
守護程序特點 1 生存期長,在系統自舉的時候啟動,僅在系統關閉時終止。2 沒有控制終端,所以說他們是在後台執行的。關於編寫守護程序程式時要遵守的一些基本規則 1 呼叫umask將檔案模式建立遮蔽字設定為0。防止由繼承得來的檔案模式建立遮蔽字可能會拒絕設定某些許可權 2 呼叫fork 然後使得父程序退...
linux下的守護程序
linux下的常駐程序的作用不可忽略,但這裡面的問題也不能忽略,怎麼啟動程序,怎麼結束程序,怎麼在程序掛掉之後重啟程序都要設計的合理。下面看乙個shell控制的php常駐程序的例子。不廢話,直接撈乾貨,上 通過 來講解更容易理解 複製 如下 bin sh filename test.sh 絕對定位該...
Linux 系統 守護程序
吳巨集東 記於2018年07月11日 部落格 守護程序 daemon 是指linux系統上各種執行在後台提供各種服務的程序 系統初始化程序演變是由sysvinit到rhel centos6的upstart再到現在rhel centos7的systemd 管理主要是通過命令systemctl來顯示 啟...