守护进程 | 小牛学习日记
守护进程
Published in:2025-02-24 | category: C++
Words: 570 | Reading time: 2min | reading:

守护进程

是一种在后台运行的特殊进程,通常用于执行系统任务或服务,不需要和用户交互。它在操作系统系董事运行,并在整个系统运行期间持续工作。

守护进程特点

①后台运行:守护进程在后台运行,不与任何终端关联,因此用户无法通过终端直接与其交互。
②独立于用户会话:守护进程通常与用户登录回话无关,即使所有用户注销,守护进程仍然继续运行。
③生命周期长:在系统启动时启动,在系统关闭时终止,生命周期与系统运行时间一致。
④无控制终端:守护进程没有控制终端,因此不会接受来自终端的信号(如SIGHUP)。
⑤通常以root权限运行:许多守护进程需要访问系统资源或执行特权操作,因此以root用户权限运行。

守护进程的用途

守护进程通常用于提供系统服务或执行后台任务,如系统服务、日志记录、任务调度、消息队列等

守护进程的创建步骤

创建子进程并退出父进程

使用fork()创建子进程,然后退出父进程,使其变成一个孤儿进程,并被init进程接管。

1
2
3
4
5
pid_t pid=fork();
if(pid>0)
{
exit(0); //退出父进程
}

创建新会话

使用setid()闯进新会话,是子进程成为会话组长,并脱离控制终端。

1
setid();

改变工作目录

将工作目录改为根目录,以避免占用可卸载文件系统。

1
chdir('/');

重设文件权限掩码

使用umask(0)重设文件权限掩码,以确保守护进程创建的文件具有预期的权限。

1
umask(0);

关闭文件描述符

关闭从父进程集成的文件描述符,以释放资源。

1
2
3
4
for (int i=sysconf(_SC_OPEN_MAX);i>=0;i++)
{
close(i);
}

重定向标准输入/输出/错误

将标准输入、输出、错误重定向到/dev/null,以避免守护进程与终端交互。

1
2
3
freopen("/dev/null", "r", stdin);
freopen("/dev/null", "w", stdout);
freopen("/dev/null", "w", stderr);
Prev:
信号相关函数