APUE學習筆記 19 守護程序

2021-05-02 15:51:52 字數 3684 閱讀 2627

by:

潘雲登

對於商業目的下對本文的任何行為需經作者同意。

寫在前面

1.本文內容對應《

unix

環境高階程式設計》(第

2版)》第

13章。 2.

總結了守護程序的基本概念、程式設計規則以及如何進行出錯處理。 3.

守護程序

守護程序也稱精靈程序(

daemon

)是生存期較長的一種程序。它們常常在系統自舉時啟動,僅在系統關閉時才終止。大多數守護程序都以超級使用者(使用者id為

0)特權執行。沒有乙個守護程序具有控制終端,在用

ps –axj

命令檢視時,其終端名設定為問號(?),終端前台程序組

id設定為

-1。核心守護程序以無控制終端方式啟動。使用者層守護程序缺少控制終端可能是守護程序呼叫

setsid

的結果。所以使用者層守護程序都是程序組的組長程序以及會話的首程序,而且是這些程序組和會話中的唯一程序。大多數守護程序的父程序是

init

程序。

常見的守護程序有: ²

init

:負責啟動各執行層次特定的系統服務。 ²

kswapd

:頁面調出守護程序,通過將髒頁面以低速寫到磁碟上從而使這些頁面在需要時可**使用。 ²

bdflush

和kupdated

:將快取記憶體中的資料沖洗到磁碟上。 ²

portmap

:將rpc

程式號對映為網路埠號的服務。 ²

syslogd

:可由幫助操作人員把系統訊息記入日誌的任何程式使用。 ²

inetd

:偵聽系統網路介面,以便取得來自網路的對各種網路服務程序的請求。

程式設計規則

在編寫守護程序時需要遵循一些基本規則,以便防止產生並不需要的互動作用。 1)

首先要做的是呼叫

umask

將檔案模式建立遮蔽字設定為

0。由繼承得到的檔案模式建立遮蔽字可能會拒絕設定某些許可權。 2)

呼叫fork

,然後使父程序退出。如果該守護程序作為

shell

命令啟動,父程序終止使得

shell

認為這條命令已經執行完畢。另外,父程序終止使得子程序不是乙個程序組的組長程序,這時呼叫

setsid

必要的前提條件。 3)

呼叫setsid

建立乙個新會話,使呼叫程序

a)成為新會話的首程序

b)成為乙個新程序組的組長程序

c)沒有控制終端。 4)

將當前工作目錄更改為根目錄。因為守護程序通常在系統再次引導之前一直存在,如果守護程序的當前工作目錄在乙個裝配檔案系統中,那麼該檔案系統就不能被拆卸。 5)

關閉不再需要的檔案描述符。這使得守護程序不再持有從某父程序繼承來的某些檔案描述符。 6)

某些守護程序開啟

/dev/null

使其具有檔案描述符

0、1和2

,這樣,任何乙個試圖讀寫標準輸入輸出或標準出錯的庫例程都不會產生任何效果。

範例程式如下:

void daemonize(const char *cmd) }

出錯記錄

守護程序沒有控制終端,所以不能只是簡單地寫到標準輸出上,而是使用

syslog

設施。有三種方法產生日誌訊息:

1)核心例程可以呼叫

log函式;

2)大多數使用者程序呼叫

syslog

函式產生日誌訊息;

3)在此主機上的乙個使用者程序或通過

tcp/ip

網路連線到此主機的其它主機上的乙個使用者程序可將日誌訊息發向

udp埠

514。然後,

syslogd

守護程序讀取三種格式的日誌訊息,根據配置檔案(一般是

/etc/syslog.conf

)決定不同種類的訊息應送向何處。守護程序通常使用方式

2)產生日誌訊息。

#include

void openlog(const char *ident, int option, int facility);

void syslog(int priority, const char *format, ...);

void closelog(void);

int setlogmask(int maskpri);

呼叫openlog

是可選擇的,如果不呼叫,則在第一次呼叫

syslog

時,自動呼叫

openlog

。openlog

使我們可以指定乙個

ident

,將它加到每則日誌訊息中。

ident

一般是程式的名稱。

option

引數指定許多選項的位遮蔽。

facility

引數的目的是可以讓配置檔案說明,來自不同設施的訊息將以不同的方式進行處理。

syslog

函式產生乙個日誌訊息,其

priority

引數是facility

和level

的組合。

format

引數用於格式化字串。在

format

中,每個

%m都先被換成對應於

errno

值的出錯訊息字串(

strerror)。

setlogmask

函式用於設定程序的記錄優先順序遮蔽字。它返**用之前的遮蔽字。

守護程序的慣例

l某些守護程序實現為單例項的,即任一時刻只執行該守護程序的乙個副本。檔案鎖和記錄鎖機制是一種方法。若使用鎖檔案,那麼該檔案通常放在

/var/rum

目錄下。鎖檔案的名字通常是

name.pid

,其中,

name

是該守護程序或服務的名字。 l

若守護程序支援配置選項,那麼配置檔案通常存放在

/etc

目錄中。配置檔案的名字通常是

name.conf。

l守護程序可以是命令列啟動,但通常它們是由系統初始化指令碼之一啟動的。如果在守護程序終止時,應當自動地重新啟動,可在

/etc/inittab

中為該守護程序包括

_respawn

記錄項,這樣,

init

將重新啟動該守護程序。 l

若守護程序有一配置檔案,那麼當更改了配置檔案後,守護程序可能需要被停止,然後再啟動,以使配置檔案的更改生效。為避免這種麻煩,某些守護程序將捕捉

sighup

訊號,當它們接收到該訊號時,重讀配置檔案。

APUE 筆記 守護程序

1.daemon 是後台程序 後台程序有些是核心的 kernel daemons 通常他們的父程序號是0,他們在系統啟動階段啟動 有些是使用者層的 user level daemons 所有使用者層後台程式是 process group leaders 和 session leaders,而且程序組...

APUE讀書筆記 第十三章 守護程序

使用者層守護程序的父程序是init程序 守護程序編寫規則 1 umask將檔案模式建立遮蔽字設定為乙個已知值 通常為0 2 呼叫fork,然後使父程序exit,保證了子程序不是乙個程序組的組長程序 3 呼叫setsid建立乙個新會話,由於該程序不是乙個程序組的組長程序,會發生以下三件事 a 該程序變...

APUE學習筆記 程序控制

1.getpid可以獲取程序id。getppid可以獲取程序呼叫程序的id。2.fork函式 一次呼叫,兩次返回 返回0是在子程序中。返回其他值在父程序中。如果大於0為子程序id 否則失敗。3.子程序獲得了父程序的資料空間 data,bss 堆,棧的副本。程序之間共享正文段。4.目前的實現一般不進行...