守护进程的创建

本文深入解析Linux守护进程(Daemon)的概念、特点及其实现过程。守护进程作为后台服务,独立于控制终端,常用于执行周期性任务或响应事件。文章详细介绍了通过创建子进程、新会话、改变工作目录、重设文件权限掩码和关闭文件描述符五个步骤,将普通进程转换为守护进程的方法。

Linux守护进程又被称为Daemon进程,为Linux的后台服务进程(即独立于控制终端)。该进程通常周期性的执行某种任务或等待处理某些发生的事件。其生命周期较长,通常在系统启动时开始执行,在系统关闭时终止。Linux中很多系统服务都是通过守护进程实现的。
在Linux中,每一个从终端开始运行的进程都会依附于该终端(系统与用户进行交互的界面),这个终端称为进程的控制终端。当控制终端关闭时,这些进程就会自动结束。但是守护进程不受终端关闭的影响。
如何将一个进程变成一个守护进程,只需要遵循一些特定的流程,下面将通过5个步骤来讲解。
(1)创建子进程,子进程不退出,父进程退出。
很明显,由于父进程先于子进程退出,造成子进程成为孤儿进程。此时子进程的父进程变成init进程。
(2)在子进程中创建新会话。
这个步骤在3.1.4节中已经有所介绍。使用的函数是setsid()。该函数将会创建一个新会话,并使进程担任该会话组的组长。同时在会话组中创建新的进程组,该进程依然也是进程组的组长。该进程成为新会话组和进程组中唯一的进程。最后使该进程脱离终端的控制,运行在后台。
之所以需要这样处理,是因为子进程在被创建时,复制了父进程的会话、进程组和终端控制等。虽然父进程退出,但原先的会话、进程组和控制终端等并没有改变。因此子进程并没有实现真正意义上的独立。
(3)改变当前的工作目录。
使用fork()创建的子进程继承了父进程的当前工作目录。系统通常的做法是让根目录成为守护进程的当前工作目录。改变工作目录的函数是chdir()。
#include <unistd.h>
int chdir(const char *path);
(4)重设文件权限掩码。
文件权限掩码的作用是屏蔽文件权限中的对应位。在2.3.2节中有涉及到该问题。文件被创建之后,用户对其的操作权限mode参数,将会被执行mode&~umask,umask即为文件权限掩码,通常用8进制数表示。例如,文件的权限为0666,umask值为0002,那么将umask取反,再与文件权限相与,则文件权限值变为0664。由于创建的子进程继承了父进程的文件权限掩码,这给子进程(守护进程)操作文件带来一定影响。因此,通常把文件权限掩码设置为0,这样可以增强守护进程的灵活性。此时文件权限掩码取反全为1,与任何文件权限相与,都可保持文件最原始的状态值。
使用函数umask(),改变文件权限掩码,参数即为要修改的掩码值。
#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t mask);
(5)关闭文件描述符。
新创建的子进程会从父进程继承一些已经打开的文件描述符。这些描述符可能永远不会被守护进程访问。但它们却占有一定的资源。特别需要注意的是,守护进程脱离了终端的控制,所以与终端相关的标准输入、输出、错误输出的文件描述符0、1、2,已经没有了任何价值,应当被关闭。
通常关闭文件描述符,采用如下方法。
int num;
num = getdtablesize(); /获取当前进程文件描述符表大小/
for(i = 0; i < num; i++){
close(i);
}
其中,getdtablesize()的功能为获取文件描述符表的大小,也可以理解为获取进程打开的文件描述符的最大数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值