📄 00000013.htm
字号:
13.4.1 SVR4流log驱动程序 <BR>SVR4提供了一种流设备驱动程序,其界面具有流出错记录,流事件跟踪以及控制台 <BR>记录功能。有关文献包含在[AT&T1990d]的log[7]中。图13.1详细给出了这种设施 <BR>的整个结构。 <BR> 图13-1 SVR4 log 设施 <BR> 有三个记录进程(logger),它们是:出错记录进程、跟踪记录进程以及控制 <BR>台记录进程。每一条记录消息可以送给其中之一。 <BR>下面介绍三种产生记录消息的方法,三种读记录消息的方法。 <BR>·产生记录消息 <BR>1. 在核中的例程可以调用strlog以产生记录消息。这种方法通常由流模块和流设 <BR>备驱动程序用于出错消息或跟踪消息(跟踪消息常用在新的流模块或驱动程序的排 <BR>错中)。因为我们无意编写核中的例程,所以不详细说明这种消息产生方法。 <BR>2. 一个用户进程(例如一个精灵进程)可以用putmsg将消息送到/dev/log。这种 <BR>消息可被送到三个记录进程中的任一个。 <BR>3. 一个用户进程(例如一个精灵进程)可以用write将消息写到/dev/conslog。这 <BR>种消息只能送向控制台记录进程。 <BR>·读记录消息 <BR>4.标准的出错记录进程是strerr(1M)。它将记录消息增写到在目录/var/adm/st <BR>ream下的一个文件中。该文件名是error.mm_dd,其中,mm是月份,dd是天数。St <BR>rerr本身是个精灵进程,通常在后台运行,它将记录消息增写到该文件中。 <BR>5.标准的跟踪记录进程是strace(1M)。它能有选择地将一套指定的跟踪消息写至 <BR> 其标准输出。 <BR>6.标准控制台记录进程是syslogd,这是一个BSD导出程序,我们将在下一节对此进 <BR>行叙述。此进程是个精灵进程,它读一个配置文件,然后将记录消息写至一个指定 <BR>的文件(控制台是一个文件)或登录用户,或将该消息发送给在另一台主机上的s <BR>yslog精灵进程。 <BR>虽然上面没有提及,但用户也可以用自己的进程代换任何一个系统提供的标准精灵 <BR>进程。我们可以提供自己的出错记录进程、跟踪记录进程或控制台记录进程。 <BR> 每则记录消息除消息本身外,还包含有一些其它信息。例如,由log驱动程序 <BR>沿逆流方向发送的消息,还包含有下列消息:哪个模块产生此消息(如果该消息是 <BR>由核中的一个流模块产生的)、级别(level)、优先级、某些标志、以及消息产 <BR>生的时间。有关细节请参阅手册中的log(7)。如果使用prtmsg产生一则记录消息 <BR>。我们也可以设置这些字段中的几个。如果调用write将一则消息发送至控制台记 <BR>录进程(通过/dev/conslog),则只能发送消息字符串。 <BR> 图13.1中没有显示的另一种可能性是:由一个SVR4精灵进程调用BSD syslog( <BR>3)函数。用这种方法可将消息发送至控制台记录进程,这与用putmsg向/dev/log <BR>发送消息类似。使用syslog,我们可以设置消息的优先权字段。我们将在下一节讨 <BR>论此函数。 <BR>当产生了某种类型的记录消息,但是相应类型的记录进程却不在运行时,log驱动 <BR>程序丢弃该消息。 <BR>不幸的是,在SVR4中,使用这种log设施带有任怠性。一些精灵进程使用它,而大 <BR>多数由系统提供的精灵进程则编写成,直接写向控制台。 <BR>syslog(3)函数和syslogd(1M)精灵进程的有关文档在BSD兼容库文档部分[AT&T1 <BR>990c],但是它们本身并不在此库中,它们在所有用户进程(精灵进程)都可使用 <BR>的标准C库中。 <BR>13.4.2 4.3+BSD syslog 设施 <BR> 自4.2BSD以来,广泛地应用了BSD syslog设备。大多数精灵进程使用这一设施 <BR>。图13.2出示了syslog设施的详细组织结构。 <BR>图13.2 4.3+BSD syslog设施 <BR>有三种方法产生记录消息: <BR>1. 核例程可以调用log函数。任何一个用户进程通过打开和读/dev/klog设备就可 <BR>以读取这些消息。因为我们无意编写核中的例程,所以不再进一步说明此函数。 <BR>2. 大多数用户进程(精灵进程)调用syslog(3)函数以产生记录消息。我们将在 <BR>下面说明其调用序列。这使消息发送至UNIX域数据报套接口/dev/log。 <BR>3. 在此主机上,或用TCP/IP网联到此主机的某一其它主机上的一个用户进程可将 <BR>记录消息发向UDP端口514。注意:syslog函数并不产生这些UDP数据报文-它们要求 <BR>产生此记录消息的进程具有显式的网络编程。 <BR>关于UNIX域套接口以及UDP套接口的细节,请参阅stevens[1990]。 <BR>通常,syslogd精灵进程读取三种格式的记录消息。此精灵进程在启动时读一个配 <BR>置文件。一般,其文件名为/etc/syslog.conf,该文件决定了不同种类的消息应送 <BR>向何处。例如,紧急消息可被送向系统管理员(若已登录),并在控制台上显示, <BR>而警告消息则可记录到一个文件中。 <BR>该设施的界面是syslog函数。 <BR>_______________________________________________________________________ <BR>___ <BR>#include <syslog.h> <BR> void openlog(char *ident, int option, int facility); <BR> void syslog(int priority, char *format, …); <BR> void closelog(void); <BR>_______________________________________________________________________ <BR>___ <BR>调用openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,自动调 <BR>用openlog。调用closelog也是可选择的-它只是关闭被用于与syslogd精灵进程通 <BR>信的描述符。 <BR>调用openlog使我们可以指定一个ident,以后,此ident将被加至每则记录消息中。 <BR>Ident一般是程序的名称(例如,cron,inetd等)。图13.3说明了4种可能的选择 <BR>项。 <BR>openlog中的参数facility可以选取图13.4中列举的值。设置facility参数的目的 <BR>是让配置文件可以说明,来自不同设施的消息以不同的方式进行处理。如果不调用 <BR>openlog,或者以facility为0来调用它,那么我们在调用syslog时,可将facilit <BR>y作为priority参数的一个部分进行说明。 <BR>调用syslog产生一个记录消息。其priority参数是facility和level的组合,它们 <BR>可选取的值分别列于facility(示于图13.4)和level(示于图13.5)中。level值 <BR>按优先级从最高到最低按序排列。 <BR>format参数以及其它参数传至vsprintf函数以便进行格式化。在format中,每个% <BR>m都被代换成对应于errno值的出错消息字符串(strerror)。 <BR>SVR4和4.3+BSD都提供logger(1)程序,以其作为向syslog设施发送出错消息的方法 <BR>。送至该程序的可选择参数可以指定facility、level以及ident。logger的意图是 <BR>用于以非交互方式运行,又要产生记录消息的shell过程。 <BR> logger命令的格式正由POSIX.2标准化。 <BR>实例 <BR>在第十七章的PostScript打印机精灵进程中,包含有下面的调用序列: <BR>openlog("lprps",LOG_PID,LOG_LPR); <BR>syslog(LOG_ERR,"open error for %s: %m",filename); <BR>第一个调用将ident字符串设置为程序名,指定打印该进程ID,并且将系统默认的 <BR>facility设定为行式打印机系统。对syslog的实际调用指定一个出错条件和一个消 <BR>息字符串。如若不调用openlog,则第二个调用的形式可能是: <BR>systog(LOG_ERR|LOG_LPR,"open error for %s: %m",filename); <BR>其中,我们将priority参数指定为level和facility的组合。 <BR>图13.3 openlog的选择参数 <BR>图13.4 openlog的facility参数 <BR>图13.5 syslog中的levels(按序排列) <BR>13.5 客户-服务器模型 <BR>精灵进程常常用作为服务者进程。确实,在图13.2中,我们可以称syslogd进程为 <BR>服务员,用户进程(客户)用UNIX域数据报套接口向其发送消息。 <BR>一般而言,服务者是一个进程,它等待客户与其联系,提出某种类型的服务要求。 <BR>在图13.2中,由syslogd服务者提供的服务是记录出错消息。 <BR>在图13.2中,在客户和服务者之间的通信是单向的。客户向服务者发送其服务要求 <BR>,服务者则不向客户回送任何消息。在下面有关进程通信的几章中,有大量实例, <BR>其中有客户和服务者之间的双向通信。客户向服务者发送要求,服务者则向客户回 <BR>送回答。 <BR> <BR> <BR>13.6 摘要 <BR>在大多数Unix系统中,精灵进程是一直运行的。为了初始化我们自己的精灵进程, <BR>需要一些审慎的思索并理解在第九章中说明过的进程之间的关系。本章中,我们开 <BR>发了一个可由精灵进程调用,对其自身正确地进行初始化的函数。 <BR>我们也讨论了精灵进程记录出错消息的几种方法,精灵进程通常没有控制终端。在 <BR>SVR4下,可以使用流记录驱动程序,在4.3+BSD之下,提供了syslog设施。因为SV <BR>R4也提供BSD syslog设施,所以在下面的章节中,当精灵进程需要记录出错消息时 <BR>,将调用syslog函数。在第十七章中,PostScript打印机精灵进程就包含有这种情 <BR>况。 <BR> <BR> <BR>习题: <BR>13.1 从图13.2可以看出,直接调用openlog或第一次调用syslog都可以初始化sys <BR>log,此时一定要打开用于Unix域的数据报套接口的特殊设备文件/dev/log。如果 <BR>调用openlog前用户进程(精灵进程)先调用了chroot,结果如何? <BR>13.2 列出你的系统中所有的精灵进程,并说明它们的功能。 <BR>13.3 编写一段调用程序13.1中daemon_init函数的程序。调用该函数后调用getlo <BR> <BR>gin(8.14节)查看该精灵进程是否有登录名。若程序带有3 > /tmp/name1运行时( <BR>Bourne Shell或Kornshell),则将登录名打印到文件描述符3,并重定向到一个临 <BR>时文件。在调用deamon_init和getlogin之间关闭描述符1、2和3,此时再运行该程 <BR>序会有什么不同? <BR> <BR>-- <BR> <BR> <BR>-- <BR>※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.38.248.38] <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -