1. 程式人生 > 其它 >守護程序相關

守護程序相關

守護程序(Daemon)是執行在後臺的一種特殊程序。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。守護程序最重要的特性是後臺執行

比如週期進行系統校驗的程序

1、程序組

程序組就是一個或多個程序的集合。這些程序並不是孤立的,他們彼此之間或者存在父子、兄弟關係,或者在功能上有相近的聯絡。每個程序都有父程序,而所有的程序以init程序為根,形成一個樹狀結構,程序組的出現是為了統一的管理程序,每個程序能且僅能屬於一個程序組。程序組有組號和組長,但是直到組內的所有程序都結束了程序組才會結束

獲取當前程序所在的程序組的組ID
pid_t getpgrp(void);
獲取指定程序所在的程序組的組ID
pid_t getpgid(pid_t pid);
- pid: 指定的程序的PID
將一個程序送到另外的一個程序組,建立一個新的程序組
int setpgid(pid_t pid, pid_t pgid);
- pid: 要操作的程序的PID
- pgid: 程序組ID

2、會話

一個使用者登入一次系統就形成一次會話 。一個會話可包含多個程序組,但只能有一個前臺程序組。每個會話都有一個會話首領(leader),即建立會話的程序。一個會話可以有一個控制終端。這通常是登陸到其上的終端裝置(在終端登陸情況下)或偽終端裝置(在網路登陸情況下)。建立與控制終端連線的會話首程序被稱為控制程序

一次登入形成一個會話。一個會話可包含多個程序組,但只能有一個前臺程序組。

// 獲取程序所屬的會話ID
#include <unistd.h>
pid_t getsid(pid_t pid);
返回值:
成功: 會話ID, 失敗: -1

#include <unistd.h>
// 建立一個會話
// 在哪個程序中呼叫該函式, 這個程序就會被提升為會話
// - 沒有任何職務的程序才滿足條件, 普通的程序
// - 這個普通的程序會脫離原來的操作終端
pid_t setsid(void);

程序屬於一個程序組,程序組屬於一個會話,會話可能有也可能沒有控制終端。

一般而言,當用戶在某個終端上登入時,一個新的會話就開始了。程序組由組中的領頭程序標識,領頭程序的程序識別符號就是程序組的組識別符號。類似地,每個會話也對應有一個領頭程序。

同一會話中的程序通過該會話的領頭程序和一個終端相連,該終端作為這個會話的控制終端。一個會話只能有一個控制終端,而一個控制終端只能控制一個會話。使用者通過控制終端,可以向該控制終端所控制的會話中的程序傳送鍵盤訊號。

同一會話中只能有一個前臺程序組,屬於前臺程序組的程序可從控制終端獲得輸入,而其他程序均是後臺程序,可能分屬於不同的後臺程序組。

當我們開啟多個終端視窗時,實際上就建立了多個終端會話。每個會話都會有自己的前臺工作和後臺工作。

建立守護程序的步驟

- 1. 父程序建立子程序, 殺死父程序 -> 必須
- 2. 將子程序提升為會話 -> 必須
setsid();
- 3. 修改程序的工作目錄, 工作目錄切換到不能被解除安裝的目錄中: / /home -> 不是必須
目的: 防止有些不安全目錄被解除安裝:
在U盤總啟動一個程序, 把U盤拔了, 程序無法正常執行
chdir();
- 4. 修改umask掩碼 -> 不是必須
umask();
- 5. 關閉/重定向檔案描述符 -> 不是必須
- 標準輸入 -> close(0)
- 標準輸出 -> close(1)
- 標準錯誤 -> close(2)
- 重定向: 裝置檔案: /dev/null ->int fd = open("/dev/null", O_RDWR);
dup2(0, fd)