下面的完成了這樣乙個功能,建立乙個守護程序,每個一秒在/tmp目錄下的檔案peng.txt中記錄當前系統時間。
一、守護程序
守護程序是linux中的後台服務程序,在系統啟動時開始執行,在系統關閉時終止。linux系統中的大多數服務程序都是由守護程序實現的。
二、建立守護程序
此時,子程序變成孤兒程序,在後台執行。此時,子程序表面上脫離了終端(如bash),但是實際上卻沒有,因為其pgid和sid都是原來的沒變。
呼叫setsid()函式,這樣,子程序的gid和sid就都等於子程序pid了,它使子程序完全獨立出來,可以使用 kill –9 pid,將其殺死。
首先要知道工作目錄與當前目錄的區別,工作目錄預設是當前目錄,比如執行函式open(「1.c」,……),時,系統會自動到預設的工作目錄(即當前目錄)中讀取或者建立檔案 1.c ,但是通過呼叫函式 chdir(「/tmp」),可以將工作目錄變成/tmp,此後,如果再執行open(「1.c」,……),系統就回到/tmp目錄下面讀取或者建立檔案 1.c;
其次,為什麼有改變工作目錄?原因是,守護程序的工作目錄不可以被解除安裝!假如你把u盤掛載到了機器上,你沒改工作目錄,u盤上有乙個守護程序的程式,你執行了,那麼u盤所掛載的目錄就是該守護程序的工作目錄,假如守護程序中有寫檔案和讀檔案操作,你的u盤就沒法解除安裝了,假如你把工作目錄改成/tmp,而/tmp無法解除安裝,執行u盤上的守護程序後,再與u盤無關,此時你可以解除安裝u盤,而不會對該守護程序有什麼影響,該守護程序已經在記憶體中了。
通常將守護程序的工作目錄設定成 「/」或者「/tmp 」,可以看看/tmp 目錄的許可權是否夠用,一般是 0777。
將檔案許可權掩碼設定為umask(0),這樣可以增加守護程序的靈活性
因為建立子程序時,父程序已經開啟了若干檔案(比如stdin、stdout、stderr),而守護程序用不到這些檔案,所以應該關閉。因此,守護程序已經無法使用諸如printf 、scanf、gets等等。
源**如下:
#include #include#include
#include
#include
#include
intmain()
if (pid > 0) exit(0); //
pid>0是父程序,父程序退出
setsid();
//在子程序中建立新會話,使子程序完全獨立
chdir ("
/tmp
"); //
改變工作目錄為/tmp
umask(0); //
重設檔案許可權掩碼
for (i = 0; i < getdtablesize(); i++) //
關閉已經開啟的檔案,包括stdin、stdout和stderr,getdtablesize的返回值為固定值
close(i); //
注意getdtablesize()不是函式,而是乙個巨集定義,為常數。
if ((fp = fopen("
time.txt
", "
a")) == null) //
開啟要寫的檔案
exit(-1
);
while (1
)
return0;
}
Linux 守護程序建立
守護程序是在後台執行,不受使用者的控制 守護程序沒有任何存在的父程序。如果乙個程序想成為守護程序,有fork 建立 然後終止父程序,脫離資源。例子 void init daemon int pid,i pid fork if pid exit 0 結束父程序 else exit 1 失敗退出 是子程...
linux 守護程序詳解及建立守護程序
linux 守護程序詳解及建立守護程序 守護程序是一種後台執行並且獨立於所有終端控制之外的程序。守護程序的啟動 要啟動乙個守護程序,可以採取一下幾種方式 守護程序的建立 先來看乙個守護程序建立的例子 include include include include define maxfd 64 vo...
Linux 建立守護程序(daemon)
要變成daemon,乙個程式需要完成下面的步驟 執行乙個fork 之後父程序退出,子程序繼續執行。結果就是daemon成為了init程序的子程序。之所以要做這一步是因為下面兩個原因 子程序呼叫setsid 開啟乙個新回話並釋放它與控制終端之間的所有關聯關係。如果daemon從來沒有開啟過終端裝置,那...