一:会话
会话是一个或者多个进程组的集合,如下图中一个会话有三个进程组:
会话中的进程组通常是由shell中的管道(|)进行连接的,比如上图的安排可能是有如下命令形成的:p1 | p2 & p3 | p4 | p5,进程调用setsid函数可以建立一个新会话。
如果调用这个函数的进程不是一个进程组的组长,那么将会发生以下三件事情:
1.该进程变成新会话的会话首进程,并且该进程是新会话中的唯一进程
2.该进程成为进程组的组长进程,并且进程组的ID就是该进程的ID
3.该进程组没有控制中断,如果在调用这个函数之前有,那么这种联系也会被切断
如果改进程已经是一个进程组的组长进程,那么这个函数就会返回出错。
二:控制终端
会话和进程组还有一些其他特性
1.一个会话可以有一个控制终端,这通常是终端设备或者伪终端设备
2.建立与控制终端连接的会话首进程被成为控制进程
3.一个会话的几个进程组可以被分为一个前台进程组和一个或者多个后台进程组
4.如果一个会话有一个控制终端,则他有一个前台进程组,其他都是后台进程组
5.无论何时发送中断信号,都会把信号发送给前台进程组的所有进程
6.无论何时发送退出信号,都会把信号发送给前台进程组的所有进程
7.如果终端接口已经检测到调制解调器已经断开连接,则将挂断信号发送至控制进程
这些特性如下图所示:
一般情况下登陆的时候会自动建立控制终端
三:作业控制
作业控制的含义是允许在一个终端上启动多个进程组,他控制哪一个作业可以访问该终端以及哪些作业在后台运行,他要求以下三种形式的支持:
1.支持作业控制的shell
2.内核中的中断驱动程序必须支持作业控制
3.内核必须提供对某些作业控制信号的支持
四:孤儿进程组
一个父进程已经终止的进程为孤儿进程,他将会交由init控制,进程组也可以成为孤儿。
孤儿进程组的定义是:该进程组的每个成员的父进程要么是该组的成员,要么在其它会话中。这里我找到了其他老哥画的图来更好的帮助我们理解孤儿进程组的含义:
(图片来自博客https://blog.youkuaiyun.com/q1007729991/article/details/57413719)
可以看到对于会话2中的进程组2来说,他的所有进程的父进程都在本进程中,只有一个进程的父进程不在会话2中,但是他在会话1中,所以他已经是一个孤儿进程组。
08-05
749

05-31
05-31