守護進程是在后臺運行不受終端控制的進程(如輸入、輸出等),一般的網絡服務都是以守護進程的方式運行。守護進程脫離終端的主要原因有兩點:(1)用來啟動守護進程的終端在啟動守護進程之后,需要執行其他任務。(2)(如其他用戶登錄該終端后,以前的守護進程的錯誤信息不應出現)由終端上的一些鍵所產生的信號(如中斷信號),不應對以前從該終端上啟動的任何守護進程造成影響。要注意守護進程與后臺運行程序(即加&啟動的程序)的區別。
創建守護進程的過程:
1. 調用fork創建子進程。父進程終止,讓子進程在后臺繼續執行。
2. 子進程調用setsid產生新會話期并失去控制終端調用setsid()使子進程進程成為新會話組長和新的進程組長,同時失去控制終端。
3. 忽略SIGHUP信號。會話組長進程終止會向其他進程發該信號,造成其他進程終止。
4. 調用fork再創建子進程。子進程終止,子子進程繼續執行,由于子子進程不再是會話組長,從而禁止進程重新打開控制終端。
5. 改變當前工作目錄為根目錄。一般將工作目錄改變到根目錄,這樣進程的啟動目錄也可以被卸掉。
6. 關閉打開的文件描述符,打開一個空設備,并復制到標準輸出和標準錯誤上。 避免調用的一些庫函數依然向屏幕輸出信息。
7. 重設文件創建掩碼清除從父進程那里繼承來的文件創建掩碼,設為0。
8. 用openlog函數建立與syslogd的連接。