基本概念
- 进程组:是一组相关进程的集合,共享同一进程组标识符(PGID)
- 进程组首进程:该进程是创建该组的进程,其进程 ID 为该进程组的 ID
- 新进程会继承其父进程所属的进程组 ID
- 生命周期:其开始时间为首进程创建组的时刻,结束时间为最后一个 成员进程退出组的时刻
- 会话:是一组相关进程组的集合。
- 会话首进程是创建该新会话的进程,其进程 ID 会成为会话 ID
- 新进程会继承其父进程的会话 ID
- 任一时刻,会话中的其中一个进程组会成为终端的前台进程组,其他进程组会成为 后台进程组。只有前台进程组中的进程才能从控制终端中读取输入。
系统调用
◼ 进程组:pid_t getpgrp(void);
◼ 进程组:pid_t getpgid(pid_t pid);
◼ 进程组:int setpgid(pid_t pid, pid_t pgid);
◼ 会话:pid_t getsid(pid_t pid);
◼ 会话:pid_t setsid(void);
守护进程(Daemon 进程、精灵进程)
- Linux 后台服务进程
- 生命周期很长:守护进程会在系统启动的时候被创建并一直运行直至系统被关闭
- 它在后台运行并且不拥有控制终端
- Linux 的大多数服务器就是用守护进程实现的。
- Internet 服务器 inetd
- Web 服务器 httpd
- ssh 协议 sshd
守护进程的创建步骤
- 执行一个
fork(),之后父进程退出,子进程继续执行。- 确保子进程不会成为进程组的首进程。
- 子进程调用
setsid()开启一个新会话。- 目的:脱离控制终端。创建新会话没有控制终端。
- 清除进程的 umask 以确保当守护进程创建文件和目录时拥有所需的权限。
- 非必需。
- 修改进程的当前工作目录,通常会改为根目录(/)。
- 非必需。
- 关闭守护进程从其父进程继承而来的所有打开着的文件描述符。
- 非必需。
- 在关闭了文件描述符0、1、2之后,守护进程通常会打开/dev/null 并使用dup2() 使所有这些描述符指向这个设备。
- 非必需。
- 核心业务逻辑