8.2 建立守護程序
由於守護程序的特點,編寫守護程序程式必須遵守一定的規則。本節將闡述這些規則的要點,並給出相關**。
8.2.1 實現守護程序的步驟
在linux系統中,要程式設計實現乙個守護程序必須遵守如下的步驟。
1.讓init程序成為新產生程序的父程序。
呼叫fork函式建立子程序後,使父程序立即退出。這樣,產生的子程序將變成孤兒程序,並被init程序接管,同時,所產生的新程序將變為在後台執行。
2.呼叫setsid函式
通過呼叫setsid函式,使得新建立的程序脫離控制終端,同時建立新的程序組,並成為該程序組的首程序。為了使讀者更好地理解這一步驟,下面介紹程序組、會話(session)的基本概念。
在linux系統中,所有的程序都屬於各自的程序組。程序組是乙個或多個程序的集合。打個比方,可以認為某個班級是乙個程序組,而其中成員就是程序。乙個班級至少有乙個成員。當乙個班級的最後乙個成員不存在的時候,這個班級也就不存在了,也就是程序組消亡了。
每個程序組都有類似於程序號的標識,稱為程序組id。程序組id是由領頭程序的程序號決定的,每個程序組都存在乙個領頭程序。程序組的存在與否與領頭程序是否存在沒有關係。
會話是乙個或多個程序組的集合。與程序組類似,每個會話都存在乙個領頭程序。linux是乙個多使用者的作業系統,在同一時刻系統中會存在屬於不同使用者的多個程序。如果使用者在某個終端上傳送了某個訊號,例如,按下「ctrl+c」傳送sigint訊號,如何確保訊號被正確地傳送到對應的程序,同時不會影響使用其他終端的使用者的程序?
會話和程序組是linux核心用於管理多使用者情況下使用者程序的方法。每個程序都屬於乙個程序組,而程序組又屬於某個會話。當使用者從終端登入系統(不管是終端還是偽終端),系統會建立乙個新的會話。在該終端上啟動的程序都會被系統劃歸到會話的程序組中。
會話中的程序通過該會話中的領頭程序(常稱其為控制程序)與乙個終端相連。該終端是會話的控制終端。乙個會話只能有乙個控制終端,反之一樣。如果會話存在乙個控制終端,則它必然擁有乙個前台程序組。屬於該組的程序可以從控制終端獲得輸入。這時,其他的程序組都為後台程序組。圖8.3所示為會話、程序組、程序與控制終端之間的關係。
圖8.3 會話、程序組、程序與控制終端的關係
由於守護程序沒有控制終端,而使用fork函式建立的子程序繼承了父程序的控制終端、會話和程序組,因此,必須建立新的會話,以脫離父程序的影響。linux系統提供了setsid函式用於建立新的會話。setsid函式的資訊如表8.1所示。
表8.1 setsid函式
標頭檔案
函式形式
pid_t setsid(void);
返回值
成功 失敗
是否設定errno
呼叫程序的會話id
−1 是
setsid函式將建立新的會話,並使得呼叫setsid函式的程序成為新會話的領頭程序。呼叫setsid函式的程序是新建立會話中的惟一的程序組,程序組id為呼叫程序的程序號。setsid函式產生這一結果還有個條件,即呼叫程序不為乙個程序的領頭程序。由於在第一步中呼叫fork的父程序退出,使得子程序不可能是程序組的領頭程序。該會話的領頭程序沒有控制終端與其相連。至此,滿足了守護程序沒有控制終端的要求。
3.更改當前工作目錄
使用fork函式產生的子程序將繼承父程序的當前工作目錄。當程序沒有結束時,其工作目錄是不能被解除安裝的。為了防止這種問題發生,守護程序一般會將其工作目錄更改到根目錄下(/目錄)。更改工作目錄使用的函式是chdir。
4.關閉檔案描述符,並重定向標準輸入、輸出和錯誤輸出
新產生的程序從父程序繼承了某些開啟的檔案描述符,如果不使用這些檔案描述符,則需要關閉它們。守護程序是執行在系統後台的,不應該在終端有任何的輸出資訊。可以使用dup函式將標準輸入、輸出和錯誤輸出重定向到/dev/null裝置上(/dev/null是乙個空裝置,向其寫入資料不會有任何輸出)。下面給出具體的**: …
int fd;
//將標準輸入輸出重定向到空裝置
fd = open ("/dev/null", o_rdwr, 0);
if (fd != -1)
…5.設定守護程序的檔案許可權建立掩碼
很多情況下,守護程序會建立一些臨時檔案。出於安全性的考慮,往往不希望這些檔案被別的使用者檢視。這時,可以使用umask函式修改檔案許可權,建立掩碼的取值,以滿足守護程序的要求。
守護程序的實現
6個步驟 步驟1 建立子程序,殺死父程序,目的是為了步驟2中呼叫setsid可以成功。步驟2 建立新會話,並自任組長。目的是脫離控制終端 會話組長呼叫 setsid 會失敗,步驟1建立的子程序必然不是會話組長,這就保證了 setsid 可以成功。步驟3 修改工作目錄為根目錄。當程序沒有結束時,工作目...
實現守護程序
目錄守護程序 也稱為精靈程序,守護程序是乙個在後台執行並且不受任何終端控制的程序。unix作業系統有很多典型的守護程序 其數目根據需要或20 50不等 它們在後台執行,執行不同的管理任務。使用者使守護程序獨立於所有終端是因為,在守護程序從乙個終端啟動的情況下,這同乙個終端可能被其他的使用者使用。ps...
php 守護程序的實現
1 php沒有執行在安全模式,關掉安全模式,即 safe mode off 2 禁用函式列表 disable functions exec,system,shell exec,proc open,popen,一般來說,exec 這些函式為了安全,都會禁用,在php.ini裡面把這些禁用的函式放出來。...