守护进程和inetd(转)
定義: 守護進程 daemon 是在后臺運行不受終端控制的進程。
啟動方法:
1.??????? 很多守護進程是系統初始化腳本啟動的,一般在/etc目錄或者/etc/rc開頭的目錄
2.??????? 很多網絡服務器是由inetd超級服務器啟動的
3.??????? cron守護進程按規定的時間啟動某個程序,可以把你的程序定個時間由他啟動
4.??????? at命令制定某一時刻啟動某個進程
5.??????? 也可以在用戶終端啟動,一般在測試守護進程或者守護進程需要重啟時使用
?
由于守護進程沒有控制終端,所以他不能打印到終端上,當出現錯誤時,需要記錄下來,就用到了下面這個函數;
<syslog.h>
| void syslog(int priority, const char *message, …..) |
priority是級別(level)和設施(facility)的組合,可以查看相關文檔查找level , facility
(見《unix 網絡編程 第一卷》)
| void openlog(const char *ient, int options, int facility) |
| void closelog(void) |
用于開啟和關閉log的發送
發送消息的位置為:/var/run/log (/dev/log)
路徑名/dev/klog 內核中的所有出錯信息作為這個設備的輸入實現
?
怎樣才能產生一個守護進程呢?
1.?????? 首先調用fork,然后父進程終止,子進程繼續運行。子進程繼承了父進程的進程組號,但擁有自己的進程號,保證其不是一個進程組頭
2.?????? setsid 函數,創建一個session,(具體參見《unix環境高級編程》第九章),此時這個進程變成了新會話頭,和新進程組的組長,不在控制終端
3.?????? 忽略SIGHUP信號再次fork, 這次函數返回的是第二次生成子進程,第一次的子進程是他的父進程,并且也終止了
第三步為了保證進程不再擁有終端
?
?
inetd 守護進程
?????? 我們在網絡編程時會發現,開始的幾步都是基本一樣的,對于服務器這一端,我們會使用socket, bind, listen ,accept 基本步驟相同,能不能把這幾步形成一個總的,當有申請鏈接來時都調用一個進程鏈接,然后根據不同的申請fork子進程執行相應的程序呢?答案就是只用inetd守護進程。
?????? inetd守護進程是Linux自己的,他作為一個守護進程,處理請求,我們要做的是給他提供當對于某種鏈接,某個接口的請求時所要啟動的程序就可以了。
?????? 一般在/etc/inetd.conf中配置。
例如:
ftp?? stream???? tcp?? nowait???? root??????? /usr/bin/ftpd??? ftpd –l
下面是針對上面的參數進行解釋,一一對應。
service-name??? 必須是在/etc/services文件中已定義的服務名
socket-tye??? stream(TCP)或dgram(UDP)
protocol????? 不許再/etc/protocols文件中已定義:tcp或者UDP
wait-flag????? 一般TCP是nowait,UDP是wait
login-name???? /etc/passwd 中的用戶名,一般為root
server-program exec使用的全路徑名
server-program-arguments exec使用的參數
?
不過應當注意的是最近版本好像不使用這個方法了,而是使用xinetd.*的方式,也有一定的格式,
轉載于:https://www.cnblogs.com/demonspider/archive/2012/11/25/2787176.html
總結
以上是生活随笔為你收集整理的守护进程和inetd(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web.py Cookbook 简体中文
- 下一篇: APL开发日志--2012-11-26