【守護進程】linux守護進程(Daemon)創建過程詳解

守護進程

在這裏插入圖片描述

我們一般使用ps命令查看運行的進程信息。top命令爲動態顯示
在這裏插入圖片描述
當前進程ID PID
父進程ID PPID
進程組ID PGID
會話期ID SID
控制終端 TTY
終端進程組 TPGID

守護進程linux中的後臺進程,獨立於控制終端,生命週期從系統啓動到系統關閉。當我們創建一個子進程時,子進程繼承了父進程的進程組ID、會話期ID

創建守護進程的步驟

1.創建子進程,父進程退出

pid=fork();
if(pid>0)
{
exit(0); //父進程退出
}

此時子進程成爲孤兒進程,由init進程(也就是1號進程接管),但其他依然沒有變。

2. 脫離控制終端,創建新會話

//這裏用到setsid()函數
頭文件: #include<sys/types.h>
	    #include<unistd.h>
函數原型:pid_t setsid(void)
返回值:成功:該進程組ID
	   出錯:-1

setsid函數的作用:

  • 讓進程擺脫原會話的控制
  • 讓進程擺脫原進程組的控制
  • 讓進程擺脫原控制終端的控制

我們在創建守護進程第一步時,fork了子函數並且繼承了父函數的進程組、控制終端、會話期等,雖然父進程退出了,但原來的這些控制並沒有改變,而調用setsid()函數可以讓進程真正意義上獨立出來,脫離控制

3. 改變當前工作目錄

子進程繼承了父進程的工作目錄,當前目錄有很多文件系統不能卸載(mnt/usb等),爲避免以後造成麻煩,一般會修改工作目錄(一般設置爲"/"(根目錄)),使用函數chdir()
在這裏插入圖片描述
4. 重設文件權限掩碼
子進程繼承了父進程的文件掩碼,爲避免給該子進程使用文件造成影響,一般會修改爲0,使用函數umask()
在這裏插入圖片描述
5. 關閉文件描述符
子進程繼承父進程時,可能同時繼承了某些已經打開的文件,這些文件可能永遠不會被守護進程訪問,浪費系統資源,而且還可能導致一些文件無法卸載

for(i=0;i<=getdablesize();i++)//獲取當前進程打開的所有文件描述符的最大數
{
	close(i);
}

在這裏插入圖片描述

發佈了34 篇原創文章 · 獲贊 41 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章