UNIX网络编程---守护进程和inetd超级服务器(十三)
UNIX網絡編程---守護進程和inetd超級服務器
一、概述
???????? 守護進程是在后臺運行且不于任何控制終端掛鏈的進程。UNIX系統有很多守護進程在后臺工作(有20到50的數量級),執行不同的任務。守護進程沒有控制終端通常源于它們由系統初始化腳本啟動。然而守護進程也可能從某個終端由用戶在shell提示符下鍵入命令行啟動,這樣的守護進程必須親自脫離于控制終端的關聯,從而避免與作業的控制、終端會話管理、終端產生信號等發生任何不期望的交互,也可以避免在后臺運行的守護進程非預期低輸出到終端。
守護進程有多重啟動方法:
1)? 在系統啟動階段,由系統初始化腳本啟動
2)? 有inetd超級服務器啟動,inetd自身由上一條中的某個腳本啟動。inetd監聽網絡請求,每當有一個請求到達時,啟動相應的實際服務器。
3)? Cron守護進程按照規則定期執行一些程序,而由它啟動執行的程序同樣作為守護進程運行。其自身由某個腳本啟動。
4)? at命令用于指定將來某個時刻的程序執行。這些程序的執行時刻到來時,通常有cron守護進程啟動執行他們,因此這些程序同樣作為守護進程運行。
5)? 守護進程還可以行用戶終端或在前臺或在后臺啟動。這么做往往是為了測試守護程序或重啟因某種原因而終止了的某個守護進程。
二、Syslogd守護進程
此守護進程通常由某個系統初始化腳本啟動
1)? 讀取配置文件。通常為/etc/syslog.conf的配置文件指定本守護進程可能收取的各種日志消息應該如何處理。這些消息坑內被添加到一個文件/dev/console文件時一個特例,它把消息寫到控制臺上),或被寫到指定用戶的登錄窗口,或被轉發給另一個主機上的syslogd進程。
2)? 創建一個UNIX域數據報套接字,給它捆綁路徑名/var/run/log(有的是/dev/log)
3)? 創建一個udp套接字,給他捆綁端口514(syslog服務使用的端口號)。
4)? 打開路徑名/dev/klog、來自內核中的任何出錯消息看著像是這個設備的輸入
此后syslogd守護進程在一個無限循環中進行,調用select以等到它的三個描述符(來自上述第2、3、4步)之一變為可讀,讀取日志消息,并按照配置文件進行處理。如果守護進程收到SIGHUP信號,那就是重新讀取配置文件。
通過創建一個UNIX域數據報套接字,我們就可以從自己的守護進程中通過syslogd綁定的路徑名發送我們的消息達到發送日志消息的目的。
三、Syslog函數
從守護進程中等級消息的常用技巧就是調用syslog函數
#include<syslog.h>
Void syslog(intpriority,const char *message,…..);
函數中的priority參數是級別和設施兩者的組合,message參數類似printf的格式串,日志信息的level從0到7,按照東高到低的順序排列的,默認情況為LOG_NOTICE
????????
舉例來說,當rename函數調用意外失敗時,守護進程可以執行以下調用
Syslog(LOG_INFO|LOG_LOCAL2,”RENAME(%S,%S):%m”,file1,file2);
當syslog被應用進程首次調用時,它闖將一個UNIX域數據報套接字,然后調用connect連接到有syslogd守護進程創建的UNIX域數據報套接字的周所周知的路徑名(譬如/var/run/log)
這個套接字一直保持打開,直到進程終止為止。進程也可以使用openlog和closelog
#include <syslog.h>
Void openlog(const char *ident,intoptions,int facility);
Void closelog(void);
Openlog可以在首次調用syslog前調用,closelog可以在應用進程不再需要發送日志消息時調用
Ident參數是一個有syslog冠于每個日志消息之前的字符串。它的值通常是程序名
Openlog被調用時,通常并不立即創建UNIX域套接字。該套接字直到首次調用syslog時才打開。LOG_NDELAD選項破事該套接字在openlog被調用時就創建。
四、Daemon_init函數
調用這個函數可以把普通進程轉換為守護進程。但是在有的UNIX變體中已經更改了使用方法
五、Inetd守護進程
在TFTP、telnet/tftp這些服務來說,都會有一個進程與之關聯。每個進程執行幾乎相同的任務:創建一個套接字,把本地服務器的周所周知端口捆綁到該套接字,等待一個連接或一個數據報,然后派生子進程。子進程為客戶提供服務,父進程則繼續等到下一個客戶請求
1)? 所有這些守護進程含有幾乎相同的啟動代碼,既表現在創建套接字上,也表現在演變成守護進程上。
2)? 每個守護進程在進程表中占據一個表項,然而它們大部分時間處于睡眠狀態,因特網超級服務器(既inetd守護進程)使上述問題得到簡化?;赥CP或UDP的服務器都可以使用這個守護進程
六、Daemon_inetd函數
??????? 這個函數是自己編寫的函數,代碼很簡單,在實際過程中基本不用
PS:
??????? 守護進程是在后臺運行并獨立于所有終端控制的進程。許多網絡服務器作為守護進程運行。守護進程產生的所有輸出通常通過調用syslog函數發生給syslogd守護進程。系統管理員可根據發送消息的守護進程以及消息的嚴重級別,完全控制這些消息的處理方式。
??????? 啟動任意一個程序并讓它作為守護進程運行需要以下步驟:調用fork以轉到后臺運行,調用setsid建立一個新的POSIX會話并成為會話頭進程,再次fork以避免無意中獲得新的控制終端,改變工作目錄和文件創建模式掩碼,最后關閉所有非必要的描述符,daemon_init函數處理所有這些細節‘
??????? 許多UNIX服務器有inetd守護進程啟動,它處理全部守護進程化所需的步驟,當啟動真正的服務器時,套接字已在標準輸入、標準輸出和標準錯誤輸出上打開。這樣我們無需調用socket、bind、listen和accept,因為這些步驟已有inetd處理。
總結
以上是生活随笔為你收集整理的UNIX网络编程---守护进程和inetd超级服务器(十三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机收藏夹中桌面不显示不出来,收藏夹里
- 下一篇: Python设计模式之享元模式(8)