Linux/UNIX系统编程手册(pdf+epub+mobi+txt+azw3)

1.jpg

第37章 DAEMON

本章介绍daemon进程的特征和将一个进程变成一个daemon所需完成的步骤。此外,还会介绍如何在daemon中使用syslog工具记录消息。


37.1 概述

daemon是一种具备下列特征的进程。


它的生命周期很长。通常,一个daemon会在系统启动的时候被创建并一直运行直至系统被关闭。

它在后台运行并且不拥有控制终端。控制终端的缺失确保了内核永远不会为daemon自动生成任何任务控制信号以及终端相关的信号(如SIGINT、SIGTSTP和SIGHUP)。

daemon是用来执行特殊任务的,如下面的示例所示。


cron:一个在规定时间执行命令的daemon。

sshd:安全shell daemon,允许在远程主机上使用一个安全的通信协议登录系统。

httpd:HTTP服务器daemon(Apache),它用于服务Web页面。

inetd:Internet超级服务器daemon(参见60.5节),它监听从指定的TCP/IP端口上进入的网络连接并启动相应的服务器程序来处理这些连接。

很多标准的daemon会作为特权进程运行(即有效用户ID为0),因此在编写daemon程序时应该遵循第38章中给出的指南。


通常会将daemon程序的名称以字母d结尾(但并不是所有人都遵循这个惯例)。


在Linux上,特定的daemon会作为内核线程运行。实现此类daemon的代码是内核的一部分,它们通常在系统启动的时候被创建。当使用ps(1)列出线程时,这些daemon的名称会用方括号([])括起来。其中一个内核线程是pdflush,它会定期将脏页面(即高速缓冲区中的页面)写入磁盘。


37.2 创建一个daemon

要变成daemon,一个程序需要完成下面的步骤。


1. 执行一个fork(),之后父进程退出,子进程继续执行。(结果是daemon成为了init进程的子进程。)之所以要做这一步是因为下面两个原因。


假设daemon是从命令行启动的,父进程的终止会被shell发现,shell在发现之后会显示出另一个shell提示符并让子进程继续在后台运行。

子进程被确保不会成为一个进程组首进程,因为它从其父进程那里继承了进程组ID并且拥有了自己的唯一的进程ID,而这个进程ID与继承而来的进程组ID是不同的,这样才能够成功地执行下面一个步骤。

2. 子进程调用setsid()(参见34.3节)开启一个新会话并释放它与控制终端之间的所有关联关系。


3. 如果daemon从来没有打开过终端设备,那么就无需担心daemon会重新请求一个控制终端了。如果daemon后面可能会打开一个终端设备,那么必须要采取措施来确保这个设备不会成为控制终端。这可以通过下面两种方式实现。


声明:

推书365展示内容收集于网络,仅用于免费的知识分享交流和学习!版权归出版方所有。

如有侵权,请联系本站进行删除,感谢您的理解与包容!

如果您喜欢本站推荐书籍等资源,请支持购买正版,谢谢合作!