如何實現守護程序?

2022-08-24 11:00:16 字數 2505 閱讀 9752

守護程序(daemon)是執行在後台的一種特殊程序。它獨立於控制終端並且周期性地執行某種任務或等待處理某些發生的事件。守護程序是一種很有用的程序。

1、守護程序最重要的特性是後台執行。

2、守護程序必須與其執行前的環境隔離開來。這些環境包括未關閉的檔案描述符,控制終端,會話和程序組,工作目錄以及檔案建立掩模等。這些環境通常是守護程序從執行它的父程序(特別是shell)中繼承下來的。

3、守護程序的啟動方式有其特殊之處。它可以在linux系統啟動時從啟動指令碼/etc/rc.d中啟動,可以由作業規劃程序crond啟動,還可以由使用者終端(shell)執行。

總之,除開這些特殊性以外,守護程序與普通程序基本上沒有什麼區別。因此,編寫守護程序實際上是把乙個普通程序按照上述的守護程序的特性改造成為守護程序。如果對程序有比較深入的認識就更容易理解和程式設計了。

守護程序之程式設計規則

(1)首先要做的是呼叫umask將檔案模式建立遮蔽字設定為0。

檔案許可權掩碼:是指遮蔽掉檔案許可權中的對應位。例如,有個檔案許可權掩碼是050,它就遮蔽了檔案組擁有者的可讀與可執行許可權(對應二進位制為,rwx, 101)。由於fork函式建立的子程序繼承了父程序的檔案許可權掩碼,這就給子程序使用檔案帶來了諸多的麻煩。因此,把檔案許可權掩碼設定為0(即,不遮蔽任何許可權),可以增強該守護程序的靈活性。設定檔案許可權掩碼的函式是umask。通常的使用方法為umask(0)。

(2)呼叫fork,然後使父程序退出(exit)。if(pid=fork()) exit(0);

(3)呼叫setsid以建立乙個新會話,脫離控制終端和程序組。setsid函式作用:用於建立乙個新的會話,並擔任該會話組的組長。

呼叫setsid有3個作用:(a) 讓程序擺脫原會話的控制;(b) 讓程序擺脫原程序組的控制;(c) 讓程序擺脫原控制終端的控制;setsid()

使用setsid函式的目的:由於建立守護程序的第一步呼叫了fork函式來建立子程序再將父程序退出。由於在呼叫fork函式時,子程序拷貝了父程序的會話期、程序組、控制終端等,雖然父程序退出了,但會話期、程序組、控制終端等並沒有改變,因此,這還不是真正意義上的獨立開了。使用setsid函式後,能夠使程序完全獨立出來,從而擺脫其他程序的控制。

(4)將當前工作目錄更改為根目錄。#define nofile 256 for(i=0;i(5)關閉不再需要的檔案描述符。這使守護程序不再持有從其父程序繼承來的某些檔案描述符(父程序可能是shell程序,或某個其他程序)。

(6)某些守護程序開啟/dev/null使其具有檔案描述符0、1和2,這樣,任何乙個試圖讀標準輸入、寫標準輸出和標準出錯的庫例程都不會產生任何效果。因為守護程序並不與終端裝置相關聯,所以不能在終端裝置上顯示其輸出,也無處從互動式使用者那裡接受輸入。

#include 

#include

#include

#include

#include

#include

#include

#include

void daemonize(const

char *cmd)

if ((pid = fork()) < 0)

else

if (pid != 0)

setsid(); // 建立乙個回話,會話只包含子程序,且子程序是會話首程序

/* 會話首程序的退出會出發sighup訊號

預設此訊號的操作會終止程序

*/

sa.sa_handler = sig_ign;

sigemptyset(&sa.sa_mask);

sa.sa_flags = 0;

if (sigaction(sighup, &sa, null) < 0)

/* 再次建立子程序,退出父程序,保證守護程序不是會話首程序,這樣open的時候就不會被分配終端

*/if ((pid = fork()) < 0)

else

if (pid != 0)

if (chdir("/") < 0)

if (rl.rlim_max == rlim_infinity)

for (i = 0; i < rl.rlim_max; i++)

/* 因為前面關閉了所有的檔案描述符,此時open返回的必定是最小的0,後面兩次dup返回的依次是1、2,

也就完成了對標準輸入、標準輸出、標準錯誤重定向至/dev/null的操作

*/

fd0 = open("/dev/null", o_rdwr);

fd1 = dup(0);

fd2 = dup(0);

/* * initialize the log file.

*/

openlog(cmd, log_cons, log_daemon);

if (fd0 != 0 || fd1 != 1 || fd2 != 2)

}

實現守護程序

目錄守護程序 也稱為精靈程序,守護程序是乙個在後台執行並且不受任何終端控制的程序。unix作業系統有很多典型的守護程序 其數目根據需要或20 50不等 它們在後台執行,執行不同的管理任務。使用者使守護程序獨立於所有終端是因為,在守護程序從乙個終端啟動的情況下,這同乙個終端可能被其他的使用者使用。ps...

如何除錯守護程序

如何除錯守護程序 我寫了個守護程序,可是如何用gdb 除錯呢,我試了attach pid 方法 可是他不能讓程式停住呀。如何除錯守護程序 ctrl c就停住了 如何除錯守護程序 realy?如何除錯守護程序 守護程序通常都要通過乙個daemon init 類似的函式將程序轉換為守護程序,你可以先將這...

如何除錯守護程序

b 如何除錯守護程序 b 我寫了個守護程序,可是如何用gdb 除錯呢,我試了attach pid 方法 可是他不能讓程式停住呀。如何除錯守護程序 b ctrl c就停住了 b 如何除錯守護程序 realy?如何除錯守護程序 b 守護程序通常都要通過乙個daemon init 類似的函式將程序轉換為守...