Linux
系统中,进程是以组的形式(进程之间的层次关系)进行管理的,如进程组和会话组,进程组是一组相关进程的集合,会话组是一组相关进程组或进程的集合。
进程组ID
的类型与 进程ID
一样。一个进程组有一个进程组首进程,也可称之为该进程组的组长,其进程ID为该进程组的ID。一个会话组有一个会话组首进程,也可称之为会话组组长。其进程ID为该会话组的ID,进程的会话成员关系是由会话组ID( SID
)确定的。
下图为会话组、进程组与进程的关系。其中PID为进程ID,PPID为父进程(该进程的父亲进程)的ID,PGID(Process Group ID)为进程组ID,SID(Session ID)为会话组ID。
上图中会话组的ID为 400
,会话组中存在三个进程组,组ID分别为 400
、 658
、 660
。其中进程组ID为 400
的组中只有一个进程,该进程的ID为 400
。由此可以很明显地看出,进程号为 400
的进程即是进程组的组长,同样也是会话组的组长。进程号为 400
的进程同时也是整个会话组中其他进程的父进程。进程与父进程不一定在同一进程组。
进程组
每个进程都有一个用数字表示的进程组ID,表示该进程所属的进程组。获取一个进程组的ID可以通过 getpgrp()
函数与 getpgid()
函数获得一个进程的进程组ID。
#include <unistd.h> pid_t getpgid(pid_t pid); pid_t getpgrp(void); /* POSIX.1 version */ pid_t getpgrp(pid_t pid); /* BSD version */点击复制复制失败已复制
其中, getpgid()
函数返回进程号为参数 pid
的进程所属的进程组ID,如果参数 pid
为 0
,则返回调用进程所属的进程组ID。 getpgrp()
函数有两个版本:其中 POSIX
标准的 getpgrp()
函数用于返回调用进程所属的进程组ID, BSD
版本的 getpgrp()
函数则返回进程号为参数pid的进程所属的进程组ID。
下面三个函数可以用来设置(修改)进程组ID。
#include <unistd.h> int setpgid(pid_t pid, pid_t pgid); int setpgrp(void); /* System V version */ int setpgrp(pid_t pid, pid_t pgid); /* BSD version */点击复制复制失败已复制
其中, setpgid()
函数将进程号为参数pid的进程所属的进程组ID修改为参数 pgid
所表示的值。如果 pid
的值设置为 0
,那么调用进程的进程组ID就会被修改。如果 pgid
的值设置为 0
,那么进程号为 pid
的进程所属的进程组的ID会被设置成 pid
(进程号为参数 pid
的进程成为组长)。
System V
版本的 setpgrp()
函数用于修改调用进程所属进程组的ID为调用进程的ID(调用进程成为组长); BSD
版本的 setgprp()
函数与 setgid()
函数功能一致。
会话组
会话组是一组进程组或进程的集合。 getsid()
函数用于获得进程号为参数 pid
的进程所属的会话组的组ID。如果参数 pid
为 0
,则返回调用进程所属的会话组ID。
#include <unistd.h> pid_t getsid(pid_t pid);点击复制复制失败已复制
使用 setsid()
函数会创建一个新会话,其前提是调用进程不能是进程组组长。
#include <unistd.h> pid_t setsid(void);点击复制复制失败已复制
调用该函数成功后,该调用进程成为新的会话组的组长,在会话组中创建新的进程组并担任组长,同时脱离终端的控制,运行在后台。该进程成为新会话组和进程组中唯一的进程。