守護進程

守護進程也稱精靈進程(Daemon),它自成一個會話,自成一個進程組,無所謂前臺,無所謂後臺。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。

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

Linux系統啓動時會啓動很多系統服務進程,這些系統服 務進程沒有控制終端,不能直接和用戶交互。其它進程都是在用戶登錄或運行程序時創建,在運行結束或用戶註銷時終止,但系統服務進程不受用戶登錄註銷的影響,它們一直在運行着。這種進程有一個名稱叫守護進程(Daemon)。

用用ps -axj命令查看系統中的進程:

  1. 參數a表示不僅列當前用戶的進程,也列出所有其他用 戶的進程
  2. 參數x表示不僅列有控制終端的進程,也列出所有無控制終端的進程
  3. 參數j表示列出與 作業控制相關的信息

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

                   

守護進程的創建:

創建守護進程最關鍵的一步是調用用setsid函數創建一個新的Session,併成爲Session Leader。

                

該函數調用成功時返回新創建的Session的id(其實也就是當前進程的id),出錯返回-1。注意,調用這個函數之前,當前進程不允許是進程組的Leader,否則該函數返回-1。要保證當前進程不是進 程組的Leader也很容易,只要先fork再調用setsid就行行了。fork創建的子進程和父進程在同一個進 程組中,進程組的Leader必然是該組的第一個進程,所以子進程不可能是該組的第一個進程,在子 進程中調用setsid就不會有問題了。

成功調用用該函數的結果是:
1. 創建一個新的Session,當前進程成爲Session Leader,當前進程的id就是Session的id。
2.創建一個新的進程組,當前進程成爲進程組的Leader,當前進程的id就是進程組的id。
3. 如果當前進程原本有一個控制終端,則它失去這個控制終端,成爲一個沒有控制終端的進程。所謂失去控制終端是指,原來的控制終端仍然是打開的,仍然可以讀寫,但只是一個普通的打開文件而不是控制終端了

步驟:

  1. 調用umask將文件模式創建屏蔽字設置爲0.
  2. 調用fork,父進程退出(exit)。原因:1)如果該守護進程是作爲一條簡單的shell命令啓動的,那麼父進程終止使得shell認爲該命令已經執行完畢。2)保證子進程不是一個進程組的組長進程。
  3. 調用setsid創建一一個新會話。setsid會導致:1)調用進程成爲新會話的首進程。 2)調用進程成爲一個進程組的組長進程 。3)調用進程沒有控制終端。(再次fork一次(可選),保證daemon進程,之後不會打開tty設備)
  4. 將當前工作目錄更改爲根目錄。
  5. 關閉不在需要的文件描述符。
  6. 其他:忽略SIGCHLD信號。

下面貼上我自己實現的my_daemon版本:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>

void my_daemon()
{
	umask(0);

	if (fork() > 0)
	{
		exit(0);
	}

	setsid();
	chdir("/");
	close(0);
	close(1);
	close(2);
	signal(SIGCHLD, SIG_IGN);
}

int main()
{
	my_daemon();
	while (1);

	return 0;
}

自己寫一個my_daemon只是爲了瞭解其底層工作的原理,真正用的時候當然是調用系統的接口了:

              

其中兩個參數分別表示是否需要更改當前工作目錄,是否需要關閉標準輸入輸出和錯誤。都傳0表示更改且關閉。


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