守护进程和inetd超级服务器

本文详细介绍了Unix/Linux系统中的守护进程,包括syslogd的启动过程、syslog函数的使用,以及如何将普通进程转换为守护进程。此外,重点解析了inetd守护进程的工作原理,作为因特网超级服务器,它如何简化多个网络服务的启动和管理,减少系统资源占用。同时,讨论了inetd处理服务请求的流程和子进程的创建。
摘要由CSDN通过智能技术生成

一、概述

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

守护进程启动方法:

  1. 由系统初始化脚本启动,通常位于/etc/rc或/etc目录下,由这些脚本启动的守护进程一开始拥有超级用户特权。

  2. 许多网络服务器由inetd超级服务器启动。

  3. cron守护进程定期执行一些程序,由它执行的程序同样作为守护进程运行。

  4. at命令指定将来某个时刻的程序执行。当这些程序的执行时间到了由cron来启动。

  5. 可以从用户终端前台和后台启动。

由于守护进程没有控制终端,通常使用syslog函数来输出消息,并通过syslogd守护进程接收消息。

二、syslogd守护进程

syslogd守护进程由某个系统初始化脚本启动,并且在系统工作期间一直运行。可以在终端输入ps -aux | grep syslog查看。当syslog守护进程启动时一般执行下列步骤:

  1. 读取配置:通常为/etc/syslog.conf指定syslogd守护进程可能接收到的各种日志消息和怎样处理。当这些消息被添加到/dev/console中时,则消息打印到控制台。

  2. 创建Unix域套接字,捆绑路径名/var/run/log(或者/dev/log)

  3. 创建udp套接字,端口号为514,通过命令cat /etc/services | grep "syslog"查看。

  4. 打开路径名/dev/klog。内核的错误消息看着像是这个设备的输入。

  5. 监听:调用select,监听上面几个步骤。(收到信息,读入并安装配置进行处理;收到SIGHUP信号,重新配置文件)。

  6. 注:新的syslogd实现禁止创建UDP套接字,会造到Dos攻击。

三、syslog函数

守护进程没有控制终端,因此我们不能把消息fprintfstderr上,那么就可以使用syslog函数:

#include<syslog.h>
void syslong(int priority,const char *message,...);
//priority:级别(level):默认:LOG_NOTICE,和设施(facility):默认:LOG_USER,两者的组合,如下两图所示。

在这里插入图片描述
在这里插入图片描述

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

syslog(LOG_IOFO|LOG_LOCAL2,"rename(%s,%s):%m",file1,fil);
//facitily和level:允许/etc/syslog.conf文件统一配置来自同一给定设施的所有信息,或者统一配置具有相同级别的所有消息。
//例:该配置文件可能含有以下两行:
kern.*		/dev/debug  //内核的所有消息发送控制台
loca17.debug	/var/log/cisco.log //来自loca17的所有消息添加到文件cisco.log的尾部

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

//openlog可以在首次调用syslog前调用,closelog可以在应用进程不再需要发送日志消息时调用。
#include<syslog.h>
void openlog(const char *ident,int options,int facility);
//ident:日志前缀,通常为程序名
//options:如下图所示
//facility:设置默认的打印设施的值
void closelog(void);

int setlogmask(int maskpri);
//为当前的进程设置这个日志掩码,并返回先前的掩码。如果掩码参数为0,那么当前的日志掩码不会被修改。

在这里插入图片描述

  1. openlog被调用时,通常并不立即创建Unix域套接字。相反,该套接字直到首次调用syslog时才打开。

  2. LOG_NDELAY选项迫使该套接字在openlog被调用时就创建。

  3. openlogfacility参数为没有指定设施的后续syslog调用指定一个默认值。

  4. 有些守护进程通过调用openlog指定一个设施 (对于一个给定守护进程,设施通常不变),然后在每次调用syslog时只指定级别(因为级别可随错误性质改变)。

  5. 日志消息也可以由logger命令产生。例:logger命令可用在shell脚本中以向syslogd发送消息。

四、daemon_init函数

将一个普通进程转变为守护进程。(daemon的C库函数,实现类似功能)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值