1:进程组
1.1与同意作业关联的一个或者多个进程的集合称为进程组,可以接收来自同一终端的各种信号。可以用getpgrp(),来或者进程的进程组ID。
1.2组长进程
每个进程组都有一个组长进程,其标志是进程ID等于进程组ID,组长进程可以创建一个进程组,创建该组中的进程,然后终止。但组长进程终止,并不意味着进程组的终止。
1.3生存周期
进程组创建到组中最后一个进程结束。
1.4创建或者加入进程组
#include <unistd.h>
setpgid(pid_t pid, pid_t pgid);
一个进程只能为它自己或者它的子进程设置进程组ID,并且在他的子进程调用了exec函数之后,它也不能再更改这个子进程的进程组ID。
1.5shell中fork之后,通常在父进程中设置子进程的进程组ID,而在子进程中也设置自己的进程组ID,原因是避免因为父子进程的执行先后不确定,而导致一段时间内子进程的组成员身份不确定。
2:会话
1:一个或者多个进程组的集合,称为会话。
2:创建会话
#include <unistd.h>
pid_t setsid(void);
3:控制终端
1)一个会话只有一个控制终端(controlling terminal)
2)建立与控制连接连接的会话首进程称为控制进程(conrolling process)
3)一个会话(有控制终端的会话)包括一个前台进程组和一个或者多个后台进程组
4)无论何时键入终端中断键(Ctrl+C / Del),都会将中断信号发送前台进程组的所有进程
5)无论何时键入终端退出键(Ctrl+\),都会将退出信号发送给前台进程组的所有进程
6)如果终端接口检测到调制解调器(或网络)断开了连接,则将挂断信号发送给控制进程(会话首进程)