這篇文章主要為大家展示了“Linux中如何實(shí)現(xiàn)守護(hù)進(jìn)程”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Linux中如何實(shí)現(xiàn)守護(hù)進(jìn)程”這篇文章吧。
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站制作、成都網(wǎng)站制作、閩清網(wǎng)絡(luò)推廣、成都微信小程序、閩清網(wǎng)絡(luò)營(yíng)銷、閩清企業(yè)策劃、閩清品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供閩清建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
一、什么是守護(hù)進(jìn)程
Linux系統(tǒng)啟動(dòng)時(shí)會(huì)啟動(dòng)很多系統(tǒng)服務(wù)進(jìn)程,這些系統(tǒng)服 務(wù)進(jìn)程沒(méi)有控制終端,不能直接和用戶交互。其它進(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)的信息;
二、守護(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也很容易,只要先f(wàn)ork再調(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ì)有問(wèn)題了。
成功創(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)程組,并且成為該組的組長(zhǎng),該進(jìn)程組的組id即為當(dāng)前進(jìn)程的id;
3、如果當(dāng)前進(jìn)程有一個(gè)控制終端,那么當(dāng)前進(jìn)程失去這個(gè)控制終端,成為一個(gè)無(wú)控制終端的進(jìn)程;所謂失去控制終端是指,原來(lái)的控制終端仍然是打開(kāi)的,仍然可以讀寫,但只是?個(gè)普通的打開(kāi)?件?不是控制終端了。
三、守護(hù)進(jìn)程的創(chuàng)建
1、使用umask將文件模式創(chuàng)建屏蔽字設(shè)置為0;
2、調(diào)用fork(),父進(jìn)程退出(exit)。 (如果該守護(hù)進(jìn)程作為一條簡(jiǎn)單的shell命令啟動(dòng)的,那么父進(jìn)程終止使得shell認(rèn)為該命令已經(jīng)執(zhí)行完畢。同時(shí)保證該進(jìn)程不是一個(gè)進(jìn)程組的組長(zhǎng)進(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)程組的組長(zhǎng)進(jìn)程;3、調(diào)用進(jìn)程沒(méi)有控制終端)
4、將當(dāng)前工作目錄更改為根目錄;
5、關(guān)閉不再需要的文件描述符;
6、忽略SIGCHLD信號(hào);
代碼實(shí)現(xiàn)mydemon:
除了自己實(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)程組組長(zhǎng),如果不fork出子進(jìn)程,則此時(shí)的父進(jìn)程是進(jìn)程組組長(zhǎng),就無(wú)法調(diào)用setsid。(當(dāng)子進(jìn)程調(diào)用完setsid函數(shù)之后,子進(jìn)程是會(huì)話組長(zhǎng)也是進(jìn)程組組長(zhǎng),并且脫離了控制終端,此時(shí),不管控制終端如何操作,新的進(jìn)程都不會(huì)收到一些信號(hào)使得進(jìn)程退出。)
(2)第二次fork的作用:
雖然當(dāng)前關(guān)閉了和終端的聯(lián)系,但是后期可能會(huì)誤操作打開(kāi)了終端。只有確定會(huì)話首進(jìn)程能打開(kāi)終端設(shè)備,也就是再fork一次,再把父進(jìn)程退出,再次fork的子進(jìn)程作為守護(hù)進(jìn)程繼續(xù)運(yùn)行,保證了該精靈進(jìn)程不是對(duì)話期的首進(jìn)程。
第二次不是必須的,是可選的,市面上有些開(kāi)源項(xiàng)目也是fork一次
以上是“Linux中如何實(shí)現(xiàn)守護(hù)進(jìn)程”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!