一、终端的概念
在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),进程中,控制终端是保存在PCB中的信息,而fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。

默认情况下(没有重定向),每个进程的标准输入、标准输出和标准错误输出都指向控制终端,进程从标准输入读也就是读用户的键盘输入,进程往标准输出或标准错误输出写也就是输出到显示器上。

信号中还讲过,在控制终端输入一些特殊的控制键可以给前台进程发信号,例如Ctrl+C表示SIGINT,Ctrl+\表示SIGQUIT。

二、进程组概念
1、进程组概述
进程组,也称之为作业。BSD于1980年前后向Unix中增加的一个新特性。代表一个或多个进程的集合。

每个进程都属于一个进程组。在waitpid函数和kill函数的参数中都曾使用到。操作系统设计的进程组的概念,是为了简化对多个进程的管理。

当父进程,创建子进程的时候,默认子进程与父进程属于同一进程组。进程组ID为第一个进程ID(组长进程)。所以,组长进程标识:其进程组ID为其进程ID

可以使用kill -SIGKILL -进程组ID(负的)来将整个进程组内的进程全部杀死:

三、会话
1、会话概念
会话是一个或多个进程组的集合。

一个会话可以有一个控制终端。这通常是终端设备或伪终端设备;
建立与控制终端连接的会话首进程被称为控制进程;
一个会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组;
如果一个会话有一个控制终端,则它有一个前台进程组,其它进程组为后台进程组;
如果终端接口检测到断开连接,则将挂断信号发送至控制进程(会话首进程)。

2、创建会话注意事项

  1. 调用进程不能是进程组组长,该进程变成新会话首进程(session header)
  2. 该调用进程是组长进程,则出错返回
  3. 该进程成为一个新进程组的组长进程
  4. 需有root权限(ubuntu不需要)
  5. 新会话丢弃原有的控制终端,该会话没有控制终端
  6. 建立新会话时,先调用fork, 父进程终止,子进程调用setsid