6.xinetd 的工作原理
通過(guò)配置xinetd,然后查看相應(yīng)的套接字和進(jìn)程,可以看出,xinetd是這樣工作的(針對(duì)tcp服務(wù))
A.啟動(dòng)時(shí)讀取/etc/xinetd.conf文件并為文件中指定的所有服務(wù)創(chuàng)建相應(yīng)的套接字(流或數(shù)據(jù)報(bào)),xinetd能處理的服務(wù)的數(shù)目依賴(lài)于所創(chuàng)建的套接字?jǐn)?shù)目。每個(gè)新創(chuàng)建的套接字都被加入到select調(diào)用所用到的描述符集中。
B.對(duì)每一個(gè)套接字調(diào)用bind,綁定服務(wù)端口(/etc/services中定義),端口號(hào)通過(guò)調(diào)用getservbyname獲得。
C.所有套接字建立后,調(diào)用select等待它們變?yōu)榭勺x,當(dāng)tcp套接字上有數(shù)據(jù)報(bào)到來(lái)時(shí)變?yōu)榭勺x。xinetd在大部分時(shí)間阻塞在select的調(diào)用處;
D.xinetd守護(hù)進(jìn)程fork,由子進(jìn)程處理服務(wù)請(qǐng)求;子進(jìn)程關(guān)閉除了要處理的套接字之外的所有描述字,子進(jìn)程三次調(diào)用dup2,把套接字描述字復(fù)制到0、1、2,然后關(guān)閉原套接字;以后程序?qū)μ捉幼植僮骶褪菍?duì)0、1、2進(jìn)行操作;子進(jìn)程exec執(zhí)行相應(yīng)的服務(wù)器程序,并將配置文件中的參數(shù)傳遞。
E. 因?yàn)閠cp服務(wù)器通常設(shè)置nowait標(biāo)記,表示xinetd在該套接字上再次選擇之前,必須等待在該套接字上服務(wù)的子進(jìn)程終止。所以,父進(jìn)程中的fork返回時(shí),把子進(jìn)程的進(jìn)程號(hào)記錄下來(lái),這樣,在子進(jìn)程終止時(shí),父進(jìn)程可以用waitpid的返回值查知是那一個(gè)子進(jìn)程;父進(jìn)程用FD_CLR宏關(guān)閉select使用的描述字集中與這個(gè)套接字對(duì)應(yīng)的位,以便不對(duì)該套接字select;當(dāng)子進(jìn)程終止時(shí),父進(jìn)程收到一個(gè)SIGCHLD信號(hào),父進(jìn)程的信號(hào)處理程序得到終止子進(jìn)程的進(jìn)程號(hào),父進(jìn)程通過(guò)打開(kāi)描述字集中對(duì)應(yīng)的位恢復(fù)對(duì)該套接字的select。
7.重新實(shí)現(xiàn)的XINETD超級(jí)守護(hù)程序
A.程序利用上面的原理在思路上重新實(shí)現(xiàn)了超級(jí)守護(hù)進(jìn)程。
B.程序在一些地方只是概念性的代碼,完全實(shí)現(xiàn)還有待補(bǔ)充。
C.程序能演示XINETD 的功能,但是在注釋有BUG 和NOTE 的地方還需改進(jìn)
D.這是一個(gè)總結(jié)性的資料,參考了“利用INETD實(shí)現(xiàn)UDP守護(hù)進(jìn)程“和“www.douzhe.com“上的文章。
|