? ? ????很多進程是從系統(tǒng)啟動就開始運行史飞,一直運行到系統(tǒng)關閉猫妙。對于有這種特殊需求的進程瓷翻,就給它取了個名字,叫守護進程割坠。由于守護進行是一直運行的齐帚,為了防止它中途受到干擾,就把它的控制終端去掉了彼哼。但把控制終端去掉之后对妄,守護進程要輸出東西怎么辦?只能把要輸出的內容寫到文件里了敢朱。但是守護進程A在B目錄下的文件C寫剪菱,守護進程D在E目錄下F文件寫摩瞎,系統(tǒng)那么多守護進程腺律,要查找某個守護進程的輸出記錄就很麻煩臭觉。于是用syslog將它們統(tǒng)一起來情屹。
? ? ? ? 有些進程只允許它的一個實例運行疮绷。舉個例子說莉擒,如果一個系統(tǒng)里有兩個進程調度器澜躺,調度器A調度進程C運行吼虎,調度器B調度進程D運行元暴,就亂套了喜颁。創(chuàng)建單實例進程的方法是稠氮,創(chuàng)建一個文件和寫鎖。那么當一個實例運行后半开,另一個實例要運行的時候隔披,創(chuàng)建寫鎖就會失敗。
? ? ? ? 守護進程通常由系統(tǒng)啟動寂拆。守護進程如果有配置文件的話奢米,通常只在這個守護進程啟動的時候讀這個文件。這就是為什么一般設置完配置文件之后漓库,要restart一下守護進程恃慧。
? ? ? ? 服務器進程中通常調用fork()然后exec()向客戶端提供服務。但是服務器進程可能打開了很多文件描述符渺蒿,而子程序可能用不到這些文件描述符痢士,所以可以在服務器進程中將這些子程序不需要的文件描述符設置為FD_CLOEXE。
問題:為什么創(chuàng)建守護進程需要兩個fork()?
? ? ? ? 由于守護進程需要分離控制終端茂装,所以需要setsid()怠蹂。由于setsid()創(chuàng)建新會話并且使非進程組組長進程成為領頭進程,所以需要一個非進程組組長進程少态,于是需要第一個fork().假設產生一個子進程A城侧。它是會話的首進程。由于沒有與控制終端連接的會話首進程打開終端設備時彼妻,如果這個終端設備不是其他會話的控制終端嫌佑,該終端設備將自動成為這個會話的控制終端。為了防止這種情況出現侨歉,需要將子進程A變?yōu)闀挼姆鞘走M程屋摇,于是需要第二個fork()。fork()子進程繼承父進程的進程組id幽邓,會話id炮温。