天天看點

Linux Daemon守護程序程式設計

 守護程序,也就是通常說的Daemon程序,是Linux中的背景服務程序。它是一個生存期較長的程序,通常獨立于控制終端并且周期性地執行某種任務或等待處理某些發生的事件。守護程序常常在系統引導裝入時啟動,在系統關閉時終止。Linux系統有很多守護程序,大多數服務都是通過守護程序實作的,同時,守護程序還能完成許多系統任務,例如,作業規劃程序crond、列印程序lqd等(這裡的結尾字母d就是Daemon的意思)。

      一般情況下守護程序可以通過以下幾種方式産生:

1,在系統啟動的時候由啟動腳本啟動,這些啟動腳本通常放在/etc/rc.d目錄下

2,利用inetd超級系統伺服器啟動,如telnet等

3,由cron定時啟動以及在終端用nohup啟動的程序也是守護程序  

     由于在Linux中,每一個系統與使用者進行交流的界面稱為終端,每一個從此終端開始運作的程序都會依附于這個終端,這個終端就稱為這些程序的控制終端,當控制終端被關閉時,相應的程序都會自動關閉。但是守護程序卻能夠突破這種限制,它從被執行開始運轉,直到整個系統關閉時才退出。如果想讓某個程序不因為使用者或終端或其他地變化而受到影響,那麼就必須把這個程序變成一個守護程序。

守護程序的變成要點:

1. 蔽一些有關控制終端操作的信号

   這是為了防止在守護程序還沒悠運作之前,控制終端收到幹擾推出或者挂起

signal(SIGTTOU,SIG_IGN);

signal(SIGTTIN,SIG_IGN);

signal(SIGTSTP,SIG_IGN);

signal(SIGHUP,SIG_IGN);

2. 在背景運作。

  為避免挂起控制終端而将Daemon放入背景執行。方法是在程序中調用fork使父程序終止,讓Daemon在子程序中背景執行。

      if(pid=fork())

          exit(0);//是父程序,結束父程序,子程序繼續

3. 脫離控制終端,登入會話和程序組

      程序屬于一個程序組,程序組号(GID)就是程序組長的程序号(PID)。登入會話可以包含多個程序組。這些程序組共享一個控制終端。這個控制終端通常是建立程序的登入終端。控制終端,登入會話和程序組通常是從父程序繼承下來的。我們的目的就是要擺脫它們,使之不受它們的影響。方法是在第1點的基礎上,調用setsid()使程序成為會話組長:

    setsid()

4. 關閉打開的檔案描述符

  程序從建立它的父程序那裡繼承了打開的檔案描述符。如不關閉,将會浪費系統資源,造成程序所在的檔案系統無法卸下以及引起無法預料的錯誤。按如下方法關閉它們:

  #define   NOFILE   256  ;//不同系統中不同數值

  for(i=0;i<NOFILE;i++)

         colse(i);

5. 改變目前工作目錄

     程序活動時,其工作目錄所在的檔案系統不能卸下。一般需要将工作目錄改變到根目錄。對于需要轉儲核心,寫運作日志的程序将工作目錄改變到特定目錄如/tmpchdir("/")

   chdir("/");

6. 重設檔案建立掩模

    程序從建立它的父程序那裡繼承了檔案建立掩模。它可能修改守護程序所建立的檔案的存取位。為防止這一點,将檔案建立掩模清除0:

   umask(0);

7. 處理SIGCHLD(子程序退出信号)信号

   處理SIGCHLD信号并不是必須的。但對于某些程序,特别是伺服器程序往往在請求到來時生成子程序處理請求。如果父程序不等待子程序結束,子程序 将成為僵屍程序(zombie)進而占用系統資源。如果父程序等待子程序結束,将增加父程序的負擔,影響伺服器程序的并發性能。在Linux下可以簡單地 将SIGCHLD信号的操作設為SIG_IGN。

 signal(SIGCHLD,SIG_IGN);

下面給出一個例程

繼續閱讀