Linux学习之系统编程篇:守护进程(精灵进程、后台进程)
一、背景
一般情況下,啟動終端(shell),系統會創建一個會話(shell 進程是會長),經過后續各種操作,該會話中會存在多個進程組,每個進程組中也會有多個進程(父進程是組長),若此時關閉 shell,內核會給 shell 發送 SIGHUP(1 號)信號,shell 又會給所有進程發送 SIGHUP,這樣會使該會話中所有進程結束,但有時候有需求:關閉終端,也不結束某個進程,因此出現守護進程的概念。
二、鋪墊知識
(1)進程組:多個進程組成一個進程組
(2)誰是進程組的組長?
組里的第一個進程(如果該進程組是有父進程 fork 而來,父進程默認是組長進程)
進程組 ID == 進程組長的 ID
三、會話
會話:多個進程組組成一個會話(shell 默認是會長進程),此處要會創建會話成為會長。
1、創建一個會話的注意事項
(1)組長不能是會長 ,若組長創建會話,會報錯。fork 后,父進程是組長,意味著父進程不能是會長,會長只能由子進程擔當。
(2)成為新會話的會長會丟棄原有的控制終端,(此時子進程自成一體,不屬于 shell 會話中)。
2、 一般步驟
一般步驟:先 fork,父親死,兒子創建會話(setsid)。
創建一個會話 :
四、 守護進程的特點
(1) 后臺服務進程
(2) 不受終端控制
(3) 周期性的執行某項任務
(4) 不受用戶登錄注銷影響
(5) 一般采用以 d 結尾的名字(也稱為服務)
五、創建守護進程模型
創建守護進程模型:前 2 步是必須的,后 4 步非必須。
(1)創建子進程,父進程退出。
(2)子進程創建新會話(該子進程既是會長也是組長:一個進程構成一個進程組,構成一個會話)。
(3)改變當前工作目錄 int chdir(const char *path) ,避免因為原工作目錄由于某種原因失效,影響進程。
(4)重設文件掩碼 umask。
(5)關閉文件描述符:因為已經脫離終端,所以標準輸入、輸出、錯誤沒有用了。
(6)執行核心工作。
六、創建守護進程的命令(野套路)
nohup 命令:可以讓他之后的進程不受到 SIGHUP 信號(需要和&配合使用)
運行時候: nohup ./a.out &
七、創建新會話的原因
(1)守護進程的意義是關閉終端,守護進程仍然執行
(2)對于普通進程,關閉終端,終端 shell(會長)會給所有成員發一個 SIGHUP 信號,終止會話中的所有進程。
(3) setsid,使原會話中的一個進程變為其他會話的會長,即脫離終端會話,這樣終端關閉后,守護進程就不會因為 SIGHUP 而被終止。
總結
以上是生活随笔為你收集整理的Linux学习之系统编程篇:守护进程(精灵进程、后台进程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux学习之系统编程篇:利用 SIG
- 下一篇: Linux学习之系统编程篇:编写一个守护