守护进程
守护进程(Daemon Process)
,也就是通常说的 Daemon 进程(精灵进程),是 Linux 中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。
会话
会话: 多个进程组的集合
- 一个会话中最少得有一个进程
- 会话的特点: 脱离当前的操作终端, 程序执行过程中不阻塞终端
创建守护进程的前提条件:
将一个进程变成会话
, 就会得到一个守护进程
-
创建相关会话函数
// 获取进程所属的会话ID #include <unistd.h> pid_t getsid(pid_t pid); // 将进程变成会话 // 脱离当前的操作终端, 程序执行过程中不阻塞终端 pid_t setsid(void);
-
创建会话注意事项
1. 没有任何职务的进程才可以被提升为会话, 必须是普通进程 2. 一般写程序的时候, 启动的当前进程有可能是进程组的组长, 因此需要让当前进程创建子进程, 将子进程变成会话, 这时候父进程就没有价值了, 干掉他 3. 将子进程变成会话的时候, 在某些linux操作系统中是需要管理员权限的, ubuntu中不需要做任务事儿
创建守护进程的步骤
1. 创建子进程, 将父进程退出, 子进程中调用 setsid() 变成会话 -> 必须要做的
2. 修改可执行程序的工作目录 -> 可选项
- 可执行程序在哪个目录下启动, 工作目录就是当前这个路径
- 可执行程序的工作目录是一个U盘的路径, 如果U盘被拔掉这个路径就没有了
- 切换到一个不能被卸载的路径下
- 修改方式: int chdir(const char *path);
chdir("/home");
3. 修改掩码 (umask), 去掉某些(u/g/o)用户对文件的某些操作权限 -> 可选项
mode_t umask(mode_t mask);
// 在当前进程中创建新文件: 文件所有者没有写权限, 所属组用户没有写and执行, 其他人没有读权限
umask(0234);
4. 关闭/重定向文件描述符 -> 一般这步需要做的, 必选项
- 是哪些文件描述符: 标准输入, 标准输出, 标准错误
close(0);
close(1);
close(2);
- 不关闭文件描述符, 将输入/输出重定向
- 在linux中有一个设备文件, 这个文件相当于一个垃圾桶
/dev/null -> 这是一个设备文件
- 重定向: dup2(old, new);
int fd = open("/dev/null", O_RDWR);
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
5. 核心的操作: 周期性的执行某个操作