linux中的守护进程
一、守護進程
守護進程,也叫精靈進程(daemon)
?
它和普通后臺進程的區(qū)別在于以下三點
1、守護進程自成會話,而普通后臺進程則不一定
2、守護進程不受終端的控制
3、守護進程就是后臺進程,而后臺進程不同于守護進程
?
?
?
用ps axj命令查看系統(tǒng)中的進程,TPGID一欄為 -1 的進程(這些進程沒有控制終端)就是守護進程。
?
?
?
二、實現(xiàn)
創(chuàng)建守護進程的步驟如下:
1、調(diào)用umask把【文件模式創(chuàng)建屏蔽字】 設(shè)置為 0
????由于 umask 接收的參數(shù)會被取反,所以這個 0 傳進去取反以后是最大的,也就是給該程序最大的權(quán)限
2、先fork,然后讓父進程退出
????這是因為,要設(shè)置成守護進程的進程不能使原進程組中的組長進程,所以fork的目的是創(chuàng)建一個子進程,這樣,這個子進程一定不會是組長進程,然后父進程就沒什么用了。
3、調(diào)用 setid 創(chuàng)建一個新會話
????這時,這個進程會成為新會話的首進程(也是組長進程)
4、將當前工作目錄改成根目錄
5、關(guān)閉不需要的文件描述符
6、忽略SIGCHILD信號
?
?
實現(xiàn)代碼如下:
?
?
?
運行后,執(zhí)行 ps axj
找到剛剛的進程
?
同時還可以看到,它的父進程是 1 號進程,因此守護進程也是孤兒進程
?
不過這里要注意的是,實際使用的時候并不需要我們造這個輪子了 有現(xiàn)成的函數(shù)
daemon(0, 0) 就可以讓當前的進程變?yōu)楣聝哼M程
?
?
三、fork()兩次的原因
通常daemon的實現(xiàn)跟上面的實現(xiàn)方式還有一處不同:fork() 調(diào)用了兩次,讓后將第二個fork 創(chuàng)建出來的子進程作為守護進程。
?
這是因為,如果只fork一次的話那么有可能有這樣的情況:
????第一次fork之后,父進程脫離,這時候子進程成為話首進程,子進程有可能會再打開一個控制終端,一旦這種事情發(fā)生,該進程就不再是守護進程了,因為它又一次受到終端的控制了
?
?
?
因此,如果再fork一次,那么這次得到的子進程將不可能是話首進程,因此不可能再打開終端了,所以通常用這個第二次fork出的子進程作為守護進程
?
轉(zhuǎn)載于:https://blog.51cto.com/zhweizhi/1828211
總結(jié)
以上是生活随笔為你收集整理的linux中的守护进程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 60. Spring Boot写后感【从
- 下一篇: 做梦梦到黑鱼是什么征兆