什么是守护进程
一种在后台运行的特殊进程,独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
守护进程通常在系统开始时运行,在系统关闭时才结束。
特征
- 生存期长: 通常在系统启动时创建, 系统关闭时才结束。
- 在后台运行: 没有控制终端, 不与用户直接交互。
- 脱离控制终端: 不受终端登出、关闭等操作的影响。
- 通常以超级用户(root) 权限运行。
- 周期性执行任务或等待响应某些事件。
守护进程的创建步骤
-
创建子进程(
fork()),父进程退出 。 (让子进程成为孤儿进程,被init进程(PID为1的进程)收养。jspid_t pid = fork(); if(pid < 0) { exit(EXIT_FAILURE); }else if(pid > 0){ exit(EXIT_SUCCESS); } -
在子进程中创建新会话。使用
setsid()函数创建新会话,使子进程成为新会话的首进程。可以确保进程不再与原来的控制终端相关联。jsif(setsid() < 0){ exit(EXIT_FAILURE); }关于
setsid()的用法:- 创建一个新的会话,并设置该进程的会话ID为新的会话ID。
- 使调用进程成为新会话的会话领头进程,并且脱离任何之前的会话和进程组。
- 创建一个新的进程组,其中调用进程是新进程组的领头进程。
- 通常,新会话的标准输入、输出和错误输出会被重定向到/dev/null,但这不是setsid命令的内置行为,需要用户通过重定向操作来实现。
原文链接:https://blog.csdn.net/bianchengxiaoma/article/details/140272326
-
改变当前工作目录。通常将工作目录改为根目录,以避免占用可能被卸载的文件系统。
jsif(chdir("/") < 0){ exit(EXIT_FAILURE); } -
重设文件权限掩码
jsumask(0) -
关闭打开的文件描述符。 关闭所有从父进程即成的打开的文件描述符,包括标准输入、标准输出和标准错误。
jsfor ( int i = 0; i < MAXFD; i ++){ close(i);
守护进程的应用场景
- 系统日志(syslogd): 记录系统事件和应用程序日志。
- 网络服务(httpd, sshd): 提供 Web 服务、远程登录等功能。
- 定时任务(crond): 定期执行预定的任务。
- 打印服务(cupsd): 管理打印任务和打印机。
- 数据库服务(mysqld):管理数据库的运行和数据存取。
- 设备管理(udevd): 动态管理/dev 目录下的设备文件。
- 名称解析(named): 提供 DNS 服务。