linux 与会话相关的一些概念、登录过程
1、进程组
进程组是一个或多个进程的集合。进程组由进程组ID(PGID)来唯一标识。每个进程组都有一个组长进程,进程组ID就是组长进程的进程号。
2、会话
是一个或多个进程组的集合。
一般一个用户登录后新建一个会话(打开终端),每个会话也有一个ID来标识(SID)。登录后的第一个进程叫做会话领头进程(session leader),通常是一个shell/bash,即一个shell程序。对于会话领头进程,其PID=SID。
为什么是一个用户登录后新建一个会话呢?
一般取去公司上班,我们见不到服务器真机,而是公司为每个员工分配一个 用户名和密码,我们可以通过远程进行登录。这个时候我们就登录到了一个终端,因此说一个用户登录后新建一个会话。
3、控制终端
- 一个会话一般会拥有一个控制终端用于执行IO操作。
- 会话的领头进程(一般是shell进程)打开一个终端之后, 该终端就成为该会话的控制终端。
- 与控制终端建立连接的会话领头进程也称为控制进程 (controlling process) 。一个会话只能有一个控制终端。
4、前台进程组
- 该进程组中的进程能够向终端设备进行读、写操作的进程组。
例如在终端中执行./a.out 这个程序就能通过向终端读写
5、 后台进程组
- 该进程组中的进程只能够向终端设备写。
例如$ ./a.out &
那么这个进程只能向终端打印内容,但是不能读取终端中的内容。
注意:每个会话有且只有一个前台进程组,但会有0个或者多个后台进程组。
6、 终端进程组ID
每个进程还有一个属性,终端进程组ID(TPGID),用来标识一个进程是否处于一个和终端相关的进程组中。前台进程组中的进程的TPGID=PGID,后台进程组的PGID≠TPGID(d一般前台进程组ID等于终端ID,而后台进程组ID不等于终端ID)。若该进程和任何终端无关,其值为-1。通过比较他们来判断一个进程是属于前台进程组,还是后台进程组。
7、创建一个会话(打开一个登录shell)
- 登录时第一个创建的进程是shell(/bin/bash),也就是会话的领头进程。
- 该领头进程 缺省的 处于一个前台进程组中,并打开一个终端设备,等待数据的读写(命令、程序执行)。
- 当在shell里运行一行命令后(不带&)创建一个新的进程组,命令行中如果有多个命令会创建多个进程,这些进程都处于该新建进程组中,shell将该新建的进程组设置为前台进程组并将自己暂时设置为后台进程组。(如下图的两个箭头。)
该图说明,shell也只是一个程序,称为命令行解释器。用来解读终端发送给操作系统的命令。打开一个终端后,会首先启动一个shell进程。并且该终端会与这个shell进程关联起来。shell解读终端传输的命令,发送给操作系统,然后调用相关的系统调用,然后将结果再传递到终端上。
8、登录过程
- 通过终端用户登录后,会创建一个会话
- 启动第一个进程,即shell进程,也就是这个会话的领头进程,也是会话的控制进程。
- 在终端没有输入命令(执行程序)的时候,shell暂时处于前台进程组。
- 当有命令输入时,shell进程将会被置为后台进程组,然后将执行的命令的进程置为前台进程组。
- 当终端再次没有输入时(没有通过运行程序时),shell再被置为前台进程组。
9、实验验证
(1)实验步骤:
1)在终端中执行下述命令
2)重新开启一个终端,执行: ps -ajx
命令
3)观察第一个终端中两个进程的进程状态,结果如下图:
4)在第一个终端中按ctrl+z 再次观察结果
通过第一个实验结果可以看出:
(2)观察行号232行233行:
- 两个进程的PGID相同,说明两个进程属于同一个进程组。
- 两个进程的PGID 与第一个进程的PID相等,说明 第一个进程是该进程组的组长
- 二者的TPGID和PGID不相同,说明二者属于后台进程组。
(3)观察行号236行237行:
- 两个进程的PGID相同,说明两个进程属于同一个进程组。
- 两个进程的PGID 与第一个进程的PID相等,说明 第一个进程是该进程组的组长
- 二者的TPGID和PGID相同,说明二者属于前台进程组。
(4)同时观察观察前232 233 236 237行
- 四PPID相同,即四者的父进程ID相同,为29005,查看231
行可以发现,29005为bash的ID。即打开终端后运行的第一个进程为bash进程。 - 四个进程的SID相等,说明四个进程同属于一个会话。
- 四者的tty相同,说明二者属于同一个控制终端。
(5)通过第2个实验结果可以看出
- 前台运行的进程消失了,说明ctrl +z 只对前台进程起作用
- bash成为了新的前台进程组,说明在输入缺省状态下,shell为前台进程组。而当执行命令后,shell被置为后台进程组,执行的进程被设置为前台。