1 守護程序中涉及到的基本概念
1.1程序組
1.1.1 程序組基本概念
程序組是乙個或多個程序的集合,可以接收來自同乙個終端的各種訊號。每執行乙個程式或是命令都將產生乙個程序組。
每個程序屬於乙個程序組,而每個程序組都存在乙個領頭程序(或是叫組長程序),一般程序組的第乙個程序是領頭程序。領頭程序可以建立乙個程序組、建立該組中的程序。領頭程序fork出的子程序也將在該程序組中,一旦子程序執行exec等退出函式就不再屬於該程序組。
程序組的生命週期:從建立開始到最後乙個程序離開為止成為程序組的生命週期。組中最後乙個程序的離開可以是終止,或加入其他程序。程序組的生命週期與組長程序是否終止無關,只要有乙個程序存在,程序組的生命週期就未結束。
1.1.2 相關命令
1、檢視所有程序組pid(即領頭程序的pid):ps –a –o pgrp= | sort |uniq
2、檢視某個程序的程序組pid:ps –c 程序名 –o pgrp=
3、根據程序名獲得程序pid:pidof 程序名
4、根據程序pid獲得程序名:ps –aux |grep 程序pid
5、獲取某個程序的具體資訊:ps –ef |grep 程序名或程序pid
1.1.3 相關函式
#include
pid_t getpgrp(); //獲取程序組pid,即進組中的領頭程序的pid,相當於呼叫getpgid(0)
pid_t getpid(); //獲取當前程序pid
pid_t getppid(); //獲取當前程序的父pid
pid_t getpgid(); //返回指定程序的程序組pid
int setpgid(pid_t pid, pid_t pgid); /*將pid程序的程序組id設定為pgid,如果兩個引數相等,
*則pid指定的程序變成程序組組長。如果pid是0,則程序
*組id為pgid,如果pgid是0,則程序組id為pid。*/
int setpgrp(); //將當前程序所屬的程序組的pid設定為當前程序的pid,相當於setpgid(0, 0)
1.2會話
1.2.1 會話基本概念
一次登入形成乙個會話,乙個會話可包括多個程序組(乙個前台程序組和多個後台程序組),但只能有乙個前台程序組。
1.2.2 相關函式
#include
pid_t setsid();
當呼叫該函式的程序不是程序組的領頭程序時,該函式才能建立新的會話。函式呼叫成功後,呼叫程序成為新會話的領頭程序和新程序的領頭程序,同時程序失去控制終端。
1.3控制終端
程序組中有領頭程序,類似地,會話中也對應有領頭程序。會話的領頭程序開啟乙個終端之後,該終端就成為會話的控制終端,與控制終端建立連線的會話的領頭程序成為控制程序(session leader)。乙個會話只能有乙個控制終端,同時乙個控制終端只能乙個會話。 產生在控制端上的輸入和訊號(比如按下ctrl+c就會產生sigint訊號)將傳送給會話的前台程序組中的所有程序。
2守護程序及其特性
1、守護程序最重要的特性是後台執行;
2、守護程序必須與其執行前的環境脫離開來。這些環境包括未關閉的檔案描述符,控制終端,會話和程序組,工作目錄等,這些環境通常是從執行它的父程序(特別是shell)中繼承下來的。
3、守護程序可以在linux系統啟動時從指令碼/etc/rc.d中啟動,可以由作業規劃程序crond啟動,還可以由使用者終端(通常是shell)執行。
3 守護程序程式設計
針對守護程序的特性可以將普通程序改造為守護程序。
3.1後台執行特性
讓daemon在子程序中執行。
if( pid=fork() )
3.2脫離環境
3.2.1脫離程序組、登入會話和控制終端
程序組、登入會話和控制終端通常都是從父程序繼承下來的,為了不受它們的影響,控制終端必須將其擺脫。具體方法是呼叫setsid函式。
通過if( pid=fork() )將產生了子程序,能保證呼叫setsid的程序不是程序組中的領頭程序。當setsid呼叫成功後,該子程序成為新會話中的領頭程序和程序組的領頭程序,並脫離了原來的會話、程序組和控制終端。
3.2.2禁止程序開啟控制終端
if( pid=fork() )
結束該子程序,產生新的子程序,此時的新子程序不是會話領頭程序,所以不能開啟控制終端。通過這種方式就能禁止程序開啟控制終端。
3.2.3脫離開啟的檔案描述符
程序從其父程序繼承了開啟的檔案描述符。如不關閉,將會造成系統資源的浪費,同時,造成程序所在的檔案系統無法解除安裝以及引起其他無法預料的錯誤。
max_fd = sysconf(_sc_open_max);
for(i = 0; i < max_fd; i++)
3.2.4脫離當前工作目錄
程序活動時,其工作目錄所在的檔案系統不能解除安裝,一般需要將工作目錄切換到根目錄。對於需要執行日誌的程序將工作目錄改變到特定的目錄。
chdir(「/」);
3.2.5重設檔案的許可權掩碼
程序從其父程序繼承的檔案的許可權掩碼,可能會修改守護程序所建立的檔案許可權,需要將掩碼清楚。
umask(0);
3.2.6處理sigchld訊號
處理sigchld訊號並不是必須的。但對於某些程序,特別是伺服器程序往往在請求到來時生成子程序處理請求。如果父程序沒有等待(沒有呼叫wait或waitpid)子程序的結束,子程序將成為殭屍程序(zombie process)從而占用系統資源。而如果父程序等待子程序結束,又將增加父程序的負擔,影響伺服器程序的併發效能。在linux可以將sigchld設定為sig_ign,這樣核心在子程序結束時不會產生殭屍程序。
signal(sigchld, sig_ign); //遮蔽sigchld訊號
這是常用於併發伺服器提公升效能的乙個技巧。當伺服器程序沒有呼叫wait去清理子程序而產生殭屍子程序時,如果遮蔽了sigchld訊號,核心會把殭屍子程序轉交給init程序處理。
4 守護程序示例
#include
#include
#include
#include
#include
#include
voidinit_daemon()
else
if(pid
setsid();
if(pid = fork())
else
if(pid
/* 關閉開啟的檔案描述符*/
max_fd = sysconf(_sc_open_max);
for(i = 0; i
/* 切換工作目錄 */
chdir("/tmp"
);
/* 重設檔案建立掩碼 */
umask(0);
return;
}
intmain()
}
return0;
}
編譯:gcc –o daemon daemon.c
執行:./daemon
檢視守護程序:ps –ef |grep daemon
Linux守護程序
linux下守護程序一般分為5步,但是實際上只有前兩步是關鍵。第一步 建立子程序,關閉父程序。使用fork 建立,父程序exit 退出。關鍵第二步 建立新的會話id,setsid 作用是使子程序擺脫原有的會話 程序組 終端的控制,其實,linux下每個程序都是由一號程序建立而來的,每個程序都是1號程...
Linux 守護程序
守護程序daemon,是生存期較長的一種程序,名字一般以字母d結尾。它們常常在系統自舉時啟動,僅在系統關閉時才終止。因為它們沒有控制終端,所以說它們是在後台執行的。linux系統有很多守護程序,它們執行日常事務活動。自舉只有兩個功能 加電自檢和磁碟引導。加電自檢 當我們按下計算機電源開關時,頭幾秒鐘...
Linux守護程序
程式設計級別 一 守護程序的概念 守護程序是一種生存期比較長的程序,常常在系統自舉時啟動,在系統關閉時退出。因為他們沒有控制終端,因此是在後台執行的。二 守護程序的程式設計規則 1清除檔案模式建立遮蔽字 2成為乙個新的會話首程序 3略hup訊號。然後再次fork 4改變當前工作路徑 5關閉所有的檔案...