进程组
(1)什么是进程组?
进程组是一个或多个进程的集合。每个进程除了有一个进程ID之外,还属于一个进程组。
(2)进程组的特点:
每个进程组有一个唯一的进程组ID。每个进程组都可以有一个组长进程。组长进程的进程组ID等于其进程ID。进程组是否存在和有无组长无关。每个进程都是属于进程组的,没有独立的进程,除非该进程组中只有一个进程,则可以说这个进程是独立的。组长进程可以创建一个进程组,创建该组中的进程,然后终止。但是只要有一个进程存在,则这个进程组就存在,这与其组长进程是否终止无关。
通常,它们与同一作业相关联,可以接收来自同一终端的各种信号。
作业
Shell分前后台来控制的不是进程而是作业(Job)或者进程组(Process Group)。
(1)作业控制:
一个前台作业可以由多个进程组成,一个后台也可以由多个进程组成,Shell可以运行一个前台作业和任意多个后台作业,这称为作业控制。
(2)作业与进程组的区别:
如果作业中的某个进程又创建了子进程,则子进程不属于作业,但是该子进程属于其进程组。一旦作业运行结束,Shell就把自己提到前台,如果原来的前台进程还存在(如果这个子进程还没终止),它自动变为后台进程组。
会话
(1)什么是会话?
会话(Session)是由多个作业或者进程组构成,是一个或多个进程组的集合。一个会话可以有一个控制终端。这通常是登陆到其上的终端设备(在终端登陆情况下)或伪终端设备(在网络登陆情况下)。建立与控制终端连接的会话首进程被称为控制进程。
(2)会话的特点:
一个会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组。所以一个会话中,应该包括控制进程(会话首进程),一个前台进程组和任意后台进程组。
查看终端设备
每个进程都可以通过一个特殊的设备文件/dev/tty访问它的控制终端。事实上每个终端设备都对应一个不同的设备文件,/dev/tty提供了一个通用的接口,一个进程要访问它的控制终端,既可以通过/dev/tty也可以通过该终端设备所对应的设备文件来访问。ttyname函数可以由文件描述符查出对应的文件名,该文件描述符必须指向一个终端设备而不 能是任意文件。
下面我们通过实验看一下各种不同的终端所对应的设备文件名,查看终端对应的设备
终端1:
重新开一个终端:
再开一个终端: