linux守護程序的建立

2022-05-02 13:18:10 字數 1668 閱讀 3552

下面的完成了這樣乙個功能,建立乙個守護程序,每個一秒在/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從來沒有開啟過終端裝置,那...