linux 守護程序 daemon

2021-06-08 00:48:24 字數 2201 閱讀 8196

原文出處:

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) 

[c-sharp]view plain

copy

#include 

#include 

#include 

#include 

#include 

#include 

#include 

intdaemon_init(

void

)   

void

sig_term(

intsigno)   

}  intmain(

void

)   

openlog("daemontest"

, log_pid, log_user);   

syslog(log_info, "program started."

);   

signal(sigterm, sig_term); /* arrange 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

守護程序是生存期長的一種程序。linux常用於伺服器,程式通常不執行在前台。執行於前台的程序和終端關聯,一旦終端關閉,程序也隨之退出。因為守護程序不和終端關聯,因此它的標準輸出和標準輸入也無法工作,除錯資訊應該寫入到普通檔案中,以便將來進行錯誤定位和除錯。而且守護程序通常以root許可權執行。程式示...

daemon守護程序

daemon守護程序 守護程序是乙個後台程序,不能夠控制終端,所以任何輸出,無論是向標準出錯裝置stderr還是向標準輸出裝置stdout的輸出都需做特別處理。守護程序一般在系統啟動時啟動,它的父程序是init程序。建立守護程序 1在父程序執行fork然後讓父程序退出。2在子程序中使用setsid呼...

守護程序 daemon

守護程序常常在系統引導裝入時啟動,在系統關閉時終止。一般說daemon程式在後台執行,是因為它沒有控制終端,無法和前台的使用者互動。daemon程式一般都作為服務程式使用,等待客戶端程式與它通訊。我們也把執行的daemon程式稱作守護程序。乙個守護程序的父程序是init程序,因為它真正的父程序在fo...