溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux中如何實(shí)現(xiàn)守護(hù)進(jìn)程

發(fā)布時(shí)間:2021-07-16 11:37:58 來源:億速云 閱讀:196 作者:小新 欄目:服務(wù)器

這篇文章主要為大家展示了“Linux中如何實(shí)現(xiàn)守護(hù)進(jìn)程”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Linux中如何實(shí)現(xiàn)守護(hù)進(jìn)程”這篇文章吧。

一、什么是守護(hù)進(jìn)程

Linux系統(tǒng)啟動(dòng)時(shí)會(huì)啟動(dòng)很多系統(tǒng)服務(wù)進(jìn)程,這些系統(tǒng)服 務(wù)進(jìn)程沒有控制終端,不能直接和用戶交互。其它進(jìn)程都是在用戶登錄或運(yùn)行程序時(shí)創(chuàng)建,在運(yùn)?結(jié)束或?戶注銷時(shí)終止,但系統(tǒng)服務(wù)進(jìn)程不受用戶登錄注銷的影響,它們?直在運(yùn)行著。這種進(jìn)程叫守護(hù)進(jìn)程。

守護(hù)進(jìn)程也被稱為精靈進(jìn)程,是運(yùn)行在后臺(tái)的一種特殊進(jìn)程,它獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。
查看方式

ps axj命令:查看系統(tǒng)中的進(jìn)程。

參數(shù)a表示不僅列當(dāng)前?戶的進(jìn)程,也列出所有其他用戶的進(jìn)程;

參數(shù)x表示不僅列有控制終端的進(jìn)程,也列出所有?控制終端的進(jìn)程;

參數(shù)j表示列出與作業(yè)控制相關(guān)的信息;

Linux中如何實(shí)現(xiàn)守護(hù)進(jìn)程

 二、守護(hù)進(jìn)程的調(diào)用

創(chuàng)建守護(hù)進(jìn)程最關(guān)鍵的?步是調(diào)?setsid函數(shù)創(chuàng)建?個(gè)新的會(huì)話,并成為會(huì)話leader。

該函數(shù)調(diào)用成功時(shí)返回新創(chuàng)建的Session的id(其實(shí)也就是當(dāng)前進(jìn)程的id),出錯(cuò)返回-1。注意,調(diào)用這個(gè)函數(shù)之前,當(dāng)前進(jìn)程不允許是進(jìn)程組的Leader,否則該函數(shù)返回-1。要保證當(dāng)前進(jìn)程不是進(jìn) 程組的Leader也很容易,只要先fork再調(diào)?setsid就行了。fork創(chuàng)建的子進(jìn)程和?進(jìn)程在同?個(gè)進(jìn)程組中,進(jìn)程組的Leader必然是該組的第?個(gè)進(jìn)程,所以子進(jìn)程不可能是該組的第?進(jìn)程,在子進(jìn)程中調(diào)用setsid就不會(huì)有問題了。

成功創(chuàng)建并調(diào)用一個(gè)守護(hù)進(jìn)程的標(biāo)志是:

1、成功新建一個(gè)會(huì)話,當(dāng)前進(jìn)程成為該會(huì)話的leader,該會(huì)話的ID為當(dāng)前進(jìn)程的ID;

2、成功新建一個(gè)新的進(jìn)程組,并且成為該組的組長,該進(jìn)程組的組id即為當(dāng)前進(jìn)程的id;

3、如果當(dāng)前進(jìn)程有一個(gè)控制終端,那么當(dāng)前進(jìn)程失去這個(gè)控制終端,成為一個(gè)無控制終端的進(jìn)程;所謂失去控制終端是指,原來的控制終端仍然是打開的,仍然可以讀寫,但只是?個(gè)普通的打開?件?不是控制終端了。

三、守護(hù)進(jìn)程的創(chuàng)建

1、使用umask將文件模式創(chuàng)建屏蔽字設(shè)置為0;

2、調(diào)用fork(),父進(jìn)程退出(exit)。 (如果該守護(hù)進(jìn)程作為一條簡單的shell命令啟動(dòng)的,那么父進(jìn)程終止使得shell認(rèn)為該命令已經(jīng)執(zhí)行完畢。同時(shí)保證該進(jìn)程不是一個(gè)進(jìn)程組的組長進(jìn)程)

3、調(diào)用setsid創(chuàng)建一個(gè)新會(huì)話。(setsid會(huì)使1、調(diào)用進(jìn)程成為新會(huì)話的首進(jìn)程;2、調(diào)用進(jìn)程成為一個(gè)進(jìn)程組的組長進(jìn)程;3、調(diào)用進(jìn)程沒有控制終端)

4、將當(dāng)前工作目錄更改為根目錄;

5、關(guān)閉不再需要的文件描述符;

6、忽略SIGCHLD信號(hào);

代碼實(shí)現(xiàn)mydemon:

Linux中如何實(shí)現(xiàn)守護(hù)進(jìn)程

Linux中如何實(shí)現(xiàn)守護(hù)進(jìn)程

Linux中如何實(shí)現(xiàn)守護(hù)進(jìn)程

除了自己實(shí)現(xiàn)外,我們還可以調(diào)用系統(tǒng)中的demon進(jìn)行設(shè)置;

進(jìn)行第二次fork的原因?

要明晰第二次fork的原因,就必須明晰這兩次fork的作用。

第一次fork的作用是:1、讓shell認(rèn)為這條命令已經(jīng)終止,不用掛在終端輸入上;

2、為之后的setsid服務(wù),因?yàn)檎{(diào)用setsid函數(shù)的進(jìn)程不能是進(jìn)程組組長,如果不fork出子進(jìn)程,則此時(shí)的父進(jìn)程是進(jìn)程組組長,就無法調(diào)用setsid。(當(dāng)子進(jìn)程調(diào)用完setsid函數(shù)之后,子進(jìn)程是會(huì)話組長也是進(jìn)程組組長,并且脫離了控制終端,此時(shí),不管控制終端如何操作,新的進(jìn)程都不會(huì)收到一些信號(hào)使得進(jìn)程退出。)

(2)第二次fork的作用:

雖然當(dāng)前關(guān)閉了和終端的聯(lián)系,但是后期可能會(huì)誤操作打開了終端。只有確定會(huì)話首進(jìn)程能打開終端設(shè)備,也就是再fork一次,再把父進(jìn)程退出,再次fork的子進(jìn)程作為守護(hù)進(jìn)程繼續(xù)運(yùn)行,保證了該精靈進(jìn)程不是對(duì)話期的首進(jìn)程。

第二次不是必須的,是可選的,市面上有些開源項(xiàng)目也是fork一次

以上是“Linux中如何實(shí)現(xiàn)守護(hù)進(jìn)程”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI