一、什么是守護進程
Linux系統啟動時會啟動很多系統服務進程,這些系統服 務進程沒有控制終端,不能直接和用戶交互。其它進程都是在用戶登錄或運行程序時創建,在運?結束或?戶注銷時終止,但系統服務進程不受用戶登錄注銷的影響,它們?直在運行著。這種進程叫守護進程。
守護進程也被稱為精靈進程,是運行在后臺的一種特殊進程,它獨立于控制終端并且周期性地執行某種任務或等待處理某些發生的事件。
查看方式
ps axj命令:查看系統中的進程。
參數a表示不僅列當前?戶的進程,也列出所有其他用戶的進程;
參數x表示不僅列有控制終端的進程,也列出所有?控制終端的進程;
參數j表示列出與作業控制相關的信息;
二、守護進程的調用
創建守護進程最關鍵的?步是調?setsid函數創建?個新的會話,并成為會話leader。
該函數調用成功時返回新創建的Session的id(其實也就是當前進程的id),出錯返回-1。注意,調用這個函數之前,當前進程不允許是進程組的Leader,否則該函數返回-1。要保證當前進程不是進 程組的Leader也很容易,只要先fork再調?setsid就行了。fork創建的子進程和?進程在同?個進程組中,進程組的Leader必然是該組的第?個進程,所以子進程不可能是該組的第?進程,在子進程中調用setsid就不會有問題了。
成功創建并調用一個守護進程的標志是:
1、成功新建一個會話,當前進程成為該會話的leader,該會話的ID為當前進程的ID;
2、成功新建一個新的進程組,并且成為該組的組長,該進程組的組id即為當前進程的id;
3、如果當前進程有一個控制終端,那么當前進程失去這個控制終端,成為一個無控制終端的進程;所謂失去控制終端是指,原來的控制終端仍然是打開的,仍然可以讀寫,但只是?個普通的打開?件?不是控制終端了。
三、守護進程的創建
1、使用umask將文件模式創建屏蔽字設置為0;
2、調用fork(),父進程退出(exit)。 (如果該守護進程作為一條簡單的shell命令啟動的,那么父進程終止使得shell認為該命令已經執行完畢。同時保證該進程不是一個進程組的組長進程)
3、調用setsid創建一個新會話。(setsid會使1、調用進程成為新會話的首進程;2、調用進程成為一個進程組的組長進程;3、調用進程沒有控制終端)
4、將當前工作目錄更改為根目錄;
5、關閉不再需要的文件描述符;
6、忽略SIGCHLD信號;
代碼實現mydemon:
除了自己實現外,我們還可以調用系統中的demon進行設置;
進行第二次fork的原因?
要明晰第二次fork的原因,就必須明晰這兩次fork的作用。
第一次fork的作用是:1、讓shell認為這條命令已經終止,不用掛在終端輸入上;
2、為之后的setsid服務,因為調用setsid函數的進程不能是進程組組長,如果不fork出子進程,則此時的父進程是進程組組長,就無法調用setsid。(當子進程調用完setsid函數之后,子進程是會話組長也是進程組組長,并且脫離了控制終端,此時,不管控制終端如何操作,新的進程都不會收到一些信號使得進程退出。)
(2)第二次fork的作用:
雖然當前關閉了和終端的聯系,但是后期可能會誤操作打開了終端。只有確定會話首進程能打開終端設備,也就是再fork一次,再把父進程退出,再次fork的子進程作為守護進程繼續運行,保證了該精靈進程不是對話期的首進程。
第二次不是必須的,是可選的,市面上有些開源項目也是fork一次
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答
圖片精選