daemon程序與系統日誌

2021-10-03 14:04:52 字數 3267 閱讀 4683

在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

log)記錄系統中任何時間發生的大小事件。管理者可以通過檢視系統記錄,隨時掌握系統狀況。unix的系統日誌是通過syslogd這個程序記錄系統有關事件記錄,也可以記錄應用程式運作事件。通過適當的配置,我們還可以實現執行syslog協議的機器間通訊,通過分析這些網路行為日誌,藉以追蹤掌握與裝置和網路有關的狀況

對系統日誌的操作可以通過系統自帶的函式實現,經常用到的有openlog(),syslog()與closelog()函式

這三個函式的函式原型如下

#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。或者有時候我們需要讓我們的程式 服務能不中斷地執行,在關閉終端後也能在後台默默執行,除了可以這...