⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000013.htm

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -