Unix系统中的syslogd守护进程通常由某个系统初始化脚本启动,而且在系统工作期间一直运行。

源自Berkeley的syslogd实现在启动时执行以下步骤。

(1)读取配置文件。通常为/etc/syslog.conf的配置文件指定本守护进程可能收取的各种日志消息,应该如何处理。

(2)创建一个Unix域数据报套接字,给它捆绑路径名/var/run/log

(3)创建一个UDP套接字,给它捆绑端口514。

(4)打开路径名/dev/klog。

一、syslog函数

#include <syslog.h>

void syslog(int prioriry, const char *message, ...);
priority:级别level和设施facility两者的组合
message参数类似printf的格式串,不过增加了%m,它将被替换成与当前errno值对应的出错消息。

日志消息的level可以是0~7,他们按从高到低的顺序排列的。如果发送者未指定level值,那就默认为LOG_NOTICE。

日志消息包含一个用于标识消息发送进程类型的facility。默认LOG_USER

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

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

#include <syslog.h>

void openlog(cosnt char *ident, int options, int facility);
void closelog(void);
ident:有syslog关于每个日志消息之前的字符串。通常的值是程序名
options:一个或多个常值的逻辑或构成
facility:

options的参数

二、守护进程

下面有一个daemon_init函数,调用它可使一个进程变成守护进程。

 #include "unp.h"
#include <syslog.h> #define MAXFD 64 extern int daemon_proc; /* defined in error.c */ int
daemon_init(const char *pname, int facility)
{
int i;
pid_t pid; if((pid = Fork()) < )
return(-);
else if(pid)
_exit(); /* parent terminates */
/* child 1 continues ... */
if(setsid() < ) /* become session leader */
return(-);
Signal(SIGHUP, SIG_IGN);
if((pid = Fork()) < )
return(-);
else if(pid)
_exit(); /* child 1 terminates */
/* child 2 continues ... */
daemon_proc = ; /* for err_XXX() functions */
chdir("/"); /* change working directory */
/* close off file descriptors */
for(i=;i<MAXFD;i++)
close(i);
/* redirect stdin, stdout, and stderr to /dev/null */
open("/dev/null", O_RDONLY);
open("/dev/null", O_RDWR);
open("/dev/null", O_RDWR);
openlog(pname, LOG_PID, facility);
return();
}
  • 首先调用fork,然后终止父进程,留下子进程继续运行。如果进程是以shell命令方式从前台启动,当父进程终止时,shell就认为命令已完成。这可以使子进程运行在后台。子进程继承了父进程的进程组号,但它拥有自己的进程号。这就保证了这个子进程不是进程组头。
  • setsid创建一个新的登录会话。这个进程变成新会话的会话头和新进程组的组长,不再有控制终端。
  • 忽略SIGHUP信号并再次调用fork,再次调用fork的目的是确保本守护进程将来即使打开了一个终端设备,也不会自动获得控制终端。
  • 为错误处理函数设置标识
  • 改变工作目录
  • 关闭所有打开的文件描述符
  • 将stdin、stdout、stderr重定向到/dev/null
  • 使用syslog处理错误

三、inetd守护进程

inetd守护进程的工作流程

  1. 启动时读/etc/inetd.conf文件并给文件中指定的所有服务创建一个响应类型的套接口。inetd能处理的服务器的数目依赖于它最多能创建的描述字的数目。每个新创建的套接口都被加入到select调用所用到的描述字集中。
  2. 为每个套接口调用bind,给它们捆绑服务器的众所周知端口和通配地址。它们的TCP或UDP端口号时通过调用getservbyname获得的,其中使用了配置文件中的service-name和protocol作为参数。
  3. 对TCP套接口调用listen,以接受外来的连接请求。对数据报套接口则不做这一步。
  4. 所有套接口建立后,调用select等待这些套接口变为可读。当在TCP套接口上到来一个新的连接请求或UDP套接口上到来一个数据报时他们会变成可读。inetd在大部分时间里阻塞在select调用上,等待有一个套接口变成可读。
  5. select返回一个可读的套接口后,如果是一个TCP套接口,就调用accept接受这个新的连接。
  6. inetd守护进程fork,由子进程处理服务请求。

UNP学习第13章 守护进程和inetd超级服务器的更多相关文章

  1. Unix网络编程代码 第13章 守护进程和inetd超级服务器

    1. 概述 守护进程是在后台运行且不与任何控制终端关联的进程.unix系统通常有很多守护进程在后台运行,执行不同的管理任务.    守护进程没有控制终端通常源于它们由系统初始化脚本启动.然而守护进程也 ...

  2. 《Unix 网络编程》13:守护进程和 inetd 超级服务器

    守护进程和 inetd 超级服务器 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...

  3. UNP学习笔记(第十三章 守护进程和inetd超级服务器)

    关于守护进程可以查看apue的笔记 http://www.cnblogs.com/runnyu/p/4645046.html daemon_init函数 下面给出名为daemon_init函数,通过调 ...

  4. APUE读书笔记-第13章-守护进程

    第13章 守护进程 13.1 引言 *守护进程也称精灵进程(daemon)是生存期较长的一种进程.它们常常在系统自举时启动,仅在系统关闭时才终止.因为它们没有控制终端,所以说它们是在后台运行的.UNI ...

  5. 守护进程和inetd超级服务器

    守护进程: 1 系统启动时,由系统初始化脚本启动.一般在/etc目录下,或者以/etc/rc开头的目录 2 许多网络服务器由inetd超级服务器启动 3 cron守护进程按规则定期执行一些程序 4 用 ...

  6. UNP第13章——守护进程

    1. 守护进程的启动方法 (1)系统初始化脚本启动,在系统启动阶段,按照如/etc目录或/etc/rc开头的目录中的某些脚本启动,这些守护进程一开始就有超级用户权限.如inetd,cron,Web服务 ...

  7. UNIX环境高级编程 第13章 守护进程

    守护进程daemon是一种生存周期很长的进程.它们通常在系统引导时启动,在系统关闭时终止.守护进程是没有终端的,它们一直在后台运行. 守护进程的特征 在Linux系统中,可以通过命令 ps -efj ...

  8. 《Unix环境高级编程》读书笔记 第13章-守护进程

    1. 引言 守护进程是生存期长的一种进程.它们常常在系统引导装入时启动,仅在系统关闭时才终止.它们没有控制终端,在后台运行. 本章说明守护进程结构.如何编写守护进程程序.守护进程如何报告出错情况. 2 ...

  9. UNP总结 Chapter 12~14 IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数

    一.IPv4与IPv6的互操作性 1.IPv4客户与IPv6服务器 拥有双重协议栈的主机的一个基本特性就是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户.这是通过使用IPv4映射 ...

随机推荐

  1. 回炉Spring--Bean生命周期及AOP

    Spring容器: 在基于Spring的应用中,你的应用对象生存于Spring容器(container)中,Spring容器负责创建对象,装配它们,配置它们并管理它们的整个生命周期,从生存到死亡.(在 ...

  2. 趣头条基于 Flink 的实时平台建设实践

    本文由趣头条实时平台负责人席建刚分享趣头条实时平台的建设,整理者叶里君.文章将从平台的架构.Flink 现状,Flink 应用以及未来计划四部分分享. 一.平台架构 1.Flink 应用时间线 首先是 ...

  3. loadRunner函数之lr_set_debug_message

    lr_set_debug_message:选择性开启扩展日志 vuser_init: vuser_init() { ; } Action: Action() { ExtendedLog(); // 开 ...

  4. LDD3 第11章 内核的数据类型

    考虑到可移植性的问题,现代版本的Linux内核的可移植性是非常好的. 在把x86上的代码移植到新的体系架构上时,内核开发人员遇到的若干问题都和不正确的数据类型有关.坚持使用严格的数据类型,并且使用-W ...

  5. AcWing 257. 关押罪犯 (并查集)打卡

    题目:https://www.acwing.com/problem/content/description/259/ 题意:有两个监狱,监狱里面有很多犯人,现在有很多对冲突,还有个冲突值,现在问我们怎 ...

  6. Houdini学习笔记——【一】散落苹果

    [案例一]散落的苹果 0.渲染 1.sop使用 - 苹果主体:curve绘制刨面曲线,revolve车削得到苹果主体,uvtexture来调整uv,convert继续转换为polygon,fuse缝合 ...

  7. 提高redis cluster集群的安全性,增加密码验证

    节点设置密码 1.修改配置文件 在配置文件里面增加密码选项,一定要加上masterauth,不然Redirected的时候会失败. masterauth redispassword requirepa ...

  8. 关系型数据库MySQL(二)_索引

    优点 大大加快数据的查询速度 创建唯一性索引,保证数据库表中每一行数据的唯一性 在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间 缺点 索引需要占物理空间 当对表中的数据进行增删 ...

  9. Java + selenium window()接口方法介绍

    在浏览器启动的代码中,有一段关于window接口的调用,这篇文章就是来解释介绍这个接口的.代码如下 driver.manage().window().maxmize(); window接口主要是用来控 ...

  10. git使用记录六:对commit的message做处理

    修改最新commit的message git commit --amend 修改老旧commit的message 查询最新的三个log soaeon@DESKTOP-FUJJTHR MINGW64 / ...