daemon程式簡介
daemon是長時間執行的程序,通常在系統啟動後就執行,在系統關閉時才結束。一般說daemon程式在後台執行,是因為它沒有控制終端,無法和前台的使用者互動。daemon程式一般都作為服務程式使用,等待客戶端程式與它通訊。我們也把執行的daemon程式稱作守護程序。
比如,我們的網路服務程式,可以在完成建立套介面,繫結套介面,設定套介面為監聽模式後,變成守護程序進入後台執行而不占用控制終端,這是網路服務程式的常用模式。unix下的網路服務程式,如web server,ftp,telnet一般都是由守護程序(daemon)來實現的。守護程序不占用終端,在後台執行。unix的守護程序一般都命名為 *d 的形式,如httpd,telnetd等等。
守護程序一旦脫離了終端,退出就成了問題。使用 ps axj 查出程序id然後 kill id 之。
daemon程式編寫規則
編寫daemon程式有一些基本的規則,以避免不必要的麻煩。
1、首先是程式執行後呼叫fork,並讓父程序退出。子程序獲得乙個新的程序id,但繼承了父程序的程序組id。
2、呼叫setsid建立乙個新的session,使自己成為新session和新程序組的leader,並使程序沒有控制終端(tty)。
3、改變當前工作目錄至根目錄,以免影響可載入檔案系統。或者也可以改變到某些特定的目錄。
4、設定檔案建立mask為0,避免建立檔案時許可權的影響。
5、關閉不需要的開啟檔案描述符。因為daemon程式在後台執行,不需要於終端互動,通常就關閉stdin、stdout和stderr。其它根據實際情況處理。另乙個問題是daemon程式不能和終端互動,也就無法使用printf方法輸出資訊了。
另乙個問題是daemon程式不能和終端互動,也就無法使用printf方法輸出資訊了。我們可以使用syslog機制來實現資訊的輸出,方便程式的除錯。
下面是乙個daemon程式的例子:(daemontest.c)
#include #include #include #include #include #include #include int daemon_init(void)
void sig_term_func(int sig)
}int main(void)
openlog("daemontest", log_pid, log_user);
syslog(log_info, "program started.");
signal(sigterm, sig_term_func); //to catch the signal
while(1)
return 0;
}
使用如下命令編譯該程式: gcc -wall -o daemontest daemontest.c編譯完成後生成名為daemontest的可執行程式,執行./daemontest來測試程式的執行。
使用ps axj命令可以顯示系統中已執行的daemon程式的資訊,包括程序id、session id、控制終端等內容。部分顯示內容:
ppid pid pgid sid tty tpgid stat uid time command
1 17765 17765 17765 ? -1 ss 0 0:00 ./daemontest
從中可以看到daemontest程式執行的程序號為17765。
我們再來看看/var/log/messages檔案中的資訊:
feb 3 17:09:30 localhost daemontest[17765]: program started.
顯示了我們在程式中希望輸出的資訊。
使用kill 17765命令來殺死這個程序,/var/log/messages檔案中就會有如下的資訊:
feb 3 17:12:26 localhost daemontest[17765]: program terminated.
再使用ps axj命令檢查,發現系統中daemontest程序已經沒有了。
linux 守護程序 daemon
原文出處 daemon程式簡介 daemon是長時間執行的程序,通常在系統啟動後就執行,在系統關閉時才結束。一般說daemon程式在後台執行,是因為它沒有控制終端,無法和前台的使用者互動。daemon程式一般都作為服務程式使用,等待客戶端程式與它通訊。我們也把執行的daemon程式稱作守護程序。比如...
Linux 守護程序Daemon
守護程序是生存期長的一種程序。linux常用於伺服器,程式通常不執行在前台。執行於前台的程序和終端關聯,一旦終端關閉,程序也隨之退出。因為守護程序不和終端關聯,因此它的標準輸出和標準輸入也無法工作,除錯資訊應該寫入到普通檔案中,以便將來進行錯誤定位和除錯。而且守護程序通常以root許可權執行。程式示...
daemon守護程序
daemon守護程序 守護程序是乙個後台程序,不能夠控制終端,所以任何輸出,無論是向標準出錯裝置stderr還是向標準輸出裝置stdout的輸出都需做特別處理。守護程序一般在系統啟動時啟動,它的父程序是init程序。建立守護程序 1在父程序執行fork然後讓父程序退出。2在子程序中使用setsid呼...