进程间关系与终端登录

来源:互联网 发布:tomcat启动 记录数据库 编辑:程序博客网 时间:2024/06/17 04:46

一、进程组
进程组:
每个进程除了有一个进程id之外,还属于一个进程组。进程组是一个或多个进程的集合,同一个进程组的进程的组ID相同,每一个进程组都有一个唯一的组ID。 每个进程组都有一个组长,组长的pid与gid相同。组长可以创建一个进程组,创建该组中的进程,然后终止。只要进程组内任意一个进程存在,那么这个进程组就存在,与组长进程是否终止无关。
这里写图片描述

二、作业
作业:
shell分前后台来控制的不是进程,而是作业或进程组。一个作业可以由多个进程组组成,shell可以运行一个前台作业和任意多个后台作业,这就称作作业控制
如果作业中的某个进程又创建了子进程,则子进程不属于作业,但是属于进程组。一但前台作业运行完之后,shell就把自己提到前台,如果前台的子进程还没终止,他就自动变成后台进程。
shell进程本身属于一个单独的进程组,同时他也是会话首进程(控制进程)。
作业控制的相关命令:
jobs:可以查看当前shell下的作业。
fg 作业号:可以将后台作业提到前台运行,同时因为只能有一个作业在前台运行,所以shell会到后台运行。
bg 作业号:将后台中stop的作业重新运行起来。
在后台单个执行一个程序:
这里写图片描述
多个进程的作业要用“|”连接起来,就是将几个进程集合在一起
这里写图片描述
三、会话
会话:
会话其实就是一个或多个进程的集合,但是会话和进程组的区别就是:会话中的进程fork出的子进程是属于进程组的二不是属于会话的。
一个会话有一个控制终端,简历与控制终端相连接的会话首进程叫做控制进程。一个会话当中分为一个前台进程组和多个后台进程组。内核通常发信号给前台进程组的所有进程。
会话的意义在于将多个工作囊括在一个终端,并且取其中的一个工作作为前台,来直接接受该终端的输入输出以及终端信号。其他的工作在后台运行。
只要会话中还有任意一个进程组(可以不是组长进程),那么这个会话就是存在的。
这里写图片描述

下面我我们来看一下进程间的关系:
多个进程可以构成进程组,多个进程组可以构成会话。一次只能有一个前台作业或进程组,和任意多个后台作业或进程组。
1、后台进程可以向前台写数据,但是不能从前台读数据。因为前台只有一个,所以写数据不存在二义性,而后台进程可以有多个,所以读的时候会产生二义性。后台进程要读数据的话会被stop。 (ssty tostop 可以通过这条命令,使得后台进程不能向前台写数据。)
2、用kill命令给一个已经停止的进程发送SIGTERM信号,这个信号不会被立即处理,而是要等进程准备运行之前处理,默认动作是终止进程。但是如果给一个停止的进程发SIGKILL信号就会被立即处理。
3、放到前台就是和当前终端建立关联,控制终端信息都在PCB中。只有会话首进程才能打开一个终端。

四、作业控制

这里写图片描述
“Shell可以同时运⾏行⼀一个前台进程和任意多个后台进程”其实是 不全⾯面的,现在我们来研究更 复杂的情况。事实上,Shell分前后台来控制的不是进程⽽而是作业 (Job)或者进程组(Process Group)。一个前台作业可以由多个进程组成,一个后台作业也可以 由多个进程组成,Shell可 以同时运⾏行一个前台作业和任意多个后台作业,这称为作业控制(Job Control)
这个代码就是不断从输入读取的数据并打印到屏幕
这里写图片描述
终端驱动程序知道该作业为一个后台作业。并且检测到该程序试图读取标准输入(控制终端)。所以就将SIGINT信号发送给该后台作业,shell检测到进程的状态改变并通知我们。
这里写图片描述
我们就会发现此作业无发正常运行。我们可以用fg命令通过作业号将改作业提到前台执行。(原理:将该作业转为前台进程组,并将继续信号(SIGCONT)发送给该进程组)。因为此时该作业在前台执行,所以它可以从标准输入读取数据。
五、终端及其终端登录
终端:
用户通过终端登录系统后得到一个shell进程,这个终端成为shell的控制终端,控制终端是保存在shell进程的PCB中的,因为fork会复制PCB中的信息,因此由shell进程启动的其他进程的控制终端也是这个终端。
这里写图片描述
每次打开一个终端,就会出现一个终端控制文件。我们可以根据终端控制文件来实现在不同终端的通信。
要想和另一终端通信,可以直接向另一个终端的设备文件中写。

终端的登录过程:
这里写图片描述
终端设备的输入输出缓冲队列:
这里写图片描述
1、当linux系统启动时,通常为创建一个ID为1的进程init,我们称之为1号进程。当要启动一个终端设备时,init会读取配置文件/etc/inittab确定需要打开哪些终端,每一个终端都对应配置文件的一行:

1:2345:respawn:/sbin/getty 9600 tty1

意思是init进程打开fork/exec命令,exec getty程序。
2、getty程序启动后,getty会对终端设备调用open函数,以读,写方式打开终端。(如果设备是调制解调器,则open可能会在设备驱动程序中滞留,直到用户拨号调制解调器,并且线路被接通)
当终端打开后,文件描述符0,1,2就会被设置到该终端设备。之后会输出提醒,提醒用户输入账号。到此getty的任务完成
3、之后getty会exec login程序,提示用户输入密码(此时终端回显被关闭)。然后验证密码是否正确。
若密码正确:login程序会设置一些环境变量,设置当前工作目录为该用户的主目录,然后exec运行shell。
若密码错误:login程序终止,init重新从第一步开始执行。

注意,从getty到login再到login,其实都是同一个进程。exec只是进行了数据代码的切换,并没有进行进程切换。这个进程始终是被init fork出的那个子进程。所以他们的父进程始终为init。由于fork子进程会继承PCB的信息,所以由bash创建的所有进程的祖先进程都是init。

阅读全文
0 0