實現守護程序

2022-07-30 14:48:19 字數 2748 閱讀 1379

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

ps命令:linux中的ps命令是process status的縮寫。ps命令用來列出系統中當前執行的那些程序。ps命令列出的是當前那些程序的快照,就是執行ps命令的那個時刻的那些程序,如果想要動態的顯示程序資訊,就可以使用top命令。

ps [options] [--help]

例子:ps -ef顯示所有程序的完整資訊

-e:顯示所有程序

-f:顯示完整格式的程序資訊

-o:使用者自定義格式

grep命令:linux系統中grep命令是一種強大的文字搜尋工具,它能使用正規表示式搜尋文字,並把匹 配的行列印出來。grep全稱是global regular expression print,表示全域性正規表示式版本,它的使用許可權是所有使用者。

普通程序:普通程序在終端執行時,輸入命令不會有效果

在執行程式時,在末尾加上&,或者在執行是按ctrl+z都可以使程式到後台執行

(1.將程式在後台執行,2.將程式暫停)

但是如果終端關閉,所以程式都將終止

守護程序:守護程序卻能夠突破這種限制,它從被執行開始運轉,直到接收到某種訊號或者整個系統關閉時才會退出。如果想讓某個程序不因為使用者、終端或者其他的變化而受到影響,那麼就必須把這個程序變成乙個守護程序。

建立子程序,退出父程序

為了脫離控制終端需要退出父程序,之後的工作都由子程序完成。在linux中父程序先於子程序退出

會造成子程序成為孤兒程序,而每當系統發現乙個孤兒程序時,就會自動由1號程序(init)收養它,

這樣,原先的子程序就會變成init程序的子程序。

在子程序中建立新的會話

pid_t setsid(void);用於建立乙個新的會話,並擔任該會話組的組長。

改變當前目錄為根目錄

使用fork建立的子程序繼承了父程序的當前的工作目錄。由於在程序執行中,當前目錄所在的檔案系統是不能解除安裝的,這對以後的使用會造成諸多的麻煩。因此,通常的做法是讓根目錄」/」作為守護程序的當前工作目錄。這樣就可以避免上述的問題。如有特殊的需求,也可以把當前工作目錄換成其他的路徑。改變工作目錄的方法是使用chdir函式。

重設檔案許可權掩碼

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

關閉檔案描述符

用fork建立的子程序也會從父程序那裡繼承一些已經開啟了的檔案。在使用setsid呼叫之後,守護程序已經與所屬的控制終端失去了聯絡,因此從終端輸入的字元不可能達到守護程序,守護程序中用常規方法(如printf)輸出的字元也不可能在終端上顯示出來。所以,檔案描述符為0、1、2(即,標準輸入、標準輸出、標準錯誤輸出)的三個檔案已經失去了存在的價值,也應該關閉。

當你開啟乙個存在的檔案或者建立乙個新檔案,作業系統都會返回這個檔案描述符(其實就是代表這個檔案的),後續對這個檔案的操作的一些函式,都會用到這個檔案描述符作為引數;

linux中三個特殊的檔案描述符,數字分別為0,1,2

```c

#include#include#include#include#include#includeint main()

else if(pid>0)

//2. 在子程序中建立新的會話

setsid();

//3. 改變當前目錄為根目錄

chdir("/");

//4. 重設檔案許可權掩碼

umask(0);

//5. 關閉檔案描述符

close(0);

int fd0;

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

dup2(fd0,1);

dup2(fd0,2);

while(true)

return 0;

}```

執行程式後,使用命令檢視系統程序ps -eo pid,ppid,sid,tty,pgrp,comm,stat,cmd | grep -e 'bash|pid|mydaemon'

pid  ppid   sid tt        pgrp command         stat cmd

23000 1 23000 ? 23000 mydaemon ss ./mydaemon

ppid父程序id為1,說明fork子程序後,父程序退出,子程序被1號程序收養,tt=?說明已和終端脫離

linux守護程序實現

守護 daemon 程序即在後台執行的程序,網上有很多介紹守護程序的文章,這裡不再贅述,直接上 static void daemon prep int stderr log just in case.open dev null o rdwr dup 0 dup 0 static int daemon...

守護程序簡單實現

int daemon int nochdir,int noclose 引數 當 nochdir為零時,當前目錄變為根目錄,否則不變 當 noclose為零時,標準輸入 標準輸出和錯誤輸出重導向為 dev null,也就是不輸出任何信 息,否則照樣輸出。返回值 deamon 呼叫了fork 如果for...

守護程序的實現

6個步驟 步驟1 建立子程序,殺死父程序,目的是為了步驟2中呼叫setsid可以成功。步驟2 建立新會話,並自任組長。目的是脫離控制終端 會話組長呼叫 setsid 會失敗,步驟1建立的子程序必然不是會話組長,這就保證了 setsid 可以成功。步驟3 修改工作目錄為根目錄。當程序沒有結束時,工作目...