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

📄 13.htm

📁 操作系统方面的书籍
💻 HTM
📖 第 1 页 / 共 2 页
字号:

<p>记录功能。有关文献包含在[AT&amp;T1990d]的log[7]中。图13.1详细给出了这种设施 
</p>

<p>的整个结构。 </p>

<p>图13-1 SVR4 log 设施 </p>

<p>有三个记录进程(logger),它们是:出错记录进程、跟踪记录进程以及控制 
</p>

<p>台记录进程。每一条记录消息可以送给其中之一。 </p>

<p>下面介绍三种产生记录消息的方法,三种读记录消息的方法。 </p>

<p>&middot;产生记录消息 </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>&middot;读记录消息 </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&amp;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 &lt;syslog.h&gt; </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(&quot;lprps&quot;,LOG_PID,LOG_LPR); </p>

<p>syslog(LOG_ERR,&quot;open error for %s: %m&quot;,filename); </p>

<p>第一个调用将ident字符串设置为程序名,指定打印该进程ID,并且将系统默认的 
</p>

<p>facility设定为行式打印机系统。对syslog的实际调用指定一个出错条件和一个消 
</p>

<p>息字符串。如若不调用openlog,则第二个调用的形式可能是: </p>

<p>systog(LOG_ERR|LOG_LPR,&quot;open error for %s: %m&quot;,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 &gt; /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 + -