daemon進程fork一次和fork兩次區別

          守護進程也稱爲精靈進程(Daemon),是運行在後臺的一種特殊的進程。它獨立於控制終端並且週期性的執行某種任務負等待處理某些發生的事件。因爲他們沒有控制終端,所以說他們是在後臺運行的。
      守護進程存在的原因:
      daemon函數存在的原因是因爲控制終端由於某些原因(如斷開終端連接)會發送一些信號的原因。而接受處理這些信號的缺省動作會讓進程退出。這些信號會由於終端敲一些特殊按鍵產生。
      創建守護進程的步驟:
   (1)調用umask將文件模式創建屏蔽字設置爲0;
   (2)父進程fork出子進程,然後子進程調用setsid,父進程直接退出(保證了子進程不是一個進程組的進程組長);
   (3)調用setsid創建一個新的會話(調用成功會使調用進程成爲會話的首進程,併成爲一個進程租的組長進程,調用進程沒有控制終端);
   (4)將當前工作目錄更改爲根目錄;
   (5)關閉不需要的文件描述符;
   (6)忽略SIGCHLD信號。
  要知道在創建守護進程的時候fork一次和fork兩次的兩者的區別,就要先知道第一次fork和第二次fork都起到什麼作用:
    (1)調用一次fork的作用:
     第一次fork的作用是讓shell認爲這條命令已經終止,不用掛在終端輸入上,還有就是爲了後面上的setsid服務,因爲調用setsid函數的進程不能是組長進程,如果不fork出子進程,則此時的父進程是進程組長,就無法調用setsid。當子進程調用完setsid函數之後,子進程是會話組長也是進程組組長,並且脫離了控制終端,此時,不管控制終端如何操作,新的進程都不會收到一些信號使得進程退出。
    (2)第二次fork的作用:
     雖然當前關閉了和終端的聯繫,但是後期可能會誤操作打開了終端。只有會話首進程能打開終端設備,也就是在fork一次,再把父進程退出,再次fork的子進程作爲守護進程繼續運行,保證了該精靈進程不是對話期的首進程,第二次不是必須的,是可選的,市面上有些開源項目也是fork一次。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章