守護進程是在后臺運行不受終端控制的進程(如輸入、輸出等),一般的網絡服務都是以守護進程的方式運行。守護進程脫離終端的主要原因有兩點:(1)用來啟動守護進程的終端在啟動守護進程之后,需要執行其他任務。(2)(如其他用戶登錄該終端后,以前的守護進程的錯誤信息不應出現)由終端上的一些鍵所產生的信號(如中斷信號),不應對以前從該終端上啟動的任何守護進程造成影響。要注意守護進程與后臺運行程序(即加&啟動的程序)的區別。
創建守護進程的過程:
fork子進程, 父進程退出, 所有工作在子進程中進行形式上脫離了控制終端; 必須
子進程創建新會話, setsid函數, 使子進程完全獨立出來, 脫離控制; 必須
改變當前目錄為根目錄, chdir()函數, 防止占用可卸載的文件系統, 也可以換成其它路徑, 為了增強程序的健壯性; 非必須
重設文件權限掩碼, umask()函數, 防止繼承的文件創建屏蔽字拒絕某些權限, 增加守護進程靈活性; 非必須
關閉文件描述符, 繼承的打開文件不會用到, 浪費系統資源, 無法卸載, close(0), close(1), close(2); 非必須
執行核心工作
守護進程退出處理程序模型;
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <