1. 程式人生 > >Linux入門:建立守護程序

Linux入門:建立守護程序

       守護程序(deamon),也稱精靈程序,是一種執行在後臺的一種特殊的程序,它獨立於控制終端並且週期性的執行某種任務或等待處理某些發生的事件。由於在Linux中,每個系統與使用者進行交流的介面成為終端,每一個從此終端開始執行的程序都會依附於這個終端,這個終端被稱為這些程序的控制終端,當控制終端被關閉的時候,相應的程序都會自動關閉。但是守護程序卻能突破這種限制,它脫離於終端並且在後臺執行,並且它脫離終端的目的是為了避免程序在執行的過程中的資訊在任何終端中顯示並且程序也不會被任何終端所產生的終端資訊所打斷。它從被執行的時候開始運轉,直到整個系統關閉才退出(當然可以人為的殺死相應的守護程序)。如果想讓某個程序不因為使用者或中斷或其他變化而影響,那麼就必須把這個程序變成一個守護程序。

       守護程序一般以‘d’結尾,檢視當前守護程序:ps ajx | grep 'd$'

建立守護程序最重要的一步是呼叫setsid函式建立一個新的session,併成為session leader(pid_t setsid(void)),該函式呼叫成功時返回新建立的session的id(也就是當前程序的id),呼叫這個函式的程序不允許是當前程序組的組長程序,否則出錯返回-1。要保證當前程序不是組長程序只需要先fork一下再讓父程序退出(exit)即可。

程序組即是一個或多個程序的集合,每個程序組都有一個唯一的程序組id等於其組長程序的id,只要程序組中有一個程序存在,該程序組就存在,與組長程序是否存在無關;而每開啟一個終端就會新建一個會話,關閉一個終端則會關閉一個會話,此期間所有程序都會屬於這個會話。

成功呼叫該函式的結果是:

1.建立一個新的session,當前程序為session leader,當前程序的id為session的id。

2.建立一個新的程序組,當前程序成為程序組的leader,當前程序的id就是程序組的id。

3.如果當前程序原本有一個控制終端,則它失去這個控制終端,成為一個沒有終端的額守護程序。所謂失去終端是指,原來的控制終端仍然是開啟的,任然可以讀寫,但只是一個普通的檔案而不是控制終端了。

建立守護程序:

1.呼叫uamsk將檔案模式建立遮蔽字設定為0;

2.呼叫fork,父程序退出;

3.呼叫setsid建立一個新會話;

4.再次呼叫fork,讓父程序退出;

5.將當前工作目錄改為根目錄(因為根目錄下的檔案不易被刪除);

6.關閉不再需要的檔案描述符;

7.忽略SIGCHLD訊號。

第一次呼叫fork是必不可少的:

(1)如果該守護程序是作為一條簡單的shell命令啟動的,那麼父程序終止使shell認為該命令已執行完畢,不用

掛在輸入終端上

(2)為了呼叫setsid函式服務,保證子程序不是一個程序組的組長程序

第二次呼叫fork不是必須的,是為了防止誤操作再開啟一個會話終端,因為開啟一個會話終端的前提條件是該進        程需為會話組長,再fork一次,sid就為父程序的id,所以也就無法開啟新的會話終端。

程式程式碼:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void mydaemon()
{
	umask(0);
	if(fork() > 0)
		exit(0);
	setsid();
	if(fork() > 0)
		exit(0);

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

int main()
{
	mydaemon();
	while(1)
	{
	}

	return 0;
}

執行結果:


也可以呼叫函式建立守護程序:


int daemon(0, 0);