詳解Linux中的守護(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)行在后臺的一種特殊進(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也很容易,只要先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信號;
代碼實(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)程組組長,如果不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ì)收到一些信號使得進(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)程不是對話期的首進(jìn)程。
第二次不是必須的,是可選的,市面上有些開源項(xiàng)目也是fork一次
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。