UNIX环境高级编程 第十三章:守护进程

守护进程(daemon)是生存期长的一种进程。它们常常在系统引导装入时启动,仅在系统关闭时才终止(生存期)。
因为它们没有控制终端,所以说它们时在后头运行的。UNIX系统有很多守护进程,它们执行日常事务活动。
本章将说明守护进程的结构,以及如何编写守护进程程序。因为守护进程没有控制终端,我们需要了解在出现问题时,daemon如何报告出错情况。

1. 守护进程的特征

先来看看一些常用的系统守护进程,以及它们是怎样和进程组、控制终端和会话这三个概论相关联的。
ps -axj
-a显示由其他用户所拥有的进程状态(UNIX为多用户系统)
-x显示没有控制终端的进程;
-j显示与作业有关的信息
PPID为0的进程通常是内核进程,它们作为系统引导装入过程的一部分而启动。(init是一个例外,它是一个由内核在引导装入时启动的用户层次的命令)
内核进程是特殊的,通常存在于系统的整个生命周期中。它们以超级用户特权运行,无控制终端、无命令行。
在ps输出实例中,内核守护进程的名字出现在方框中,很多形式为’k*d’的进程其中‘k’指kernel,‘d’指daemon。
对于需要在进程上下文执行工作但却不被用户层进程上下文调用的每一个内核组件,通常有它自己的内核守护进程。

2. 编程规则

在编写守护进程程序时要遵循一些基本规则,以防止产生不必要的交换作用。
(1)首先要做的是调用umask将文件模式创建屏蔽字(文件权限用) 设置为一个已知的值(通常是0)。由继承得来的文件模式创建屏蔽字可能会被设置为拒绝某些权限。
(2)调用fork,然后使父进程exit。实现了:第一,如果该守护进程是作为一条简单的shell命令启动的,那么父进程终止会让shell认为这条命令已经执行完毕。第二,虽然子进程继承了父进程的进程组ID,但获得了一个新的进程ID,这就保证了子进程不是一个进程组的组长进程。
(3)调用setsid创建一个会话。然后使调用进程称为新会话的首进程,称为一个新进程组的组长进程,没有控制终端。
(4)将当前工作目录更改为根目录。从父进程继承过来的当前工作目录可能在一个挂载的文件系统中。因为守护进程一直存在,那么该文件系统就不能被卸载。
(5)关闭不再需要的文件描述符。

3. 出错记录

守护进程存在的一个问题是如何处理出错消息。因为它本身就不应该有控制终端,所以不能只是简单地写到标准出错上。我们不希望守护进程使用控制台设备,因为很多工作站的控制台设备都运行着一个窗口系统,也不会希望每个守护进程都将出错消息写到单独的文件中,管理这些文件很费事。所以需要一个集中的守护进程出错记录设施。

BSD的syslog设施得到了广泛的应用,大多数守护进程都使用这一设施。
守护进程在启动时读一个配置文件,其文件名一般为/etc/syslog.conf,该文件决定了不同种类的消息应送向何处。守护进程记录日志消息的实施是/dev/log,其接口是syslog函数:

#include <syslog.h>
void openlog(const char *ident,int optipn,int facility);
void syslog(int priority,const char *format,...);
void closelog(void);
int setlogmask(int maskpri);//用于设置进程的记录优先级屏蔽字。

大多数syslog实现将消息短时间处于队列中。如果在此段时间中有重复消息达到,那么syslog守护进程不会把它记录到日志记录中,而是会打印输出一条类似“上一条消息重复了N此”的消息。

4. 单实例守护进程

为了正常运作,某些守护进程(不是所有的都必须)会实现为:在任意时刻只运行该守护进程的一个副本。
文件和记录锁机制为这一种方法提供了基础,该方法保障一个守护进程只有一个副本在运行。如果每一个守护进程创建一个固定名字的文件,并在该文件的整体上加一把锁,那么只允许创建一把这样的锁。在此后创建写锁的尝试都会失败,这向后续守护进程副本指明已有一个副本正在运行。

5. 守护进程的惯例

在UNIX系统中,守护进程遵循下列通用惯例:
(1)若守护进程使用锁文件,那么该文件通常存储在/var/run目录中。然而需要注意的是,守护进程可能需要具有超级用户权限才能在此目录下创建文件。锁文件的名字通常是name.pid。
(2)若守护进程支持配置选项,那么配置文件通常存放在/etc目录中。配置文件的名字通常是name.conf。
(3)守护进程可以用命令行启动,但通常他们是由系统初始化脚本之一(/etc/rc*或/etc/init.d/..)启动的。如果在守护进程终止时,应当自动地重新启动它,则我们可以在/etc/inittab(为init进程的配置文件)中为该守护进程包括respawn记录项,这样init就将重新启动该守护进程。
(4)若一个守护进程有一个配置文件,那么该守护进程启动时会读该文件,但在此之后一般就不会再查看它。若某个管理员更改了配置文件,那么该守护进程可能需要配停止,然后再启动,以使配置文件的更改生效。为了避免此种麻烦,某些守护进程将捕捉SIGHUP信号,当他们接受到该信号时,重新读配置文件。

6. 客户进程-服务器进程模型

守护进程常常用作服务器进程。确实,我们可以称syslogd进程为服务器进程,用户进程(客户进程)用UNIX域数据报套接字向其发送消息。
一般而言,服务器进程等待客户进程与其联系,提出某种服务类型的请求。例如,syslogd服务器进程提供的服务是将一条出错消息记录到日志文件中。
在服务器进程中调用fork然后exec另一个程序来向客户进程提供服务是很常见的。这些服务器进程通常管理着多个文件描述符:通信端点、配置文件、日志文件和类似的文件。

小结:

(1)在大多数UNIX系统中,守护进程是一直运行的。
(2)为了初始化我们自己的进程,使之作为守护进程运行,需要谨慎的思索并理解第9章所说明的进程之间的关系。
(3)因为守护进程没有控制终端,本章还说明了守护进程记录出错消息的几种方法。
(4)还讨论了守护进程遵循的若干惯例,给出了几个如何实现惯例的实例。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值