一. 守護程序及其特性
守護程序最重要的特性是後台執行;其次,守護程序必須與其執行前的環境隔離開來。這些環境包括未關閉的檔案描述符,控制終端,會話和程序組,工作目錄以及檔案建立掩模等。這些環境通常是守護程序從執行它的父程序(特別是shell)中繼承下來的;最後,守護程序的啟動方式有其特殊之處------它可以在linux系統啟動時從啟動指令碼/etc/rc.d中啟動,可以由作業規劃程序crond啟動,還可以由使用者終端(通常是shell)執行。
總之,除開這些特殊性以外,守護程序與普通程序基本上沒有什麼區別,因此,編寫守護程序實際上是把乙個普通程序按照上述的守護程序的特性改造成為守護程序。
二. 守護程序的程式設計要點
1. 在後台執行。
為避免掛起控制終端將daemon放入後台執行。方法是在程序中呼叫fork使
父程序終止, 讓daemon在子程序中後台執行。
if(pid=fork()) exit(0); //是父程序,結束父程序,子程序繼續
2. 脫離控制終端,登入會話和程序組
有必要先介紹一下linux中的程序與控制終端,登入會話和程序組之間的關係:程序屬於 乙個程序組,程序組號(gid)就是程序組長的程序號(pid)。登入會話可以包含多個程序組。這些程序組共享乙個控制終端。這個控制終端通常是建立程序的登入終端。 控制終端,登入會話和程序組通常是從父程序繼承下來的。我們的目的就是要擺脫它們 ,使之不受它們的影響。方法是在第1點的基礎上,呼叫setsid()使程序成為會話組長:
setsid();
說明:當程序是會話組長時setsid()呼叫失敗。但第一點已經保證程序不是會話組長。setsid()呼叫成功後,程序成為新的會話組長和新的程序組長,並與原來的登入會話和程序組脫離。由於會話過程對控制終端的獨占性,程序同時與控制終端脫離。
3. 禁止程序重新開啟控制終端
現在,程序已經成為無終端的會話組長。但它可以重新申請開啟乙個控制終端。可以通過使程序不再成為會話組長來禁止程序重新開啟控制終端:
if(pid=fork()) exit(0); //結束第一子程序,第二子程序繼續(第二子程序不再是會話組長)
4. 關閉開啟的檔案描述符
程序從建立它的父程序那裡繼承了開啟的檔案描述符。如不關閉,將會浪費系統資源, 造成程序所在的檔案系統無法卸下以及引起無法預料的錯誤。按如下方法關閉它們:
for(i=0;i 關閉開啟的檔案描述符close(i);
5. 改變當前工作目錄
程序活動時,其工作目錄所在的檔案系統不能卸下。一般需要將工作目錄
改變到根目錄 。對於需要轉儲核心,寫執行日誌的程序將工作目錄改變到特定目錄如/tmp
chdir("/")
6. 重設檔案建立掩模
程序從建立它的父程序那裡繼承了檔案建立掩模。它可能修改守護程序所建立的檔案的 訪問位。為防止這一點,將檔案建立掩模清除:
umask(0);
7. 處理sigchld訊號
處理sigchld訊號並不是必須的。但對於某些程序,特別是伺服器程序往往在請求到來時 生成子程序處理請求。如果父程序不等待子程序結束,子程序將成為殭屍程序(zombie )從而占用系統資源。如果父程序等待子程序結束,將增加父程序的負擔,影響伺服器 程序的併發效能。在linux下可以簡單地將sigchld訊號的操作設為sig_ign。
signal(sigchld,sig_ign);
這樣,核心在子程序結束時不會產生殭屍程序。這一點與bsd4不同,bsd4下必須顯式等待子程序結束才能釋放殭屍程序。
三. 守護程序例項
#
include
#include
<
signal
.h>
#include
#include
#include
#include
void init_daemon(
)chdir(
"/tmp");
/* 切換工作目錄 */
umask(0)
;/* 重設檔案建立掩碼 */
return;}
int main()}
return 0;
}
精靈 守護 程序及其實現
精靈程序 也稱守護程序,是執行在後台的一種特殊程序。它獨 立於控制終端並且周期性地執行某種任務或等待處理某些發生的事件。它不屬於任何乙個會話,它自成會話,自成程序組。一般而言,後台程序永遠不能退出。所有的精靈程序的父程序都是1,即所有的精靈程序都是孤兒程序。精靈程序一般以d結尾。用ps axj 來檢...
守護程序及守護程序輸出
1 建立乙個輸出程式 2 建立乙個守護程序 1 建立乙個輸出程式 守護程序不與終端聯絡,所以,需要另外建立乙個程式用於輸出。也可以直接使用 bin echo example daemon help.cc include int main int argc,char argv else if argc...
守護程序及守護程序輸出
1 建立乙個輸出程式 2 建立乙個守護程序 1 建立乙個輸出程式 守護程序不與終端聯絡,所以,需要另外建立乙個程式用於輸出。也可以直接使用 bin echo example daemon help.cc include int main int argc,char ar else if argc 2...