作業系統

當前位置 /首頁/計算機/作業系統/列表

Linux系統中的守護程序講解

守護程序daemon,是生存期較長的一種程序。它們常常在系統自舉時啟動,僅在系統關閉時才終止。因為它們沒有控制終端,所以說它們是在後臺執行的。UNIX系統有很多守護程序,它們執行日常事務活動。

Linux系統中的守護程序講解

1、系統自舉

自舉(bootstrapping)一詞來自於人都是靠自身的自舉機構站立起來的這一思想。計算機必須具備自舉能力將自己所有的元件啟用,以便能完成載入作業系統這一目的,然後再由作業系統承擔起那些單靠自舉程式碼無法完成的更復雜的任務。

自舉只有兩個功能:加電自檢和磁碟引導。

加電自檢:當我們按下計算機電源開關時,頭幾秒鐘機器似乎什麼反應也沒有,其實,這時的計算機正在進行加電自檢,以斷定它的`所有元件都在正確地工作。如果某個元件有故障,顯示器上就會出現報警提示資訊(如果顯示器也不能正常工作,則以一串嘟嘟聲來報警)。由於大多數計算機工作非常可靠,加電自檢報警非常罕見。

磁碟引導:查詢裝有作業系統的磁碟驅動器。從磁碟載入作業系統的原因有二,一是作業系統升級簡單容易,二是使使用者擁有選擇作業系統的自由。

當加電自檢和磁碟引導完成時,自舉操作就啟動一個讀寫作業系統檔案和將它們複製到隨機儲存器中的過程,此時的機器才是真正意義上的計算機。計算機的啟動可以有冷啟動和熱啟動兩種方式 ,它們之間的差別是熱啟動不進行機器的自檢(機器本身配置的檢查與測試),當計算機在使用過程中由於某些原因造成宕機時,可以對計算機進行熱啟動處理。

2、守護程序的概念

通過ps axj命令可以檢視到守護程序:

引數a表示不僅列當前使用者的程序,也列出所有其他使用者的程序,引數x表示不僅列有控制終端的程序,也列出所有無控制終端的程序,引數j表示列出與作業控制相關的資訊。

程式碼如下:PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 0 1 1 1 ? -1 Ss 0 0:01 /sbin/init 0 2 0 0 ? -1 S< 0 0:00 [kthreadd] 2 3 0 0 ? -1 S< 0 0:00 [migration/0] 2 4 0 0 ? -1 S< 0 0:00 [ksoftirqd/0]... 1 2373 2373 2373 ? -1 S<s 0 0:00 /sbin/udevd --daemon... 1 4680 4680 4680 ? -1 Ss 0 0:00 /usr/sbin/acpid -c /etc... 1 4808 4808 4808 ? -1 Ss 102 0:00 /sbin/syslogd -u syslog...

凡是TPGID一欄寫著-1的都是沒有控制終端的程序,也就是守護程序。在COMMAND一列用[]括起來的名字表示核心執行緒,這些執行緒在核心裡建立,沒有使用者空間程式碼,因此沒有程式檔名和命令列,通常採用以k開頭的名字,表示Kernel。init程序我們已經很熟悉了,udevd負責維護/dev目錄下的裝置檔案,acpid負責電源管理,syslogd負責維護/var/log下的日誌檔案,可以看出,守護程序通常採用以d結尾的名字,表示Daemon。 建立守護程序最關鍵的一步是呼叫setsid函式建立一個新的Session,併成為Session Leader。 例子: C/C++ Code複製內容到剪貼簿 void daemonize(void) { pid_t pid; printf("into deamonizen"); if (pid=fork() < 0) { perror("fork"); exit(1); } else if (pid !=0) { exit(0); } setsid(); if (chdir("/") < 0) { perror("chdir"); exit(1); } close(0); open("/dev/null", O_RDWR); dup2(0, 1); dup2(0, 2); printf("out deamonizen"); }

3、編寫守護程序 在編寫守護程序程式時,需遵循一些基本規則:

(1)首先要做的是呼叫umask將檔案模式建立遮蔽字設定為0。

(2)呼叫fork,然後使父程序退出。

(3)呼叫setsid以建立一個新會話。

(4)將當前工作目錄更改為根目錄。

(5)關閉不再需要的檔案描述符。

(6)某些守護程序開啟/dev/null使其具有檔案描述符0、1和2,任何一個試圖讀標準輸入、寫標準輸出或標準出錯的庫例程都不會產生任何效果。 與守護程序有關的一個問題是如何處理出錯訊息,需要有一個集中的守護程序出錯記錄設施,這就是syslogd程序。

4、守護程序慣例 為了正常運作,某些守護程序實現為單例項的,有就是在任一時刻只執行該守護程序的一個副本。檔案鎖和記錄鎖機制是一種方法的基礎,該方法用來保證一個守護程序只有一個副本在執行。

在UNIX系統中,守護程序遵循下列公共慣例:

(1)若守護程序使用鎖檔案,那麼該檔案通常存放在/var/run目錄中。鎖檔案的名字通常是,name是該守護程序或服務的名字。

(2)若守護程序支援配置選項,那麼配置檔案通常存放在/etc目錄中。配置檔案的名字通常是。

(3)守護程序可用命令列啟動,但通常它們是由系統初始化指令碼啟動的。

(4)若一守護程序有一配置檔案,那麼當該守護程序啟動時,它讀該檔案,但在此之後一般就不會再檢視它。