进程组, 也称为作业(job),进程组是一个或多个进程的集合
所以每个进程除了有一个进程ID(PID)、父进程ID(PPID)之外,还有一个进程组ID(PGID),PGID用于标识该进程属于哪一个组。所以两个进程的PGID相同,标识它们俩在同一个进程组中
进程组注意事项:
1.每个进程组必定属于某一个进程组,并且只能在一个进程组中
2.每个进程组都有一个组长进程,组长进程的进程ID(PID)就等于该进程组的进程组ID(PGID)
3.只要进程组中还存在至少一个进程,那么该进程组就存在,这与其组长进程是否终止无关,组长进程终止并不能导致进程组终止
4.一个进程组可以包含一个或多个进程,进程组的生命周期从创建开始,直到组内所有进程终止或离开该进程组
5.默认情况下,新创建的进程会继承父进程的进程组ID(PGID),子进程与父进程在同一个进程组中
⚫ 每个进程必定属于某一个进程组、且只能属于一个进程组;
⚫ 每一个进程组有一个组长进程,组长进程的 ID 就等于进程组 ID;
⚫ 在组长进程的 ID 前面加上一个负号即是操作进程组;
⚫ 组长进程不能再创建新的进程组;
⚫ 只要进程组中还存在一个进程,则该进程组就存在,这与其组长进程是否终止无关;
⚫ 一个进程组可以包含一个或多个进程,进程组的生命周期从被创建开始,到其内所有进程终止或离
开该进程组;
⚫ 默认情况下,新创建的进程会继承父进程的进程组 ID。
通过getpgrp()或getpgid()函数可以获取进程的进程组ID(PGID)
getpgid() | #include <unistd.h> pid_t getpgid(pid_t pid); pid_t getpgrp(void); | 获取对应的进程组ID |
通过setpgid()或setpgrp()函数可以修改进程所属的进程组(也就是修改进程的PGID)
setpgid() | #include <unistd.h> int setpgid(pid_t pid, pid_t pgid); int setpgrp(void); | 加入一个现有的进程组或创建一个新的进程组 将参数 pid 指定的进程的进程组 ID 设置为参数 gpid |
setpgid(0, pgid) == setpgid(getpgrp(), pgid)
setpgid(pid, 0) == setpgid(pid, pid)
setpgid(0, 0) == setpgid(getpgrp(), getpgrp());
一个进程只能修改它自己或者它的子进程所属的进程组,并且子进程在调用exec之后就不能再修改子进程