进程的关系

本文介绍了进程组和会话的概念及其在UNIX环境中的应用。包括进程组ID、会话ID的获取方法,如何通过系统API设置进程组及会话,以及会话与终端之间的关系等关键知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:结合《UNIX环境高级编程》的第9章一起看


进程组的概念

每一个进程除了有一个进程ID之外,还属于一个进程组,进程组通常是一个或多个进程的集合。这些进程通常是与一个作业相关的。例如:ps axu|grep bash|wc -l 这是三个进程,他们直接通过管道传递数据,为了是完成一个作业,对于这个整体来说是一个进程组,其中ps进程是进程组的组长进程。进程组也是由一个id来标识进程组的,通过使用PGID来标识,然而这个PGID==进程组组长进程的PID的使用下面的这个命令来验证这一事实:



#include <unistd.h>
pid_t getprep(void);

                                                    返回值:调用进程的进程组PID                

相关的系统API

下面这两个方法是用来设置和获取进程组的方法

进程调用setpgid可以加入一个现有的进程组或者创建一个新进程组。P234

下面是一个测试的例子,在这个例子显示出一个只有单个进程的进程组

可以看出正常情况下,直接运行的进程通常是一个新进程组的组长进程,与这个进程又通信的,或者是这个进程派生的都属于这个进程组.

会话的概念

会话就是一些有关联的进程组的集合而已.概念上来说其实不是很难理解 
下面是一个展示会话其含义的例子:


相信通过上面的这个例子,你应该对会话有了一个新的概念了吧.

相关的系统API

用于设置和获取session id的API


一个错误使用setsid的例子


上面的例子会执行失败,其执行失败的原因在于执行这个程序后,这个程序是一个进程组的组长进程,组长进程是无法调用setsid的.下面的例子是一个正确使用setsid的例子:


上面的例子中通过在子进程中调用setsid成功创建了一个新的会话,和新的进程组,并且成为了新进程组的组长进程以及会话的领导进程组.子进程之所以可以成功创建会话是因为父进程是进程组的组长进程,子进程只是属于这个进程组中的一个进程而已,除此之外什么也不是,所以这个子进程具备setsid的使用条件.

会话和终端的关系

  • 一个会话可以有一个控制终端(controlling terminal)。

  • 建立与控制终端连接的会话首进程被称为控制进程(controlling process)。

  • 一个会话中的几个进程组可被分成一个前台进程组(forkground process group)和几个后台进程组(background process group)。

  • 如果一个会话有一个控制终端,则它有一个前台进程组。

  • 无论何时键入终端的中断键(DELETE或Ctrl+C),就会将中断信号发送给前台进程组的所有进程。

  • 无论何时键入终端的退出键(Ctrl+),就会将退出信号发送给前台进程组的所有进程。

  • 如果终端检测到调制解调器(或网络)已经断开连接,则将挂断信号发送给控制进程(会话首进程)。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值