?? 13.htm
字號:
<p>記錄功能。有關文獻包含在[AT&T1990d]的log[7]中。圖13.1詳細給出了這種設施
</p>
<p>的整個結構。 </p>
<p>圖13-1 SVR4 log 設施 </p>
<p>有三個記錄進程(logger),它們是:出錯記錄進程、跟蹤記錄進程以及控制
</p>
<p>臺記錄進程。每一條記錄消息可以送給其中之一。 </p>
<p>下面介紹三種產生記錄消息的方法,三種讀記錄消息的方法。 </p>
<p>·產生記錄消息 </p>
<p>1. 在核中的例程可以調用strlog以產生記錄消息。這種方法通常由流模塊和流設
</p>
<p>備驅動程序用于出錯消息或跟蹤消息(跟蹤消息常用在新的流模塊或驅動程序的排
</p>
<p>錯中)。因為我們無意編寫核中的例程,所以不詳細說明這種消息產生方法。
</p>
<p>2. 一個用戶進程(例如一個精靈進程)可以用putmsg將消息送到/dev/log。這種
</p>
<p>消息可被送到三個記錄進程中的任一個。 </p>
<p>3. 一個用戶進程(例如一個精靈進程)可以用write將消息寫到/dev/conslog。這
</p>
<p>種消息只能送向控制臺記錄進程。 </p>
<p>·讀記錄消息 </p>
<p>4.標準的出錯記錄進程是strerr(1M)。它將記錄消息增寫到在目錄/var/adm/st
</p>
<p>ream下的一個文件中。該文件名是error.mm_dd,其中,mm是月份,dd是天數。St
</p>
<p>rerr本身是個精靈進程,通常在后臺運行,它將記錄消息增寫到該文件中。
</p>
<p>5.標準的跟蹤記錄進程是strace(1M)。它能有選擇地將一套指定的跟蹤消息寫至
</p>
<p>其標準輸出。 </p>
<p>6.標準控制臺記錄進程是syslogd,這是一個BSD導出程序,我們將在下一節對此進
</p>
<p>行敘述。此進程是個精靈進程,它讀一個配置文件,然后將記錄消息寫至一個指定
</p>
<p>的文件(控制臺是一個文件)或登錄用戶,或將該消息發送給在另一臺主機上的s
</p>
<p>yslog精靈進程。 </p>
<p>雖然上面沒有提及,但用戶也可以用自己的進程代換任何一個系統提供的標準精靈
</p>
<p>進程。我們可以提供自己的出錯記錄進程、跟蹤記錄進程或控制臺記錄進程。
</p>
<p>每則記錄消息除消息本身外,還包含有一些其它信息。例如,由log驅動程序
</p>
<p>沿逆流方向發送的消息,還包含有下列消息:哪個模塊產生此消息(如果該消息是
</p>
<p>由核中的一個流模塊產生的)、級別(level)、優先級、某些標志、以及消息產
</p>
<p>生的時間。有關細節請參閱手冊中的log(7)。如果使用prtmsg產生一則記錄消息
</p>
<p>。我們也可以設置這些字段中的幾個。如果調用write將一則消息發送至控制臺記
</p>
<p>錄進程(通過/dev/conslog),則只能發送消息字符串。 </p>
<p>圖13.1中沒有顯示的另一種可能性是:由一個SVR4精靈進程調用BSD
syslog( </p>
<p>3)函數。用這種方法可將消息發送至控制臺記錄進程,這與用putmsg向/dev/log
</p>
<p>發送消息類似。使用syslog,我們可以設置消息的優先權字段。我們將在下一節討
</p>
<p>論此函數。 </p>
<p>當產生了某種類型的記錄消息,但是相應類型的記錄進程卻不在運行時,log驅動
</p>
<p>程序丟棄該消息。 </p>
<p>不幸的是,在SVR4中,使用這種log設施帶有任怠性。一些精靈進程使用它,而大
</p>
<p>多數由系統提供的精靈進程則編寫成,直接寫向控制臺。 </p>
<p>syslog(3)函數和syslogd(1M)精靈進程的有關文檔在BSD兼容庫文檔部分[AT&T1
</p>
<p>990c],但是它們本身并不在此庫中,它們在所有用戶進程(精靈進程)都可使用
</p>
<p>的標準C庫中。 </p>
<p>13.4.2 4.3+BSD syslog 設施 </p>
<p>自4.2BSD以來,廣泛地應用了BSD syslog設備。大多數精靈進程使用這一設施
</p>
<p>。圖13.2出示了syslog設施的詳細組織結構。 </p>
<p>圖13.2 4.3+BSD syslog設施 </p>
<p>有三種方法產生記錄消息: </p>
<p>1. 核例程可以調用log函數。任何一個用戶進程通過打開和讀/dev/klog設備就可
</p>
<p>以讀取這些消息。因為我們無意編寫核中的例程,所以不再進一步說明此函數。
</p>
<p>2. 大多數用戶進程(精靈進程)調用syslog(3)函數以產生記錄消息。我們將在
</p>
<p>下面說明其調用序列。這使消息發送至UNIX域數據報套接口/dev/log。
</p>
<p>3. 在此主機上,或用TCP/IP網聯到此主機的某一其它主機上的一個用戶進程可將
</p>
<p>記錄消息發向UDP端口514。注意:syslog函數并不產生這些UDP數據報文-它們要求
</p>
<p>產生此記錄消息的進程具有顯式的網絡編程。 </p>
<p>關于UNIX域套接口以及UDP套接口的細節,請參閱stevens[1990]。 </p>
<p>通常,syslogd精靈進程讀取三種格式的記錄消息。此精靈進程在啟動時讀一個配
</p>
<p>置文件。一般,其文件名為/etc/syslog.conf,該文件決定了不同種類的消息應送
</p>
<p>向何處。例如,緊急消息可被送向系統管理員(若已登錄),并在控制臺上顯示,
</p>
<p>而警告消息則可記錄到一個文件中。 </p>
<p>該設施的界面是syslog函數。 </p>
<p>_______________________________________________________________________ </p>
<p>___ </p>
<p>#include <syslog.h> </p>
<p>void openlog(char *ident, int option, int facility); </p>
<p>void syslog(int priority, char *format, …); </p>
<p>void closelog(void); </p>
<p>_______________________________________________________________________ </p>
<p>___ </p>
<p>調用openlog是可選擇的。如果不調用openlog,則在第一次調用syslog時,自動調
</p>
<p>用openlog。調用closelog也是可選擇的-它只是關閉被用于與syslogd精靈進程通
</p>
<p>信的描述符。 </p>
<p>調用openlog使我們可以指定一個ident,以后,此ident將被加至每則記錄消息中。
</p>
<p>Ident一般是程序的名稱(例如,cron,inetd等)。圖13.3說明了4種可能的選擇
</p>
<p>項。 </p>
<p>openlog中的參數facility可以選取圖13.4中列舉的值。設置facility參數的目的
</p>
<p>是讓配置文件可以說明,來自不同設施的消息以不同的方式進行處理。如果不調用
</p>
<p>openlog,或者以facility為0來調用它,那么我們在調用syslog時,可將facilit
</p>
<p>y作為priority參數的一個部分進行說明。 </p>
<p>調用syslog產生一個記錄消息。其priority參數是facility和level的組合,它們
</p>
<p>可選取的值分別列于facility(示于圖13.4)和level(示于圖13.5)中。level值
</p>
<p>按優先級從最高到最低按序排列。 </p>
<p>format參數以及其它參數傳至vsprintf函數以便進行格式化。在format中,每個%
</p>
<p>m都被代換成對應于errno值的出錯消息字符串(strerror)。 </p>
<p>SVR4和4.3+BSD都提供logger(1)程序,以其作為向syslog設施發送出錯消息的方法
</p>
<p>。送至該程序的可選擇參數可以指定facility、level以及ident。logger的意圖是
</p>
<p>用于以非交互方式運行,又要產生記錄消息的shell過程。 </p>
<p>logger命令的格式正由POSIX.2標準化。 </p>
<p>實例 </p>
<p>在第十七章的PostScript打印機精靈進程中,包含有下面的調用序列:
</p>
<p>openlog("lprps",LOG_PID,LOG_LPR); </p>
<p>syslog(LOG_ERR,"open error for %s: %m",filename); </p>
<p>第一個調用將ident字符串設置為程序名,指定打印該進程ID,并且將系統默認的
</p>
<p>facility設定為行式打印機系統。對syslog的實際調用指定一個出錯條件和一個消
</p>
<p>息字符串。如若不調用openlog,則第二個調用的形式可能是: </p>
<p>systog(LOG_ERR|LOG_LPR,"open error for %s: %m",filename); </p>
<p>其中,我們將priority參數指定為level和facility的組合。 </p>
<p>圖13.3 openlog的選擇參數 </p>
<p>圖13.4 openlog的facility參數 </p>
<p>圖13.5 syslog中的levels(按序排列) </p>
<p>13.5 客戶-服務器模型 </p>
<p>精靈進程常常用作為服務者進程。確實,在圖13.2中,我們可以稱syslogd進程為
</p>
<p>服務員,用戶進程(客戶)用UNIX域數據報套接口向其發送消息。 </p>
<p>一般而言,服務者是一個進程,它等待客戶與其聯系,提出某種類型的服務要求。
</p>
<p>在圖13.2中,由syslogd服務者提供的服務是記錄出錯消息。 </p>
<p>在圖13.2中,在客戶和服務者之間的通信是單向的。客戶向服務者發送其服務要求
</p>
<p>,服務者則不向客戶回送任何消息。在下面有關進程通信的幾章中,有大量實例,
</p>
<p>其中有客戶和服務者之間的雙向通信。客戶向服務者發送要求,服務者則向客戶回
</p>
<p>送回答。 </p>
<p> </p>
<p>13.6 摘要 </p>
<p>在大多數Unix系統中,精靈進程是一直運行的。為了初始化我們自己的精靈進程,
</p>
<p>需要一些審慎的思索并理解在第九章中說明過的進程之間的關系。本章中,我們開
</p>
<p>發了一個可由精靈進程調用,對其自身正確地進行初始化的函數。
</p>
<p>我們也討論了精靈進程記錄出錯消息的幾種方法,精靈進程通常沒有控制終端。在
</p>
<p>SVR4下,可以使用流記錄驅動程序,在4.3+BSD之下,提供了syslog設施。因為SV
</p>
<p>R4也提供BSD syslog設施,所以在下面的章節中,當精靈進程需要記錄出錯消息時
</p>
<p>,將調用syslog函數。在第十七章中,PostScript打印機精靈進程就包含有這種情
</p>
<p>況。 </p>
<p> </p>
<p>習題: </p>
<p>13.1 從圖13.2可以看出,直接調用openlog或第一次調用syslog都可以初始化sys
</p>
<p>log,此時一定要打開用于Unix域的數據報套接口的特殊設備文件/dev/log。如果
</p>
<p>調用openlog前用戶進程(精靈進程)先調用了chroot,結果如何? </p>
<p>13.2 列出你的系統中所有的精靈進程,并說明它們的功能。 </p>
<p>13.3 編寫一段調用程序13.1中daemon_init函數的程序。調用該函數后調用getlo
</p>
<p>gin(8.14節)查看該精靈進程是否有登錄名。若程序帶有3 > /tmp/name1運行時(
</p>
<p>Bourne Shell或Kornshell),則將登錄名打印到文件描述符3,并重定向到一個臨
</p>
<p>時文件。在調用deamon_init和getlogin之間關閉描述符1、2和3,此時再運行該程
</p>
<p>序會有什么不同? </p>
<p>-</font></p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -