linux系統啟動時會啟動很多系統服務程序,比如inetd,這些系統服務程序沒有控制終端,不能直接和使用者互動。其它程序都是在使用者登入或執行程式時建立,在執行結束或使用者登出時終止,但系統服務程序不受使用者登入登出的影響,它們一直在執行著。這種程序有乙個名稱叫守護程序(daemon)。
下面我們用ps axj命令檢視系統中的程序。引數a表示不僅列當前使用者的程序,也列出所有其他使用者的程序,引數x表示不僅列有控制終端的程序,也列出所有無控制終端的程序,引數j表示列出與作業控制相關的資訊。
凡是tpgid一欄寫著-1的都是沒有控制終端的程序,也就是守護程序。在command一列用括起來的名字表示核心執行緒,這些執行緒在核心裡建立,沒有使用者空間**,因此沒有程式檔名和命令列,通常採用以k開頭的名字,表示kernel。init程序我們已經很熟悉了,udevd負責維護/dev目錄下的裝置檔案,acpid負責電源管理,syslogd負責維護/var/log下的日誌檔案,可以看出,守護程序通常採用以d結尾的名字,表示daemon。
建立守護程序最關鍵的一步是呼叫setsid函式建立乙個新的session,並成為session leader。
#include #include pid_t setsid();
該函式呼叫成功時返回新建立的session的id(其實也就是當前程序的id),出錯返回-1。注意,呼叫這個函式之前,當前程序不允許是程序組的leader,否則該函式返回-1。要保證當前程序不是程序組的leader也很容易,只要先fork再呼叫setsid就行了。fork建立的子程序和父程序在同乙個程序組中,程序組的leader必然是該組的第乙個程序,所以子程序不可能是該組的第乙個程序,在子程序中呼叫setsid就不會有問題了。
成功呼叫該函式的結果是:
建立乙個新的session,當前程序成為session leader,當前程序的id就是session的id。
建立乙個新的程序組,當前程序成為程序組的leader,當前程序的id就是程序組的id。
如果當前程序原本有乙個控制終端,則它失去這個控制終端,成為乙個沒有控制終端的程序。所謂失去控制終端是指,原來的控制終端仍然是開啟的,仍然可以讀寫,但只是乙個普通的開啟檔案而不是控制終端了。
為了確保呼叫setsid的程序不是程序組的leader,首先fork出乙個子程序,父程序退出,然後子程序呼叫setsid建立新的session,成為守護程序。按照守護程序的慣例,通常將當前工作目錄切換到根目錄,將檔案描述符0、1、2重定向到/dev/null。linux也提供了乙個庫函式daemon(3)實現我們的daemonize函式的功能,它帶兩個引數指示要不要切換工作目錄到根目錄,以及要不要把檔案描述符0、1、2重定向到/dev/null。
Linux之守護程序
守護程序是在作業系統執行起來以後常駐記憶體的程序,這些程序默默的在後台進行這自己的工作,當然我們是發現不了的,在linux系統下我們可以使用命令來檢視 ps axj 引數a表示列出所有使用者的程序,引數x表示列出控制終端的和沒有控制終端,引數j列出與作業控制相關的資訊 tpgid那一行為 1的表示沒...
Linux之守護程序
想實現的目標是通過守護程序monit監控另外乙個程序videocheck是否執行,如果videocheck關閉,則由守護程序重新啟動videocheck程序 本身使用的系統是ubuntu 14.04 monit的 如下 include include include include include ...
Linux之守護程序
daemon程序。通常執行與作業系統後台,脫離控制終端。一般不與使用者直接互動。週期性的等待某個事件發生或週期性執行某一動作。不受使用者登入登出影響。通常採用以d結尾的命名方式。1.fork子程序,讓父程序終止。2.子程序呼叫 setsid 建立新會話 3.通常根據需要,改變工作目錄位置 chdir...