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

2021-08-14 16:50:31 字數 2842 閱讀 7996

守護程序(daemon)是生存期長的一種程序。它們常常在系統引導裝入時啟動,僅在系統關閉時才終止(生存期)。

因為它們沒有控制終端,所以說它們時在後頭執行的。unix系統有很多守護程序,它們執行日常事務活動。

本章將說明守護程序的結構,以及如何編寫守護程序程式。因為守護程序沒有控制終端,我們需要了解在出現問題時,daemon如何報告出錯情況。

先來看看一些常用的系統守護程序,以及它們是怎樣和程序組、控制終端和會話這三個概論相關聯的。

ps -axj

-a顯示由其他使用者所擁有的程序狀態(unix為多使用者系統)

-x顯示沒有控制終端的程序;

-j顯示與作業有關的資訊

ppid為0的程序通常是核心程序,它們作為系統引導裝入過程的一部分而啟動。(init是乙個例外,它是乙個由核心在引導裝入時啟動的使用者層次的命令)

核心程序是特殊的,通常存在於系統的整個生命週期中。它們以超級使用者特權執行,無控制終端、無命令列。

在ps輸出例項中,核心守護程序的名字出現在方框中,很多形式為』k*d』的程序其中『k』指kernel,『d』指daemon。

對於需要在程序上下文執行工作但卻不被使用者層程序上下文呼叫的每乙個核心元件,通常有它自己的核心守護程序。

在編寫守護程序程式時要遵循一些基本規則,以防止產生不必要的交換作用。

(1)首先要做的是呼叫umask將檔案模式建立遮蔽字(檔案許可權用) 設定為乙個已知的值(通常是0)。由繼承得來的檔案模式建立遮蔽字可能會被設定為拒絕某些許可權。

(2)呼叫fork,然後使父程序exit。實現了:第一,如果該守護程序是作為一條簡單的shell命令啟動的,那麼父程序終止會讓shell認為這條命令已經執行完畢。第二,雖然子程序繼承了父程序的程序組id,但獲得了乙個新的程序id,這就保證了子程序不是乙個程序組的組長程序。

(3)呼叫setsid建立乙個會話。然後使呼叫程序稱為新會話的首程序,稱為乙個新程序組的組長程序,沒有控制終端。

(4)將當前工作目錄更改為根目錄。從父程序繼承過來的當前工作目錄可能在乙個掛載的檔案系統中。因為守護程序一直存在,那麼該檔案系統就不能被解除安裝。

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

守護程序存在的乙個問題是如何處理出錯訊息。因為它本身就不應該有控制終端,所以不能只是簡單地寫到標準出錯上。我們不希望守護程序使用控制台裝置,因為很多任務作站的控制台裝置都執行著乙個視窗系統,也不會希望每個守護程序都將出錯訊息寫到單獨的檔案中,管理這些檔案很費事。所以需要乙個集中的守護程序出錯記錄設施。

bsd的syslog設施得到了廣泛的應用,大多數守護程序都使用這一設施。

守護程序在啟動時讀乙個配置檔案,其檔名一般為/etc/syslog.conf,該檔案決定了不同種類的訊息應送向何處。守護程序記錄日誌訊息的實施是/dev/log,其介面是syslog函式:

#include 

void openlog(const

char *ident,int optipn,int facility);

void syslog(int priority,const

char *format,...);

void closelog(void);

int setlogmask(int maskpri);//用於設定程序的記錄優先順序遮蔽字。

大多數syslog實現將訊息短時間處於佇列中。如果在此段時間中有重複訊息達到,那麼syslog守護程序不會把它記錄到日誌記錄中,而是會列印輸出一條類似「上一條訊息重複了n此」的訊息。

為了正常運作,某些守護程序(不是所有的都必須)會實現為:在任意時刻只執行該守護程序的乙個副本。

檔案和記錄鎖機制為這一種方法提供了基礎,該方法保障乙個守護程序只有乙個副本在執行。如果每乙個守護程序建立乙個固定名字的檔案,並在該檔案的整體上加一把鎖,那麼只允許建立一把這樣的鎖。在此後建立寫鎖的嘗試都會失敗,這向後續守護程序副本指明已有乙個副本正在執行。

在unix系統中,守護程序遵循下列通用慣例:

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

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

(3)守護程序可以用命令列啟動,但通常他們是由系統初始化指令碼之一(/etc/rc*或/etc/init.d/..)啟動的。如果在守護程序終止時,應當自動地重新啟動它,則我們可以在/etc/inittab(為init程序的配置檔案)中為該守護程序包括respawn記錄項,這樣init就將重新啟動該守護程序。

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

守護程序常常用作伺服器程序。確實,我們可以稱syslogd程序為伺服器程序,使用者程序(客戶程序)用unix域資料報套接字向其傳送訊息。

一般而言,伺服器程序等待客戶程序與其聯絡,提出某種服務型別的請求。例如,syslogd伺服器程序提供的服務是將一條出錯訊息記錄到日誌檔案中。

在伺服器程序中呼叫fork然後exec另乙個程式來向客戶程序提供服務是很常見的。這些伺服器程序通常管理著多個檔案描述符:通訊端點、配置檔案、日誌檔案和類似的檔案。

(1)在大多數unix系統中,守護程序是一直執行的。

(2)為了初始化我們自己的程序,使之作為守護程序執行,需要謹慎的思索並理解第9章所說明的程序之間的關係。

(3)因為守護程序沒有控制終端,本章還說明了守護程序記錄出錯訊息的幾種方法。

(4)還討論了守護程序遵循的若干慣例,給出了幾個如何實現慣例的例項。

UNIX環境高階程式設計 閱讀第十三章 守護程序

守護程序 daemon 是生存期長的一種程序。常常在系統引導裝入時啟動,僅在系統關閉時才終止。因為守護程序沒有控制終端,所以說它們是在後台執行的。unix系統有很多守護程序,它們執行日常事務活動。ps ajx 選項 a顯示由其他使用者所擁有的程序的狀態,x顯示沒有控制終端的程序狀態,j顯示與作業有關...

Mysql學習 第十三章 高階聯結

sql 除了可以對列名和計算字段使用別名,還允許給表名起別名。縮短 sql語句 允許在一條 select 語句中多次使用相同的表。select cust name,cust contact from customers as c,orders as o,orderitems as oi where ...

第十三章 併發

13.1 動機 13.2 基本執行緒 如果必須要控制現成的執行順序,最好是根本不用執行緒,而是自己編寫特定順序彼此控制的協作子程式。繼承thread類或者實現runnable介面。內部類實現。13.3 共享受限資源 1 如果要對類中的某個方法進行同步控制,最好同步所有方法。如果忽略了其中乙個,通常很...