在linux或者unix作業系統中在系統的引導的時候會開啟很多服務,這些服務就叫做守護程序。守護程序是在背景運作不與任何控制終端關聯,是linux中的背景服務程序。它是一個生存期較長的程序,通常獨立于控制終端并且周期性地執行某種任務或等待處理某些發生的事件。大多數服務都是通過守護程序實作的。它從被執行開始運轉,直到整個系統關閉時才退出。如果想讓某個程序不因為使用者或終端或其他地變化而受到影響,那麼就必須把這個程序變成一個守護程序。
建立守護程序
通過一系列的操作,可以把一個普通程序轉變位守護程序。
為了防止守護程序從繼承來的檔案模式建立屏蔽字屏蔽了某些權限。
如果程序是從一個shell指令啟動的,父程序終止shell會認為指令執行完畢。
而子程序繼承了父程序的程序組id,而它的程序id和父程序id不同,這就保證 .子程序不是一個程序組的頭程序,為調用setsid提供必要條件。
首先要知道會話的概念,會話是一個多個程序組的集合。
如果該調用程序已經是一個程序組的組長程序該函數傳回出錯。是以通常先fork後使父程序終止。子程序再調用setsid.正如第一步。如下面的程式,父程序作為組長程序調用setsid将會報錯。
調用setsid後,調用程序成為新會話的第一個程序,此時該程序是新會話中唯一的程序,并且成為新程序組的組長程序,新程序組id為調用程序id。
確定子程序不再是一個會話頭程序,不能自動獲得一個控制終端。這裡忽略sighup信号是因為會話首程序終止時,會話中所有程序都會收到sighup信号而終止。
目前工作目錄可能是挂在到系統上的,如果守護程序運作,會導緻挂載的目錄無法解除安裝,是以要改變目錄。
調用sysconf(_sc_open_max)擷取程序可打開檔案的限制,并關閉所有描述符。
如果stdin,stdout,stderr被關閉,如果建立了socket描述符,描述符值可能為stdin,stdout或stderr中值的某一個,那麼當調用向标準輸入輸出出錯寫入資料的操作可能會發送給socket套接字對端,造成錯誤。
例如下面的程式,關閉标準出錯,建立一個套接字,正常情況下該套接字描述符為2,即标準出錯的描述符值,那麼調用perror向标準出錯中寫入資料,将發送到對端,對端将接收到調用perror發送來的資料并列印,然後perror寫入到标準出錯的資料隻被對端列印了一次,具體内部細節這裡不做讨論。
關閉标準出錯,調用perror的客戶程式
服務程式
下面展示了一個建立守護程序的示例