在linux下進行程式設計時,程式執行時往往會占用終端,因此經常需要讓程式進入後台執行,linux命令中存在使程式後台執行的指令,在命令後加上&(後台執行符)可以讓該命令後台執行,如make &
,不過以這種方式讓程式進入後台執行只是一種假象,程式仍然依賴終端(terminal)程式,即以這種方式後台執行的程式仍是terminal的子程序,因此,當終端被關閉時該程式也隨之終止,那有沒有真正不依賴於終端存在的後台執行的程序呢
這種程序就是守護程序(daemon程序)又稱精靈程序,因為它就像精靈一樣隱匿於角落難以捕獲。daemon程式通常作為服務程序使用,
守護程序一旦脫離了終端,退出就成了問題,這時需要需要使用ps命令查出程序id後再使用kill命令停止
那麼如何在程式設計時使程式成為daemon程序進入後台執行呢,這就需要用到daemon()函式
daemon()函式原型及所需標頭檔案如下
#include
intdaemon
(int nochdir,
int noclose)
;
daemon()函式原型很簡單,只有兩個引數
daemon()函式的兩個引數通常都傳0
syslog是- 種工業標準的協議,可用來記錄裝置的日誌。在unix系統,路由器、交換機等網路裝置中,系統日誌(system對系統日誌的操作可以通過系統自帶的函式實現,經常用到的有openlog(),syslog()與closelog()函式log)記錄系統中任何時間發生的大小事件。管理者可以通過檢視系統記錄,隨時掌握系統狀況。unix的系統日誌是通過syslogd這個程序記錄系統有關事件記錄,也可以記錄應用程式運作事件。通過適當的配置,我們還可以實現執行syslog協議的機器間通訊,通過分析這些網路行為日誌,藉以追蹤掌握與裝置和網路有關的狀況
這三個函式的函式原型如下
#include
void
openlog
(const
char
*ident,
int option,
int facility)
;void
syslog
(int priority,
const
char
*format,..
.);void
closelog
(void
);
openlog()
用來開啟系統日誌,如果不呼叫openlog(),在第一次呼叫syslog()時,系統會自動呼叫openlog()
log_cons
如果將資訊傳送給 syslogd 守護程序時發生錯誤,直接將相關資訊輸出到終端
log_ndelay
立即開啟與系統日誌的連線(通常情況下,只有在產生第一條日誌資訊的情況下才會開啟與日誌系統
log_odelay
類似於 log_ndelay 引數,與系統日誌的連線只有在 syslog 函式呼叫時才會建立
log_perror
在將資訊寫入日誌的同時,將資訊傳送到標準錯誤輸出
log_pid
每條日誌資訊中都包含程序號
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()
用來寫入日誌
log_emerg
緊急情況
log_alert
應該被立即改正的問題,如系統資料庫破壞
log_crit
重要情況,如硬碟錯誤
log_err
錯誤log_warning
警告資訊
log_notice
不是錯誤情況,但是可能需要處理
log_info
情報錯誤
log_debug
包含情報的資訊,通常指在除錯乙個程式時使用
syslog
(log_notice,
"%s start runing\n"
,program_name)
;
closelog()
關閉日誌裝置,與檔案系統呼叫的close類似;呼叫closelog也是可選擇的,它只是關閉被用於與syslog守護程序通訊的描述符有些時候我們會需要讓乙個程式持續執行同時不占用終端,例如伺服器程式需要持續監聽而我們並不希望它持續占用終端,下面是乙個用來實現這個功能daemon模組的示例
program_name=
basename
(ar**[0]
);/*獲取程式名*/
openlog
(program_name,log_cons | log_pid,0)
;/*開啟系統日誌*/
syslog
(log_notice,
"%s start runing\n"
,program_name)
;/*在日誌中記錄「程式開始執行」*/
----
----
----
----
----
----
----
----
----
----
----
----
----
--if
(daemon_run)
/*daemon模組*/
daemon守護程序
daemon守護程序 守護程序是乙個後台程序,不能夠控制終端,所以任何輸出,無論是向標準出錯裝置stderr還是向標準輸出裝置stdout的輸出都需做特別處理。守護程序一般在系統啟動時啟動,它的父程序是init程序。建立守護程序 1在父程序執行fork然後讓父程序退出。2在子程序中使用setsid呼...
守護程序 daemon
守護程序常常在系統引導裝入時啟動,在系統關閉時終止。一般說daemon程式在後台執行,是因為它沒有控制終端,無法和前台的使用者互動。daemon程式一般都作為服務程式使用,等待客戶端程式與它通訊。我們也把執行的daemon程式稱作守護程序。乙個守護程序的父程序是init程序,因為它真正的父程序在fo...
守護程序(Daemon)
守護程序 daemon 一般是為了保護我們的程式 服務的正常執行,當程式被關閉 異常退出等時再次啟動程式 恢復服務。例如 http 服務的守護程序叫 httpd,mysql 服務的守護程序叫 mysqld。或者有時候我們需要讓我們的程式 服務能不中斷地執行,在關閉終端後也能在後台默默執行,除了可以這...