2021-05-12 14:32:11
Linux Daemon進程
2020-06-16 17:29:45
模型
- 建立孤兒進程 fork()
- 建立新的對談 setid()
- 改變當前目錄為根目錄chdir()
- 重設檔案許可權掩碼umask()
- 關閉檔案描述符close()
建立孤兒進程
建立孤兒進程只需要將父進程關閉保留子進程
pid_t pid_child=fork();
if(0<pid_child){
exit(0);
}
建立新的對談
對談組是一個或多個行程群組的集合,一個shell就是一個對談,可以分為前台行程群組和後台行程群組,每個行程群組都有一個組長,組長進程的pid就是行程群組的id,當一個對談結束的時候,依附於它的進程都會關閉setsid()
函數用於建立一個新的對談,並使得當前進程成為新對談組組長,也就是說使進程完全獨立出來,從而脫離所有其他進程的控制,但是setsid()不能在一個對談組長進程中被呼叫,所以我們先建立子進程,並使其成為孤兒進程,這樣它就脫離了原來的對談,此時呼叫setsid可以使其成為一個新的對談的組長進程。當然,作為組長進程,雖然它脫離了原來的對談,失去了終端,滿足了守護行程的需求,但是它完全可以自己再開啟一個終端,所以我們有時會在準備好守護行程條件之後再fork
一次建立孫進程,然後讓子進程自殺,在孫進程中執行守護行程的程式碼,這樣新的守護行程就不會開啟自己的終端。
pid_t pid;
pid=setsid();
改變當前目錄為根目錄
守護行程的工作目錄是不能被解除安裝的,選擇根目錄是個很好的方式,切換進程的工作目錄可以使用chdir()
chdir("");
重設檔案許可權掩碼
檔案許可權掩碼是指問家許可權中被遮蔽掉的對應位,把檔案許可權掩碼設定為0,可以增加該守護行程的靈活性,和$umask
類似,設定進程的檔案許可權掩碼的函數是umask()
umask(0); //將檔案許可權掩碼設為0
關閉檔案描述符
如果父進程中開啟的檔案時候沒有指定"close-on-exec"選項,那麼子進程會繼承父進程的檔案描述符,這些檔案描述符在製作守護行程的時候需要將其關閉。一個進程開啟的所有檔案描述符都在該進程的檔案描述符表中,這個表的大小可以使用函數gettablesize()
來獲得
fdtablesize=gettablesize();
for(fd=0;fd<fdtablesize;fd++){
close(fd);
}
再次建立孤兒進程
pid_t pid_gchild=fork();
if(0<pid_gchild){
exit(0);
}
//孫進程執行的程式碼
本文永久更新連結地址:http://www.linuxidc.com/Linux/2016-11/136702.htm
相關文章