[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > 網絡編程 > 正文
UNIX下守護進程(Daemon)的編寫
作者:bobdai[bobdai@sohu.com] (2001-04-19 12:52:20)
    UNIX下的網絡服務程序,如Web Server,FTP,Telnet一般都是由守護進程(Daemon)來實現的。守護進程不佔用終端,在台運行。UNIX的守護進程一般都命名為 *d 的形式,如httpd,telnetd等等。其實,守護進程的實現是非常簡單的,在我的程序中,我使用一個INIT_DAEMON宏來實現守護進程的初始化工作,如圖2.4所示。第一次調用fork函數,為避免掛起控制終端將守護進程放入台執行。然調用setsid函數脫離控制終端,登錄會話和進程組,使該進程成為會話組長,與原來的登錄會話和進程組脫離,進程同時與控制終端脫離。進程已經成為無終端的會話組長。但它可以重新申請打開一個控制終端。可以通過使進程不再成為會話組長來禁止進程重新打開控制終端,這就需要第二次調用fork函數,父進程(會話組長)退出,子進程繼續執行,並不在擁有打開控制終端的能力。在正在執行的進程中調用INIT_DAEMON 進程將成 

#define INIT_DAEMON \ 

{ \

  if( fork() > 0 ) exit(0); \ 

  setsid(); \ 

  if( fork() > 0 ) exit(0); \ 

} 

           圖 2.4 

為守護進程,脫離控制終端進入台執行。比如,我們的網絡服務程序,可以在完成創建套接口,綁定套接口,設置套接口為監聽模式,變成守護進程進入台執行而不佔用控制終端,這是網絡服務程序的常用模式。 

  INIT_DAEMON宏只提供了很簡單的功能,守護進程一旦脫離了終端,退出就成了問題。我目前使用 PS 查出進程ID然 kill 之,笨得實在可以。以進一步想出一種更好的守護進程退出機制,有辦法的朋友,請不吝賜教寫信給我,我會帖出來的。
(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章

======
 

★  樊強制作 歡迎分享  ★