Linux守護程序

2021-09-24 17:17:30 字數 2094 閱讀 9833

守護程序(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關閉所有的檔案...