運行在後臺的程序,一般不須要與用戶進行交互的。shell
任何父進程id是0的一般是kernel進程,做爲系統啓動的一部分,除了init是用戶態的命令。session
第一件事情是調用umask設置文件模型的mask爲0,文件mode creation mask能夠被進程繼承,但daemon進程須要建立文件時,須要特殊的權限。命令行
調用fork,退出父進程exit,這能夠作幾件事情,首先,daemon將使用shell命令行啓動,其次,子進程繼承了process group id,但獲取一個新的id,所以咱們能夠確保子進程不會是一個process group leader,爲調用setsid作準備。繼承
調用setsid建立一個新的session。該進程開始成爲一個新的session的session leader,而後成爲新的process group的process group leader,而且沒有controlling terminal。進程
一些基於System V的用戶推薦再fork一下,第二個child仍舊是一個daemon,而後保證該daemon不是一個session leader,在System V規則下阻止獲得一個控制終端。terminal
避免獲取一個終端,使用O_NOCTTY來確保打開一個非終端設備。it
修改當前目錄爲根目錄(即/),爲房子daemon存在於mounted file system中,系統重啓時,文件系統不可以unmounted。io
不須要的文件描述符應該關閉,阻止從parent中繼承下來的文件描述符。後臺
因爲沒有終端的緣故,所以須要將文件描述符0,1和2將切換到/dev/null。file