守護進程

守護進程

守護進程概念

什麼是守護進程

守護進程就是後臺運行的一種特殊的進程,它獨立於控制終端並且週期性的進行某種任務或者等待處理某些時間。

守護進程的應用

守護進程是一種很有用的進程。Linux的大多數服務器就是用守護進程實現的,比如,ftp服務器,ssh服務器,Web服務器httpd等。同時,守護進程完成許多的系統任務,比如說作業規劃等

守護進程的特點

(1)自成進程組,自成會話,與控制終端脫關聯

(2)守護進程的父進程是1號進程,其實守護進程都是孤兒進程

(3)守護進程的命令一般以字符d結尾,代表deamon

(4)守護進程的生命週期是7*24小時不掉線

查看系統中進程

ps axj | more
a表示顯示其他用戶下的進程
x表示不僅顯示有控制終端的進程,也顯示沒有控制終端的進程
j表示列出與作業有關的信息
  • 凡是TPGID一欄寫着-1的都是沒有控制終端的進程,也就是守護進程
  • 在COMMAND一列用[]括起來的名字標識內核線程,這些線程在內核裏創建,沒有用戶空間代碼,因此沒有程序文件名和命令行,通常採用以k開頭的名字,表示Kernel
  • init進程我們已經很熟悉了,udevd負責維護/dev目錄下的設備文件,acpid負責電源管理,syslogd負責維護/val/log下的日誌文件
  • 可以看出,守護進程通常採用以d結尾的名字,表示Daemon

創建守護進程

知識儲備

最關鍵的一步調用setsid函數

#include <unistd.h>
pid_t setsid(void);
調用該函數的作用

創建一個新的Session

成功調用該函數的結果

(1)創建了一個新的Session,當前進程成爲Session Leader,當前進程的id就是Session的id

(2) 創建了一個新的進程組,該進程稱爲該進程組的Leader,當前進程的id就是進程組的id。

(3) 如果當前進程原本有一個控制終端,則它失去了這個控制終端的控制權限。所謂失去控制終端是指,原來的控制終端仍然是打開的,仍然可以讀寫,但只是一個普通的打開文件而不是控制終端了。

創建守護進程的步驟

(1)umask(0)

調用umask將文件模式創建屏蔽字設置爲0,守護進程創建文件可以獲得最大的權限

(2)調用fork

調用setsid的進程不能是進程組Leader,所以先fork,然後父進程退出2

(3)調用setsid()

創建一個新的會話

(4)設置忽略SIGCHLD信號

忽略SIGCHLD信號,如果守護進程創建了子進程後,子進程退出時會自動被操作系統回收,不需要調用waitpid

(5)將當前工作目錄更改爲根目錄

防止當前目錄有一個目錄被刪除,導致守護進程無效,使用fork創建的子進程繼承了父進程的當前工作目錄,由於在進程運行中,當前目錄所在的文件系統是不能被卸載的,這對以後使用會造成好多的麻煩,因此通常的做飯是讓"/"作爲守護進程的當前目錄,當然也可以指定其他別的目錄作爲守護進程的工作目錄

(6)關閉不需要的文件描述符

有些文件被打開了但永遠不會被守護進程讀寫,這就造成了系統的資源浪費,所以關閉最好.比如

close(0);
close(1);
close(2);

fork兩次的原因

第一次

第一次fork作用主要是爲了setsid服務,因爲調用setsid的進程不能是進程Leader

第二次

第二次不是必須的,第二次fork是在調用了setsid之後,目的爲了防止進程再打開一個控制終端,打開控制終端的條件是必須是會話Leader,但是如果再fork一下,子進程id就不等於會話Id了,這樣就不可能打開一個控制終端了

系統提供創建守護進程的接口

daemon函數

int daemon(int nochdir, int noclose);
參數傳0代表能改變,也就是說當前目錄可以改變,可以改變文件描述符的打開與關閉

參數

當 nochdir爲零時,當前目錄變爲根目錄,否則不變;

當 noclose爲零時,標準輸入、標準輸出和錯誤輸出重導向爲/dev/null,也就是不輸出任何信 息,否則照樣輸出。

返回值

deamon()調用了fork(),如果fork成功,那麼父進程就調用_exit(2)退出,所以看到的錯誤信息 全部是子進程產生的。如果成功函數返回0,否則返回-1並設置errno。

這個函數把上面的事都幫你做了,你只需要像下面那樣調用即可

#include <stdio.h>
#include <unistd.h>

int main()
{
    daemon(0,0);
    while(1);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章