目錄守護程序:也稱為精靈程序,守護程序是乙個在後台執行並且不受任何終端控制的程序。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 修改工作目錄為根目錄。當程序沒有結束時,工作目...