文档章节

网络编程学习——守护进程和inetd超级服务器

thanatos_y
 thanatos_y
发布于 2016/04/18 15:37
字数 1744
阅读 20
收藏 0
点赞 1
评论 0

1 概述

  守护进程(daemon)是在后台运行且不与任何控制终端关联的进程。Unix系统通常有很多守护进程在后运行(约在20到50个的量级),执行不同的管理任务。

  守护进程没有控制终端控制通常源于它们由系统初始化脚本启动。然而守护进程也可能从某个终端由用户在shell提示符下键入命令行启动,这样的守护进程必须亲自脱离与控制终端的关联,从而避免与作业控制、终端会话管理、终端产生信号等发生任何不期望的交互,也可以避免在后台运行的守护进程非预期地输出到终端。

  守护进程有多种方法可以启动。

  1. 在系统启动阶段,许多守护进程由系统初始化脚本启动。这些脚本通常位于/etc目录或以/etc/rc开头的某个目录中,它们的具体位置和内容却是现实相关的。由这些脚本启动的守护进程一开始拥有超级用户特权。

    有若干个网络服务器通常从这些脚本启动:inetd超级服务器、Web服务器、邮件服务器(经常是sendmail)。

  2. 许多网络服务器由inetd超级服务器启动。inetd自身由上一条中的某个脚本启动。inetd自身由上一条中的某个脚本启动。inetd监听网络请求(Telnet、TFP等),每当有一个请求到达时,启动相应实际服务器(Telnet服务器、FTP服务器等)。

  3. cron守护进程按照规则定期执行一些程序,而由它启动执行的程序同样作为守护进程运行。cron自身由第1条启动方法中的某个脚本启动。

  4. at命令用于指定将来某个时刻的程序执行。这些程序的执行时刻到来时,通常由cron守护进程启动执行它们,因此这些程序同样作为守护进程。

  5. 守护进程还可以从用户终端或在前台或在后台启动。这么做往往是为了测试守护程序或重启因某种原因而终止的某个守护进程。

      因为守护进程没有控制终端,所以当有事发生时它们得有输出消息的某种方法可用,而这些消息既可能是普通的通告性消息,也可能是需由系统管理员处理的紧急事件消息。syslog函数是输出这些消息的标准方法,它把这些消息发送给syslog守护进程。

     

2 syslog守护进程

  Unix系统中的syslogd守护进程通常由某个系统初始化脚本启动,而且在系统工作期间一直运行。源自Berkeley的syslogd实现在启动时执行以下步骤。

  1. 读取配置文件。通常为/etc/syslog.conf的配置文件指定本守护进程可能收取的各种日志消息(log message)应该如何处理。这些消息可能被添加到一个文件(/dev/console文件是一个特例,它把消息写到控制台上),或被写到到指定用户的登录窗口(若该用户已登录到本守护进程所在系统中),或被转发给另一个主机上的syslogd进程。

  2. 创建一个Unix域数据报套接字,给它捆绑路径名/var/run/log(在某些系统上是/dev/log)。

  3. 创建一个UDP套接字,给它捆绑端口514(syslog服务使用的端口)。

  4. 打开路径名/dev/klog。来自内核中的任何出错消息看着像是这个设备的输入。

  此后syslogd守护进程在一个无线循环中运行:调用select以等待它的3个描述符(分别来自上述2,3和4步)之一变为可读,读入日志信息,并按照配置文件进行处理。如果守护进程收到SIGUP信号,那就重新读取配置文件。通过创建一个Unix域数据报套接字,我们就可以从自己的守护进程中通过往syslog绑定的路径名发送我们的消息达到发送日志消息的目的。另外,我们也可以创建一个UDP套接字,通过往环回地址和端口514发送我们的消息达到发送日志消息的目的。

3 syslog函数

  既然守护进程没有控制终端,它们就不能把消息fprintf到stderr上。从守护进程中登记消息的常用技巧就是调用syslog函数。

#include <syslog.h>
/* Generate a log message using FMT string and option arguments.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern void syslog (int __pri, const char *__fmt, ...)
     __attribute__ ((__format__ (__printf__, 2, 3)));

  本函数的__pri参数是级别(level)和设施(facility)两者的组合,分别如图1-1和图1-2。

  如图1-1所示,日志消息的level可从0到7,它们是按从高到低的顺序排序的。如果发送者未指定level值,那就默认为LOG_NOTICE。

图1-1 日志消息的level

  日志消息还包含一个用于标识消息发送进程类型的facility。图1-2列出了facility的各种值。如果发送者未指定facility值,那就默认为LOG_USER。

图1-2 日志消息的facility

  举例来说,当rename函数调用意外失败时,守护进程可以执行以下调用:

syslog( LOG_INFO | LOG_LOCAL2, " rename( %s, %s ): %m ", file1, file2 );

  facility和level的目的在于,允许在/etc/syslog.conf文件中统一配置来自同一给定设施的所有消息,或者统一配置具有相同级别的所有信息。举例来说,该配置文件可能含有以下两行:

kern.*  /dev/console
loacl7.debug  /var/log/cisco.log

  这两行指定所有内核消息登记到控制台,来自local7设施的所有debug消息添加到文件/var/log/cisco.log的末尾。

  当syslog被应用进程首次调用时,它创建一个Unix域数据报套接字,然后调用connect连接到由syslog守护进程创建的Unix域数据报套接字的众所周知路径名(譬如/var/run/log)。这个套接字一直保持打开。直到进程终止为止。作为替换,进程也可以调用openlog和closelog。

#include <syslog.h>
/* Open connection to system logger.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern void openlog (const char *__ident, int __option, int __facility);

/* Close descriptor used to write to system logger.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern void closelog (void);

  openlog可以在首次调试调用syslog前调用,closelog可以在应用进程不再需要发送日志消息时调用。
 

 

 

© 著作权归作者所有

共有 人打赏支持
thanatos_y
粉丝 7
博文 90
码字总数 315059
作品 0
成都
程序员
linux的守护进程init.d和xinetd.d

Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户。提供这些服务的程序是由运行在后台的守护进程来执行的。守护进程是生...

学习环境 ⋅ 2015/07/16 ⋅ 0

网络守护进程服务程序--xinetd

xinetd是新一代的网络守护进程服务程序,又叫超级Internet服务器,常用来管理多种轻量级Internet服务。 xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。 2. xinetd的特色 1)...

匿名 ⋅ 2013/03/27 ⋅ 0

Apache配置之ServerType的standalone和inetd模式

不仔细看httpd.conf配置文件还不知道有这回事,汗。    ServerType这个配置选项指定如何运行Apache。Apache可以使用两种方法来运行:standalone(独立式)和inetd(超级守护进程式)。    st...

BearCatYN ⋅ 2015/05/22 ⋅ 0

svn学习笔记

subversion的组件: svn 命令行客户端程序。 svnversion 此工具用来显示工作拷贝的状态(用术语来说,就是当前项目的修订版本)。 svnlook 直接查看Subversion版本库的工具。 svnadmin 建立、...

索隆 ⋅ 2011/12/10 ⋅ 0

svn学习笔记

摘自:http://www.subversion.org.cn/svnbook/1.4/index.html subversion的组件: svn 命令行客户端程序。 svnversion 此工具用来显示工作拷贝的状态(用术语来说,就是当前项目的修订版本)...

蜜蜜 ⋅ 2011/12/08 ⋅ 0

优化Linux系统资源和加快启动速度的方法

编辑/etc/inittab文件 大部分Linux的发行套件都建立六个虚拟控制台,如果你的内存资源比较紧张,而且使用一个已经足够,可以编辑/etc/inittab文件,节省可贵的内存空间。在下面五行的前面加上...

范堡 ⋅ 2009/05/07 ⋅ 0

CentOS 6.9中Telnet的安装配置

Telnet:TCP/IP协议中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。要开始一个Telnet会话,必须输入用户名和密码来登录服务器...

Marion0728 ⋅ 2017/09/20 ⋅ 0

Linux操作系统网络服务器配置基础(上)

  * /etc/conf.modules 文件   该配置文件定义了各种需要在启动时加载的模块的参数信息。这里主要着重讨论关于网卡的配置。在使用Linux做网关的情况下,Linux服务器至少需要配置两块网卡...

红薯 ⋅ 2009/05/07 ⋅ 0

《Unix网络编程卷1-套接字联网API》第一个例子编译 不通过问题解决

《Unix网络编程卷1-套接字联网API》是本好书。 但是第一个例子不是很好编译。 需要如下步骤: 本人机器CentOS 5.4 1.下载源码 unpv13e解压到任意目录 然后按其readme文件操作 ./configure # ...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

远程登录:telnet与ssh

1,什么是远程登录 远程登录是用户使用ssh,telnet等命令,登录到一台远程服务器进行操作,使自己的计算机暂时成为远程主机的一个仿真终端的过程。 登录系统后所有的操作都是对远程主机的操作...

nao ⋅ 2014/03/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部