呼叫fork()
,父程序退出,目的是:
在子程序中呼叫ssetsid()
,會導致如下結果:
呼叫chdir("/")
將當前工作目錄更改為根目錄,目的是防止使用者改動目錄,從而影響程序的執行
關閉相應的檔案描述符,原因是,當前程序已經脫離終端,防止產生並不需要的互動作用,還有乙個原因,用fork新建的子程序會從父程序那裡繼承一些已經開啟了的檔案。這些被開啟的檔案可能永遠不會被守護程序讀或寫,但它們一樣消耗系統資源,所以需要關閉
忽略sigchld訊號,該動作是為了,子程序退出的時候資源能夠被系統所**,防止出現殭屍程序
關於忽略sigchld訊號:父程序fork出乙個程序,然後父程序立馬退出, 在子程序的執行流中, 設定 signal(sigchld, sig_ign)。 此時原來的父程序已經不存在,而子程序脫離終端,自成會話, 相當於 子程序就變成了新會話的父程序, 又因為此時它是守護程序, **已經寫好了, 而在它的執行流中很有可能會再次 fork 產生新的子程序, 此時如果它fork出的子程序退出的話,必須要**資源,可以使用wait 或者 waitpid, 但是這樣會導致守護程序阻塞, 所以 在守護程序中捕捉sicchld訊號, 並忽略, 可以讓守護程序不阻塞,並**子程序資源。
#include
#include
#include
#include
#include
#include
#include
void create_daemon()
if(id > 0 )
// 3.呼叫setsid 建立乙個新的會話
setsid();
//4. 將當前工作目錄改為更目錄
chdir("/");
//5. 關閉不需要的檔案描述符
close(0);
close(1);
close(2);
//6. 忽略sigchld 訊號
signal(sigchld, sig_ign);
// 守護程序邏輯
while(1)
}int main()
#include
pid_t setsid(void);
成功返回新建立的會話id ,出錯返回-1
防止父程序執行很長時間,而第一次fork出的子程序成為殭屍程序(少見)。 Android守護程序 為什麼要fork()兩次
雖然,我本身很排斥這種做法,有點類似 流氓軟體 的行為,但是還是查詢了資料,大概想了乙個實現的方式,和大家一起分享。其實,這個問題可以簡單的看作 如何編寫乙個守護程序。使用c c 編寫乙個守護程序的.so程式,android端通過jni呼叫。該程序監聽當前的目標程式程序,如果目標程式被kill掉了,...
守護程序為什麼要fork兩次?
1 呼叫一次fork的作用 第一次fork的作用是讓shell認為這條命令已經終止,不用掛在終端輸入上,還有就是為了後面的setsid服務,因為呼叫setsid函式的程序不能是程序組組長,如果不fork出子程序,則此時的父程序是程序組組長,就無法呼叫setsid。當子程序呼叫完setsid函式之後,...
fork程序建立
fork建立子程序,fork函式返回兩個值,當為0時,則認為是子程序 塊執行區域,而不為0則是父程序 塊執行區域。我們需要知道的是,fork子程序可以與父程序共享部分程序上下文,而與此不同的是execl函式,一旦開始執行到execl函式時,啟動被呼叫的函式,後面的 則不再執行,而是直接執行呼叫的程式...