與守護進程有關的一個問題是如何處理出錯訊息。因為它沒有控制終端,所以不能只是簡單地寫到標準出錯上。在很多工作站上,控制台裝置運行一個視窗系統,所以我們不希望所有守護進程都寫到控制台裝置上。我們也不希望每個守護進程將它自己的出錯訊息寫到一個單獨的檔案中。對系統管理人員而言,如果要關心哪一個守護進程寫到哪一個記錄檔案中,並定期地檢查這些檔案,那麼一定會使他感到頭痛。所以,需要有一個集中的守護進程出錯記錄設施。
自4.2BSD以來,BSD syslog設施得到了廣泛的應用。大多數守護進程使用這一設施。圖13-1顯示了syslog設施的詳細組織圖。
openlog( *ident, option, syslog( priority, * closelog( setlogmask(
調用openlog是可選擇的。如果不調用openlog,則在第一次調用syslog時,自動調用openlog。調用closelog也是也選擇的——它只是關閉曾被用於與syslog守護進程通訊的描述符。
調用openlog使我們可以指定一個ident,將它加至每則日誌訊息中。ident一般是程式的名稱(例如,cron、inetd等)。option參數是指定許多選項的位屏蔽。表13-1說明了可用的option(選項)。若某選項在Single UNIX Specification的openlog定義中已包括,則其XSI列用一個墨點表示。
表13-1 openlog的option參數
, filename
第一個調用將ident字串設定為程式名,指定列印該進程ID,並且將系統預設的facility設定為行式印表機系統。對syslog的調用指定一個出錯狀態和一個訊息字串。如若不調用openlog,則第二個調用的形式可能是:
syslog(LOG_ERR | LOG_LPR, , filename);
其中,將priority參數指定為level和facility的組合。
除了syslog,很多平台還提供它的一種變體處理可變參數列表。
#include <syslog.h><stdarg.h> vsyslog( priority, *format, va_list arg);
大多數syslog實現將使訊息短時間處於隊列中。如果在此段時間中到達了重複訊息,那麼syslog守護進程將不把它寫到日記記錄中,而是列印輸出一條訊息,類似於“上一條訊息重複了N次”。
本篇博文內容摘自《UNIX環境進階編程》(第二版),僅作個人學習記錄所用。關於本書可參考:http://www.apuebook.com/。