unix環境高階程式設計 守護程序

2021-07-16 03:55:46 字數 2339 閱讀 6057

守護程序(daemon)是生存期長的一種程序,常常在系統引導裝入時啟動,僅在系統關閉時終止,因為它們沒有控制終端,unix有很多守護程序,它們執行日常事務活動。

守護程序的特徵:

執行指令:ps -zxj  //a顯示其他使用者擁有的程序狀態,-x顯示沒有終端控制的程序狀態,-j顯示與作業有關的資訊:會話id、程序組id等。

核心守護程序的名字出現在方括號內,ubuntu使用名為kthreadd的特殊核心來建立其他核心程序,對於需要在程序上下文執行工作但卻不被使用者層程序上下文呼叫的每乙個核心元件,通常有它自己的核心守護程序,比如:

kswapd守護程序也稱為記憶體換頁守護程序。

flush守護程序在可用記憶體達到設定的最小閾值時將髒頁面沖洗至磁碟。

程序1通常是init,這是乙個系統守護程序。

注意大多數守護程序都是以root身份執行的,所有的守護程序都沒有控制終端,其終端名設定為問號。

程式設計規則:

在編寫守護程序程式時要遵循一些基本規則

1.首先要呼叫umask將檔案模式建立遮蔽字設定為乙個已知值(0).由繼承得來的檔案模式建立遮蔽字可能會被設定為拒絕某些許可權。如果守護程序要建立檔案,那麼它可能要設定特定的許可權。

2.呼叫fork,然後使父程序exit。

3.呼叫setsid建立乙個新會話。然後使呼叫程序:1.成為新會話的首程序,2.成為乙個新程序組的組長程序。3.沒有控制終端

4.將當前工作目錄更改為根目錄,從父程序繼承過來的當前工作目錄可能掛載在檔案系統中,因為守護程序通常在在系統再引導前是一直存在的,所以如果守護程序的當前工作目錄在乙個掛載檔案系統中,那麼該檔案系統就不能被解除安裝

5.關閉不再需要的檔案描述符。

6.某些守護程序開啟/dev/null使其具有檔案描述符0、1和2,這樣任何乙個試圖讀標準輸入、寫標準輸出的庫例程都不會產生任何效果。

出錯記錄:

守護程序存在的乙個問題是如何處理出錯訊息,因為它本來就不應該有控制終端。自4.2bsd以來,bsd的syslog設施得到了廣泛的應用。大多數守護程序都使用這一設施。

有三種可以產生日誌訊息的方法:

1.核心例程可以呼叫log函式

2.大多數使用者程序(守護程序)呼叫syslog函式來產生日誌訊息,我們將在下面說明其呼叫序列。

3.無論乙個使用者程序是在此主機上,還是通過tcp/ip網路連線到此主機的其他主機上,都可將日誌訊息發向udp埠514.。

通常syslogd守護程序讀取所有三種格式的日誌資訊,此守護程序在啟動時讀乙個配置檔案,其檔名一般為/etc/syslog.conf。該檔案決定了不同種類的訊息應送向何處。

該設施的介面是syslog函式

呼叫openlog是可選擇的,如果不呼叫openlog,則在第一次呼叫syslog時,自動呼叫openlog,呼叫closelog也是可選擇的,因為它只是關閉曾被用於與syslogd守護程序進行通訊的描述符。

openlog的option引數

openlog的facility引數選自下圖:

呼叫syslog產生乙個日誌訊息,其priority引數是facility和level的組合,它們選擇的值分別來自上圖的facility和下圖的level

守護程序的慣例:

1.若守護程序使用鎖檔案,那麼該檔案通常儲存在/var/run目錄中,需要注意的是守護程序可能需要超級使用者許可權才能在此目錄下建立檔案,鎖檔案的名字通常是name.pid,其中name是該守護程序的名字

2.若守護程序支援配置選項,那麼配置檔案通常存放在/etc目錄中,檔名通常是name.conf

3.守護程序可用命令列啟動,但通常它們是系統初始化指令碼之一啟動的。

4.若乙個守護程序有乙個配置檔案,那麼當守護程序啟動時會讀該檔案,但是在此之後一般就不會再檢視它。如果管理員修改了配置檔案,那麼該守護程序可能需要被停止,然後重新啟動使得配置檔案 生效,為了避免這種麻煩,守護程序將捕捉sighup訊號,當它們接受到該訊號時,重新讀取配置檔案。

UNIX環境高階程式設計 守護程序

守護程序也稱精靈程序,是生存期較長的一種程序。它們通常在系統自舉時啟動,僅在系統關閉時才終止。因為它們沒有控制終端,所以它們都是在後台執行的。各標題意義 父程序id,程序id,程序組id,會話id,終端名稱,終端程序組id,使用者id 系統程序依賴於作業系統實現。父程序id為0的各程序通常是核心程序...

守護程序程式設計規則(UNIX環境高階程式設計筆記)

1 呼叫umask將檔案模式建立遮蔽字設定為乙個已知值。2 呼叫fork,然後使父程序exit。3 呼叫setsid建立乙個新會話。然後使呼叫程序 a 稱為新會話的首程序,b 成為乙個新程序組的組長程序,c 沒有控制終端。4 將當前工作目錄更改為根目錄。某些守護程序可能會把當前工作目錄更改到某個指定...

UNIX高階環境程式設計 第13章 守護程序

守護程序 沒有控制終端,長期執行在後台的程序 void daemonize const char cmd else if pid 0 呼叫setsid以建立乙個新會話 使呼叫程序 a.成為新會話的首程序,b.成為乙個新程序組的組長程序,c.沒有控制終端。setsid struct sigaction...