进程组与会话 Linux Process Groups and Sessions

在类Unix系统中,用户通常会跟各种相关的进程打交道。虽然在登录的时候只有一个终端进程(用户对应的登录shell ,通过这个shell启动各种程序和服务),但通常不久以后就会产生许多相关的进程,例如进行如下动作:

  • 在后台运行无交互的程序(例如bash命令中末位的"&")
  • 通过shell的 job control在各种交互进程之间切换
  • 通过管道启动一组程序
  • 在图形环境下(例如X window system)启用多个终端窗口

为了管理这些进程,内核便对这些进程进行了分组,称其为进程组,几个进程组又构成一个会话。例如下图所示,ls和less在一个进程组里,而grep和wc在一个进程组里。这两个进程组又同属于一个会话。

1072319-20171222203140209-1473567681.jpg

下面具体讲一讲进程组和会话。


1.1 进程组

每一个进程都属于一个“进程组”,当一个进程被创建的时候,它默认是其父进程所在组的成员。传统上,一个进程的组ID(pgid)等于这个组的第一个成员(也称为进程组领导)。

可以使用ps j这个命令获取进程的PPID (父进程ID), PID (本进程 ID), PGID (进程组 ID) and SID (会话 ID)。

frank@under:~$ ps j
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
24120 24125 24125 24125 pts/5    24125 Ss+   1000   0:00 bash
24120 30633 30633 30633 pts/6    31468 Ss    1000   0:00 bash
30633 31468 31468 30633 pts/6    31468 R+    1000   0:00 ps j

当使用不具有工作管理(job control)的shell时(例如ash ),每一个shell创建的子进程都会和shell在同一个进程组和会话里。当使用具有工作管理的shell时(例如bash ),如果使用管道(参考:Pipes: A Brief Introduction), 那么这些管道连接起来的进程单独组成一个进程组,和shell在一个会话中。例如:

% cat paper | ideal | pic | tbl | eqn | ditroff > out

这几个程序运行后的进程都在一个进程组里面。

前台进程组

每一个会话最多有一个进程组是“前台进程组”,控制终端(下面的第二部分会讲)会将输入和信号 传给该进程组的成员(例如你在终端按下Ctrl+C就会向前台进程组发送SIGINT信号)。进程可以通过系统调用 tcgetpgrp(fd)获取所在会话的前台进程组ID,其中fd对应会话的控制终端的文件描述符;也可以通过tcsetpgrp(fd,pgrp)设置所在会话的前台进程组,其中fd对应会话的控制终端的文件描述符, pgrp是这个会话中的一个进程组。

那么如何得到fd呢? ctermid() 调用会返回控制终端的名字,在符合 POSIX标准的系统上,它会返回 /dev/tty 这个文件,然后我们就可以用系统调用open()打开这个文件从而得到文件描述符了。

后台进程组

在一个会话中,除前台进程组外的进程组都称为“后台进程组”,这些后台进程组的进程不参与终端的输入输出,如果它们尝试从终端读取数据,会收到SIGTTIN信号(其默认操作是Stop),同时终端会通知用户:

SIGTTIN   21,21,26    Stop    Terminal input for background process

但是如果后台进程忽略或者blockSIGTTIN信号了,或者它所在的进程组是一个“孤儿进程组”(下面有讲),那么读取终端就会得到一个EIO(error in operation)错误而非收到SIGTTIN信号。当后台进程尝试向终端写操作时,它可能会受到SIGTTOU信号:

SIGTTOU   22,22,27    Stop    Terminal output for background process

同样地,如果后台进程忽略或者blockSIGTTOU信号了,或者它所在的进程组是一个“孤儿进程组”,那么读取终端就会得到一个EIO(error in operation)错误而非收到SIGTTOU信号。

为了让后台进程加入前台进程组,可以使用fg命令。

相应操作

可以通过系统调用 setpgid()将进程加入到另一个进程组中:

int setpgid(pid_t pid, pid_t pgid);

其中pid是要操作的进程,0代表本进程;pgid是要加入的进程组,0代表要加入的进程组的pgid是这个进程的pid(也就是说,这个组的组领导就是这个进程)。

使用 setpgid() 要注意以下几点:

  1. 一个进程可能将pgid设置为自己或者它所在组的其他成员,这样的操作可能不会改变其他任意进程的进程组,即使这个进程有root权限。
  2. 会话头进程(第二部分会介绍)不能改变自己所在的进程组。
  3. 一个进程不能被加入到另一个会话中的进程组中,换句话说,setpgid只能在一个会话中使用。由于setpgid()只能将进程在本会话中“移动”,所以两个会话不可能有相同的进程组或者进程。

一个进程可以通过 getpgrp()系统调用获得自己所在组的ID,也可以通过 getpgid(p) 获得pid为p的进程所在组的组ID,当p为0时,获得本进程的组ID:

pid_t getpgid(pid_t pid)
pid_t getpgrp(void)

下面是一个简单的示例图:

1072319-20171222203155850-91828995.jpg


断开连接(我对于Linux下的终端、shell通信机制不了解,这个地方暂时贴上参考资料里的原文,以后懂了再翻译)

If the terminal goes away by modem hangup, and the line was not local, then a SIGHUP is sent to the session leader. Any further reads from the gone terminal return EOF. (Or possibly -1 with errno set to EIO.)

If the terminal is the slave side of a pseudotty, and the master side is closed (for the last time), then a SIGHUP is sent to the foreground process group of the slave side.

When the session leader dies, a SIGHUP is sent to all processes in the foreground process group. Moreover, the terminal stops being the controlling terminal of this session (so that it can become the controlling terminal of another session).

Thus, if the terminal goes away and the session leader is a job control shell, then it can handle things for its descendants, e.g. by sending them again a SIGHUP. If on the other hand the session leader is an innocent process that does not catch SIGHUP, it will die, and all foreground processes get a SIGHUP.


1.2 孤儿进程组

现在我们来讨论当会话消失的时候进程是如何终止的。

假设有一个在终端下运行的会话,其会话头是一个shell。当这个shell存在时,会话中的进程组处于不同的环境中,可能在运行,也可能被挂起了。当终端关闭时,如果它正在运行,当终端关闭后它就无法读入或者输出了;如果它被挂起了,则它可能永远不会被唤醒(也不会终止)。在这种情况下,原会话的进程组就被称为“孤儿进程组”。POSIX定义为该进程组的父进程也是该进程组的成员或者是别的会话的成员。总之,只要一个进程组的父进程在同一会话的不同组中,它就不是孤儿进程组。

当一个进程组成为孤儿进程组之后,在这个进程组中的每一个进程都会被发送一个SIGHUP信号——通常进程将会被正常关闭。对于收到SIGHUP信号后,选择不终止的程序将会被发送一个SIGCONT,这个信号将会重启任何被挂起的进程。这个信号流程能够关闭大多数的进程并保证剩下的是正在运行的进程(不被挂起)。

当进程被“遗弃”后,它被强制和控制终端分离(其他的用户便可以使用这个终端)。原来的会话ID继续被保留(不作为新生进程的PID)直到每一个会话中的程序退出。


2.1 会话

当一个用户注销的时候,内核会终止用户之前启动的所有进程(不然这些进程会在那一直运行并等待输入的到来)。为了简化这个任务,内核将几个进程组并为一个“会话”。会话的ID就是通过setsid()启动这个会话的进程的PID (也就是这个会话的第一个进程,通常是用户的shell),这个进程也称为“会话头”,它随后产生的所有子孙进程都默认在这个会话里。

进程也可以使用setsid使自己离开自己的会话,其参数为空,返回新的会话的ID:

#include <unistd.h>

pid_t setsid(void);


2.2 控制终端

每一个会话有且仅有一个对应的终端,会话中的进程从这个终端得到输入并输出,该终端被称为“控制终端”(controlling terminal)。这个终端可能是机器本地的控制台、桌面环境的伪终端、网络上的伪终端等等。

虽然一个会话对应的控制终端是可以改变的,但这通常都是由初始化用户登录环境的那个进程设定的。




主要参考:

  1. The Process Model of Linux Application Development
  2. Processes (里面有关于进程和线程的简略介绍)
  3. 《深入理解计算机系统》第三版

转载于:https://www.cnblogs.com/liqiuhao/p/8087539.html

Process实操教程 | 中介效应检验 Process实操教程 | 中介效应检验1 Process 下载安装2 Process 做中介检验 Hello,大家好! 这里是行上行下,我是喵君姐姐~ 之前给大家介绍了如何用amos进行中介调节效应检验(Amos实操教程 | 中介效应检验 )。 今天我们给大家介绍下平常更常用的,也更简单的操作,如何使用spss中process插件进行中介效应检验。 Process的功能也很强大,它的下载也是免费开源的,在spss的官网就可以下载到。 官方网址:https://www.ibm.com/search?la 阅读详情

相关推荐

【信息科学与工程学】【数据中心】 第二十七篇 AI领域各类通讯模式01

类型业务特性数据要求数据Pipeline工作流程Pipeline应用场景限制条件机器学习​模式识别、预测分析、决策支持结构化数据、标注数据、特征工程数据采集 → 数据清洗 → 特征提取 → 特征选择 → 数据集划分问题定义 → 数据准备 → 模型选择 → 训练 → 评估 → 调优 → 部署推荐系统、风险评估、客户分群、销售预测依赖数据质量、过拟合风险、解释性差、需要持续更新深度学习​端到端学习、复杂模式提取、自动特征工程大规模数据、标注数据、图像/文本/语音数据增强 → 标准化 → 批处理 → 数据加载器架

weixin_49199313的博客 731

进程组与会话

进程组与会话 进程组 什么是进程组? 进程组:一组协同工作或关联进程的集合,每个进程组有ID(PGID) 每个进程属于一个进程组,每一个进程组有一个进程组长,该进程组长ID(PID)与进程组ID(PGID)相同 一个信号可以发送给进程组的所有进程、让所有进程终止、暂停或继续运行 会话 什么是会话? 会话是一个或多个进程组的集合 当用户登录系统时,登录进程会为这个用户创建一个新的会话(session) shell进程(如bash)作为会话的第一个进程,称为会话进程(session lea

Scroll_C的博客 694

ArcMap投影变换避坑指南:为什么你的坐标转换总出错?常见问题解析与解决方案

本文深入解析ArcMap中坐标转换与投影变换的核心区别与常见陷阱。针对坐标转换总出错的问题,从混淆“定义投影”与“投影变换”、栅格数据重采样选择、矢量数据地理变换参数设置等关键环节,提供清晰的避坑指南与实战解决方案,帮助用户确保空间数据的精确匹配。

weixin_29210727的博客 356

进程组和会话

进程组是若干个进程的集合,每个进程组都有一个组长,不管组长终止与否,只要有进程运行 进程组就存在,组长的pid就是getpgrp()。 会话是进程组的集合,包含多个进程组,但是只有一个前台进程组。 进程调用setsid可以建立新对话期,成功调用返回进程组id,出错返回-1,调用函数的进程如果不是组长, 则此函数创建一个新的会话期。 1.此进程称为新的会话的首进程,也是目前唯一一个进程。 ...

BJUT_bluecat的博客 786

Wider Face+YOLOV7人脸检测

使用Wider Face数据集训练YOLOV7

chen_znn的博客 8405

香橙派5B-RK3588-NPU内核升级至0.9.8:RKLLM多模态部署实战

本文详细介绍了香橙派5B-RK3588设备NPU内核升级至0.9.8版本的完整流程,重点讲解了升级的必要性、两种升级方案(预编译包安装与自行编译内核)以及RKLLM SDK的安装配置。通过实战演示多模态模型转换与推理,显著提升AI计算性能,为嵌入式AI部署提供实用指南。

salt9的博客 1024

第五章_进程 : 进程,进程组,会话关系

进程 进程是操作系统的一个核心概念。每个进程都有自己唯一的标识:进程ID,也有自己的生命周期。一个典型的进程的生命周期如图4-1所示。 进程都有父进程,父进程也有父进程,这就形成了一个以init进程为根的家族树。除此以外,进程还有其他层次关系:进程、进程组和会话。 进程组和会话在进程之间形成了两级的层次:进程组是一组相关进程的集合,会话是一组相关进程组的集合。 这样说来,一个进程会有如下ID: ·PID:进程的唯一标识。对于多线程的进程而言,所有线程调用getpid函数会返回相同的值。 ·PGID:进程组

matafeiyanll的博客 1412

Ceres&OpenCV 单目相机标定(论文复现)

Ceres&OpenCV 单目相机标定(论文复现)

dayuhaitang1的博客 366

深入理解Linux系统:进程组、会话、作业、控制终端与守护进程的关系解析

本文探讨了进程组、会话、控制终端和作业的基本概念及其相互关系。首先,介绍了进程组的定义和作用,接着解释了会话、控制终端和作业的概念,并分析了它们之间的联系。文章最后讨论了守护进程的功能及其在系统中的重要性。通过对这些概念的系统性讲解,读者可以更清晰地理解进程管理的机制和各组件的协作方式。

无敌岩雀的博客 2104

Qt QTableView排序

在开发过程中,我们需要通过点击表头来对QTableView或QTreeView等一系列高级视图进行排序操作,以下是进行排序的步骤。首先创建了一个QStandardItemModel对象或者继承QAbstractTableModel类作为数据模型,并设置了一些数据。然后创建一个QTableView对象,并将数据模型设置为其模型。接下来,创建一个QSortFilterProxyModel对象,并将QStandardItemModel对象设置为其源模型。然后设置QTableView开启排序功能。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 2643

《UDS协议从入门到精通》系列——图解0x14:清除诊断信息

图解0x14:清除诊断信息,简洁易懂,迅速上手!

车载系统攻城狮 4820

进程组、会话和作业控制(process groups, sessions, and job control)-Linux系统编程手册

进程组和会话 是为支持shell 作业控制而定义的抽象概念。 34.1 概述(overview) 进程组:由一个或多个 进程组成,它们有同样的进程组标识符(PGID)。进程组ID 是一个数字,其类型与进程ID 一样(pid_t)。一个进程组 拥有 一个 process group leader 进程 , 该进程是创建该组的进程,其进程ID为 该进程组的ID,新进程会继承其父进程 所属的进程组ID。 进程组拥有一个 生命周期(lifetime), 其开始时间为 leader进程 创建组的时刻, 结束..

u013862108的博客 937

【软考之软件设计师】学习笔记

interface 接口implements 实现接口(与接口配套使用)接口里要是有方法定义,子类就会实现。

云轩阁 2532

threads, processes, process groups and sessions

主要是相关知识的初步整理。 session > process group > process > thread ps j可以查看进程的PID,PPID,PGID,SID信息

烂笔头 660

[漏洞挖掘与防护] 03.漏洞利用之WinRAR安全缺陷复现(CVE-2018-20250)及软件自启动分析

上一篇文章将详细介绍MS08-067远程代码执行漏洞(CVE-2008-4250)及防御过程,它是Windows Server服务RPC请求缓冲区溢出漏洞,利用445端口,并通过Metasploit工具获取shell及进行深入的操作。这篇文章将详细讲解WinRAR漏洞(CVE-2018-20250),并复现了该漏洞和讲解了恶意软件自启动劫持原理。基础性文章,希望对入门的同学有帮助。

杨秀璋的专栏 1087

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Sessions and Process Groups

This chapter is from the book Linux Application Development, 2nd Edition  In Linux, as in other Unix systems, users normally interact with groups of related processes. Althou

fivedoumi的专栏 648

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

9-Process Relationships

Please indicate the source: http://blog.youkuaiyun.com/gaoxiangnumber1Welcome to my github: https://github.com/gaoxiangnumber19.1 Introduction9.2 Terminal LoginsBSD Terminal Logins The system administrator c

gaoxiangnumber1——Gao Xiang's Blog 1107

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

进程组 / 会话 (了解)

也称之为作业。代表一个或多个进程的集合。每个进程都属于一个进程组。当父进程,创建子进程的时候,默认子进程与父进程属于同一进程组。进程组ID==第一个进程ID(组长进程)。所以,组长进程标识:其进程组ID==其进程ID可以使用kill -SIGKILL -进程组ID(负的)来将整个进程组内的进程全部杀死。组长进程可以创建一个进程组,创建该进程组中的进程,然后终止。只要进程组中有一个进程存在,进程组就存在,与组长进程是否终止无关。进程组创建到最后一个进程离开(终止或转移到另一个进程组)。

weixin_43200943的博客 424

【操作系统】进程组Group|进程会话Session

🔥❤️一个进程组一般由一个组长和若干组员组成。终端进程被创建,默认就是进程组的组长进程(系统会分配一个进程组)。 组长进程的唯一标志:组id==进程id

代码兴国 862

Linux进程组、线程组、会话深度解析(更新中)

【代码】Linux进程组、线程组、会话深度解析(更新中)

peter_pan_study的博客 296

进程组、会话、守护进程和线程的概念

进程组和会话的概念、创建一个会话的注意事项以及如何fork一个子进程,并使其创建一个新会话、getsid和setsid函数、创建守护进程模型(守护进程的概念)、线程的概念(Linux内核线程实现原理)、线程共享的资源有哪些..........

caiji0169的博客 1558

linux多进程——进程组与会话、守护进程、信号通信

一、进程组与会话     进程组:是一个或多个进程的集合。可以调用 getpgid(0) 或 getpgrp() 来得到。进程组ID为组长的进程ID。只要进程组中有一个进程存在,进程组就存在,与组长进程是否终止无关。调用 setpgid() 加入一个现有的进程组或创建一个新

阿修罗道 5772

Linux 进程组,作业,会话的理解

1. 进程组 每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或多个进程的集合。通常,它们与同一作业相关联,可以接收来自同一终端的各种信号。每个进程组有一个唯一的进程组ID。每个进程组都可以有一个组长进程。组长进程的标识是,其进程组ID等于其进程ID。 组长进程

wangsifu2009的专栏 5535

进程间关系:进程组、作业、会话

进程组 之前我们在查看系统进程相关信息时,会看到每一个进程的ID和其父进程的ID等相关信息,其中就有一个PGID,代表的是组ID。什么是组ID呢?进程除了有自己的一个进程ID之外,每一个进程还属于一个进程组。而这其中的PGID就是组ID,指明了该进程是属于哪一个进程组。 那么什么是进程组呢?其实这个进程组就是一个或多个进程的集合。通常情况下,他们与同一个作业相关联,可以接收来自同一终端的各种信号

小心眼儿猫的博客 1617
上一篇: 并发与并行的区别 The differences between Concurrency and Parallel
下一篇: 深入理解计算机系统_3e 第八章家庭作业 CS:APP3e chapter 8 homework
a_18067
博客等级 码龄12年 25粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值