Daemon 進(jìn)程生命周期長(zhǎng)且在后臺(tái)運(yùn)行。編寫(xiě)daemon進(jìn)程需要遵循哪些規(guī)則呢?
1、執(zhí)行fork()函數(shù),父進(jìn)程退出,子進(jìn)程繼續(xù)
執(zhí)行這一步,原因有兩個(gè):
父進(jìn)程可能是進(jìn)程組的組長(zhǎng),從而不能夠執(zhí)行后面要執(zhí)行的setsid函數(shù)。
子進(jìn)程繼承了父進(jìn)程的進(jìn)程組ID,一定不會(huì)是進(jìn)程組組長(zhǎng),所以子進(jìn)程一定可以執(zhí)行setsid。
如果daemon是從終端命令行啟動(dòng)的,那么父進(jìn)程退出后,shell會(huì)顯示shell提示符,讓子進(jìn)程在后臺(tái)執(zhí)行。
2、子進(jìn)程執(zhí)行下面三個(gè)步驟
修改當(dāng)前目錄為根目錄 如果當(dāng)前工作路徑上包含根文件系統(tǒng)以外的文件系統(tǒng),那么這個(gè)文件系統(tǒng)將不能被卸載。
當(dāng)然也可以改成其它合適的目錄。這里使用函數(shù)chdir("/")。
調(diào)用setsid 這是為了切斷與控制終端的所有關(guān)系,創(chuàng)建一個(gè)新的會(huì)話。
此時(shí)無(wú)論終端是否發(fā)送SIGIN、SIGQUIT或者SIGTSTP或者斷開(kāi),都與daemon進(jìn)程無(wú)關(guān)。
使用umask(0)設(shè)置文件模式創(chuàng)建掩碼為0 這一步的目的是讓daemon進(jìn)程創(chuàng)建文件的權(quán)限屬性與shell脫離關(guān)系。
因?yàn)槟J(rèn)情況下,進(jìn)程的umask來(lái)源于父進(jìn)程shell的umask。如果不執(zhí)行umask(0),那么父進(jìn)程的shell就會(huì)影響daemon,造成daemon每次執(zhí)行的umask信息不一致。
3、再次執(zhí)行fork,父進(jìn)程退出,子進(jìn)程繼續(xù)
執(zhí)行完前面兩步之后,新建了會(huì)話,進(jìn)程是會(huì)話的首進(jìn)程,也是進(jìn)程組的首進(jìn)程;進(jìn)程ID,進(jìn)程組ID,會(huì)話ID相同;進(jìn)程和終端失去聯(lián)系。
但是還差一步。daemon進(jìn)程有可能會(huì)打開(kāi)一個(gè)終端設(shè)備:
intfd=open("/dev/console",O_RDWR);這個(gè)設(shè)備是否會(huì)成為daemon進(jìn)程的控制終端,取決于兩點(diǎn):
daemon進(jìn)程是不是會(huì)話的首進(jìn)程。
系統(tǒng)實(shí)現(xiàn)。(BSD的實(shí)現(xiàn)不會(huì)成為daemon的控制終端,但POSIX由具體實(shí)現(xiàn)決定)。
為了萬(wàn)無(wú)一失,需要使用fork()確保daemon不是會(huì)話的首進(jìn)程。
4、關(guān)閉stdin,stdout,stderr
關(guān)閉之后應(yīng)該打開(kāi)/dev/null將0,1,2描述符指向它。這是為了防止后面執(zhí)行0,1,2上的I/O時(shí)出現(xiàn)錯(cuò)誤。
C庫(kù)的daemon函數(shù)和這個(gè)流程相似,但沒(méi)有第二次fork。
原文標(biāo)題:Daemon 進(jìn)程的創(chuàng)建
文章出處:【微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
責(zé)任編輯:haq
-
編程
+關(guān)注
關(guān)注
88文章
3637瀏覽量
93986 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
62974
原文標(biāo)題:Daemon 進(jìn)程的創(chuàng)建
文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論