守護程序(daemon)是在後台執行且不與任何控制終端關聯的程序。
與終端脫離有兩個目的:
避免程序執行過程中將資訊輸出到終端
避免程序被終端產生的資訊中斷
建立守護程序前首先需要理解幾個概念:程序組、會話、控制終端。
每個程序除了有一程序id(pid)之外,還屬於乙個程序組。
程序組是乙個或多個程序的集合,每個程序組有乙個程序組id。
每個程序組有乙個組長程序(process group leader),組長程序的pid等於它的程序組id。
會話(session)是乙個或多個程序組的集合。
會話中的多個程序組可被分為乙個前台程序組以及多個後台程序組。
乙個會話有乙個控制終端。
程序可以通過呼叫setsid函式建立乙個新會話。
pid_t setsid(void);
有一點需要注意:呼叫此函式的程序不能是乙個程序組的組長。呼叫該函式會發生以下3件事:
(1) 該程序變成新會話的會話首程序(session leader)
(2) 該程序成為乙個新程序組的組長程序
(3) 該程序沒有控制終端
建立守護程序的步驟如下:
(1)建立子程序,父程序退出
呼叫fork,然後父程序exit,這麼做實現下面兩點:第
一、如果本程序是從前台作為乙個shell命令啟動的,當父程序終止時,shell就認為該命令已經執行完畢,這樣子程序就自動在後台執行。第
二、子程序繼承了父程序的程序組id,而且它有自己的程序id,這就保證子程序不是乙個程序組的組長程序,這是接下去呼叫setsid函式的必要條件。
(2)呼叫setsid建立乙個新會話
步驟1中的子程序繼承了父程序的程序組、會話、控制終端,呼叫setsid函式會建立新的會話、新的程序組,而且沒有控制終端。
(3)忽略sighup訊號並再次fork
步驟2中的子程序是乙個會話首程序,當沒有控制終端的會話首程序開啟乙個終端裝置時,該終端自動成為這個會話首程序的控制終端。再次fork可以確保新的子程序不再是乙個會話首程序,從而不能自動獲得乙個控制終端。這裡必須忽略sighup訊號,因為當會話首程序終止時,其會話中的所有程序(包括再次fork產生的子程序)都會受到sighup訊號。
(4)將當前工作目錄更改為根目錄
(5)重設檔案許可權掩碼
(6)關閉所有開啟的檔案描述符
(7)重定向stdin、stdout、stderr
下面給乙個具體的例子:
#include #include#include
#include
#include
#include
#include
#include
#define maxfd 64
void
daemon_init()
else
if(pid)
//child 1
if (setsid() < 0
) signal(sighup, sig_ign);
if ( (pid = fork()) < 0
) else
if(pid)
//child 2
chdir("/"
); umask(0);
for (int i = 0; i < maxfd; i++)
open(
"/dev/null
", o_rdonly);
open(
"/dev/null
", o_rdwr);
open(
"/dev/null
", o_rdwr);
}int main(int argc, char **ar**)
sleep(1);
}}
Linux守護程序
linux下守護程序一般分為5步,但是實際上只有前兩步是關鍵。第一步 建立子程序,關閉父程序。使用fork 建立,父程序exit 退出。關鍵第二步 建立新的會話id,setsid 作用是使子程序擺脫原有的會話 程序組 終端的控制,其實,linux下每個程序都是由一號程序建立而來的,每個程序都是1號程...
Linux 守護程序
守護程序daemon,是生存期較長的一種程序,名字一般以字母d結尾。它們常常在系統自舉時啟動,僅在系統關閉時才終止。因為它們沒有控制終端,所以說它們是在後台執行的。linux系統有很多守護程序,它們執行日常事務活動。自舉只有兩個功能 加電自檢和磁碟引導。加電自檢 當我們按下計算機電源開關時,頭幾秒鐘...
Linux守護程序
程式設計級別 一 守護程序的概念 守護程序是一種生存期比較長的程序,常常在系統自舉時啟動,在系統關閉時退出。因為他們沒有控制終端,因此是在後台執行的。二 守護程序的程式設計規則 1清除檔案模式建立遮蔽字 2成為乙個新的會話首程序 3略hup訊號。然後再次fork 4改變當前工作路徑 5關閉所有的檔案...