进程组与会话组

简介: 进程组与会话组

Linux 系统中,进程是以的形式(进程之间的层次关系)进行管理的,如进程组会话组,进程组是一组相关进程的集合,会话组是一组相关进程组或进程的集合。


进程组ID 的类型与 进程ID 一样。一个进程组有一个进程组首进程,也可称之为该进程组的组长其进程ID为该进程组的ID。一个会话组有一个会话组首进程,也可称之为会话组组长其进程ID为该会话组的ID,进程的会话成员关系是由会话组IDSID )确定的。


下图为会话组、进程组与进程的关系。其中PID为进程ID,PPID为父进程(该进程的父亲进程)的ID,PGID(Process Group ID)为进程组ID,SID(Session ID)为会话组ID。

微信截图_20221209151158.png


上图中会话组的ID为 400 ,会话组中存在三个进程组,组ID分别为 400658660 。其中进程组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,如果参数 pid0 ,则返回调用进程所属的进程组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。如果参数 pid0 ,则返回调用进程所属的会话组ID。

#include <unistd.h>
pid_t getsid(pid_t pid);点击复制复制失败已复制


使用 setsid() 函数会创建一个新会话,其前提调用进程不能是进程组组长

#include <unistd.h>
pid_t setsid(void);点击复制复制失败已复制


调用该函数成功后,该调用进程成为新的会话组的组长,在会话组中创建新的进程组并担任组长,同时脱离终端的控制,运行在后台。该进程成为新会话组和进程组中唯一的进程。

目录
相关文章
|
3月前
进程的创建
进程的创建
|
5月前
|
监控
用c实现进程监控,如果某一进程退出则重启
用c实现进程监控,如果某一进程退出则重启
40 0
|
5月前
|
调度
进程有哪几种状态
进程有哪几种状态
|
5月前
|
Linux Shell 网络安全
Linux系统编程(会话和进程)
Linux系统编程(会话和进程)
76 0
|
PHP 数据安全/隐私保护 Web App开发
会话控制
会话控制指网站可以跟踪客户端与服务器之间的交互。 由于HTTP是一个无状态的协议,此协议无法来维护两个事务之间的联系 所谓无状态,指的是不会维护http请求数据,http请求是独立的,不持久的HTTP无法告诉我们这两个请求是来自同一个人。比如 登录跳到留言板等 所以需要使用会话控制。
1716 0