进程组(Process Groups)
-
定义:
进程组是一个或多个进程的集合,这些进程通常与同一作业或应用程序相关联。每个进程组都有一个唯一的进程组ID(PGID)。 -
组长(Group Leader):
创建进程组的进程被称为组长。组长的进程ID(PID)通常与进程组ID(PGID)相同。 -
层次结构:
进程组是介于单个进程和会话(session)之间的一个组织层次。
进程组作用
-
信号处理:
- 允许向整个进程组发送信号,而不是单独向每个进程发送。
- 例如,当你在终端按下Ctrl+C时,SIGINT信号会发送给前台进程组中的所有进程。
-
作业控制:
- 在shell中,每个管道命令通常在一个新的进程组中运行。
- 这允许shell同时管理多个作业,并控制它们的执行(前台/后台)。
-
资源管理:
- 进程组可以用于系统资源的分配和限制。
- 某些系统调用(如setpgid())允许进程加入特定的进程组。
-
终端控制:
- 只有一个进程组可以与终端关联(称为前台进程组)。
- 这决定了哪些进程可以直接从终端读取输入。
-
进程生命周期管理:
- 当一个进程组的组长终止时,内核可能会向该组的其他成员发送SIGHUP信号。
- 这有助于清理相关的进程,确保资源被正确释放。
应用demo
-
Shell作业控制:
command1 | command2 | command3 &
该管道命令会创建一个新的进程组,包含三个进程,并在后台运行。
-
C语言进程组操作:
#include <unistd.h> pid_t getpgrp(void); // 获取当前进程的进程组ID int setpgid(pid_t pid, pid_t pgid); // 设置指定进程的进程组ID
-
会话和进程组:
守护进程通常创建新的会话和进程组,以脱离控制终端:pid_t sid = setsid();
作用
- 进程管理: 简化了多进程应用程序的管理。
- 系统设计: 为操作系统提供了一种组织和控制相关进程的方法。
- 用户界面: 使shell能够提供作业控制功能,增强用户体验。