守护进程
守护进程(Daemon Process),也就是通常说的 Daemon 进程(精灵进程),是 Linux 中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。
1. 进程组
多个进程的集合就是进程组, 这个组中必须有一个组长, 组长就是进程组中的第一个进程,组长以外的都是普通的成员,每个进程组都有一个唯一的组ID,进程组的ID和组长的PID是一样的。
进程组中的成员是可以转移的,如果当前进程组中的成员被转移到了其他的组,或者进制中的所有进程都退出了,那么这个进程组也就不存在了。如果进程组中组长死了, 但是当前进程组中有其他进程,这个进程组还是继续存在的。下面介绍几个常用的进程组函数:
得到当前进程所在的进程组的组ID
pid_t getpgrp(void);
获取指定的进程所在的进程组的组ID,参数 pid 就是指定的进程
pid_t getpgid(pid_t pid);
将某个进程移动到其他进程组中或者创建新的进程组
int setpgid(pid_t pid, pid_t pgid);
- 参数:
- pid: 某个进程的进程ID
- pgid: 某个进程组的组ID
- 如果pgid对应的进程组存在,pid对应的进程会移动到这个组中, pid != pgid
- 如果pgid对应的进程组不存在,会创建一个新的进程组, 因此要求 pid == pgid, 当前进程就是组长了
- 返回值:函数调用成功返回0,失败返回-1
2. 会话
会话(session)是由一个或多个进程组组成的,一个会话可以对应一个控制终端, 也可以没有。一个普通的进程可以调用 setsid()
函数使自己成为新 session 的领头进程(会长),并且这个 session 领头进程还会被放入到一个新的进程组中。先来看一下 setsid()
函数的原型:
#include <unistd.h>
// 获取某个进程所属的会话ID
pid_t getsid(pid_t pid);
// 将某个进程变成会话 =>> 得到一个守护进程
// 使用哪个进程调用这个函数, 这个进程就会变成一个会话
pid_t setsid(void);
使用这个函数的注意事项:
1.调用这个函数的进程不能是组长进程, 如果是该函数调用失败,如果保证这个函数能调用成功呢? - 先fork()创建子进程, 终止父进程, 让子进程调用这个函数 2.如果调用这个函数的进程不是进程组长, 会话创建成功 - 这个进程会变成当前会话中的第一个进程,同时也会变成新的进程组的组长 - 该函数调用成功之后, 当前进程就脱离了控制终端,因此不会阻塞终端
Continue reading