守护进程
是一种在后台运行的特殊进程,通常用于执行系统任务或服务,不需要和用户交互。它在操作系统系董事运行,并在整个系统运行期间持续工作。
守护进程特点
①后台运行:守护进程在后台运行,不与任何终端关联,因此用户无法通过终端直接与其交互。
②独立于用户会话:守护进程通常与用户登录回话无关,即使所有用户注销,守护进程仍然继续运行。
③生命周期长:在系统启动时启动,在系统关闭时终止,生命周期与系统运行时间一致。
④无控制终端:守护进程没有控制终端,因此不会接受来自终端的信号(如SIGHUP)。
⑤通常以root权限运行:许多守护进程需要访问系统资源或执行特权操作,因此以root用户权限运行。
守护进程的用途
守护进程通常用于提供系统服务或执行后台任务,如系统服务、日志记录、任务调度、消息队列等
守护进程的创建步骤
创建子进程并退出父进程
使用fork()创建子进程,然后退出父进程,使其变成一个孤儿进程,并被init进程接管。1
2
3
4
5pid_t pid=fork();
if(pid>0)
{
exit(0); //退出父进程
}
创建新会话
使用setid()闯进新会话,是子进程成为会话组长,并脱离控制终端。
1 | setid(); |
改变工作目录
将工作目录改为根目录,以避免占用可卸载文件系统。1
chdir('/');
重设文件权限掩码
使用umask(0)重设文件权限掩码,以确保守护进程创建的文件具有预期的权限。
1 | umask(0); |
关闭文件描述符
关闭从父进程集成的文件描述符,以释放资源。
1 | for (int i=sysconf(_SC_OPEN_MAX);i>=0;i++) |
重定向标准输入/输出/错误
将标准输入、输出、错误重定向到/dev/null,以避免守护进程与终端交互。
1 | freopen("/dev/null", "r", stdin); |