进程间关系

在之前学习了进程间通信的五种机制,那仫进程之间的关系有哪些呢?
(一).进程组
进程组是一个或多个进程的集合。
每一个进程除了有一个进程ID之外,它还属于一个进程组。通常来说,进程组和作业相关联,可以来接收同一个终端下的各种信号,每一个进程组也有对应的唯一进程组ID。
进程组的特点:
1).只要在某个进程组中一个进程存在,则该进程组就存在,这与其组长进程是否终止无关;
2).每个进程组有一个唯一的进程组ID,其组id和组长的Id是一致的;
3).组长通常是第一个进程,组长进程的标识是:其进程组ID等于其进程ID;
进程组ID
从上图可以看出,sleep 1000,sleep 2000以及more处于同一个进程组,而./a.out属于另外一个进程组。


(二).会话
会话是一个或者多个进程组的集合。
一个会话有一个控制终端,建立与控制终端相连接的会话首进程叫做控制进程。一个会话当中分为一个前台进程组和多个后台进程组。内核通常发信号给前台进程组的所有进程。
会话的意义在于将多个工作囊括在一个终端,并且取其中的一个工作作为前台,来直接接受该终端的输入输出以及终端信号。其他的工作在后台运行。
建立新会话,可以新打开一个终端也可以使用函数setsid来创建一个新的会话。

#include <unistd.h>
pid_t setsid(void);

这个函数调用的如果不是组长进程,则该函数会做如下的三件事:
1).该进程变为新会话的首进程,它将成为新会话的唯一进程;
2). 该进程成为一个新进程组的组长进程。新进程组ID是该调用进程的进程ID;
3).该进程没有控制终端,如果之前有,那么被中断。
例如之前那张图的SID就是会话ID:
SID


(三).作业控制
Shell分前后台来控制的不是进程而是作业(Job)或者进程组(Process Group)。
作业和进程组的区别:
在作业内部创建了子进程,该子进程属于进程组而不属于作业;
作业控制:一个前台作业可以由多个进程组成,一个后台也可以由多个进程组成,Shell可以运行一个前台作业和任意多个后台作业。
作业类似进程存在进程号一样,作业也存在作业号:
jobs
几个简单的命令:
1).& :在运行一个进程后面加上取地址,则说明让该进程到后台运行;例如:./a.out &;
2).jobs:查看所有的后台作业;
3).fg +作业号:将指定作业放置前台;
4).ctrl+z:将前台作业暂停;
6).ctrl+c:作业终止,进程发信号给所有的前台进程;
5).bg +作业号:将之前暂停的转到后台的作业运行起来;


四.终端
终端,是一种仿真器,是一种模拟器
1).控制终端:用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端 。控制终端是保存在PCB中的信息,而我们知道fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端;默认情况 下,每个进程的标准输入、标准输出和标准错误输出都指向控制终端。
2).ttyname()的使用:
char *ttyname(int fd);根据文件描述符来获取对应的文件名称;
查看终端对应的设备:
查看

mytty
每个进程都可以通过一个特殊的设备文件/dev/tty访问它的控制终端,/dev/tty提供了一个通用的接口,一个进程要访问它的控制终端既可以通过/dev/tty也可以通过该终端设备所对应的设备文件来访问。
在上述的例子中却是/dev/pts,那仫/dev/pts和/dev/tty有什仫区别呢?
总的来说可以总结为下面一句话:在界面模式下是/dev/pts,但是在黑屏模式下却是/dev/tty。
3).我们可以通过重定向的方式向另一个终端打印消息。
mytty

4).线路规程:相当于一个过滤器,如果是普通字符则直接忽略;如果是特殊的组合键则将其解释为信号;内核中处理终端设备的模块包括硬件驱动程序和线路规程。
线路规程

在终端设备中既有输入队列也有输出队列,所以当存在这样一种情况:当你的输入在显示器上无序的时候也仅仅是回显到输出队列时被冲乱,但是在你的输入队列中依然是有序的。
接下来看一看什仫是终端登录过程
5).所谓的终端登录过程指的是用户在输入用户名和密码验证的过程,下面是我理解的一张终端登录的过程图:
终端登录过程
从上图可以看出终端登录过程可以是如下几个步骤:
1).系统启动时,init进程(也就是1号进程)根据配置文件/etc/inittab确定需要打开哪些终端;
2).getty根据命令行参数打开终端设备作为它的控制终端,把文件描述符0、1、2都指向控制终 端,然后提示用户输入帐号。用户输入帐号之后,getty的任务就完成了,它再执行login程序
execle(“/bin/login”, “login”, “-p”, username, NULL, envp);
3).如果密码不正确,login进程终止,init会重新fork/exec一个getty进程;如果密码正确,login程序设置一些环境变量,设置当前工作目录为该用户的主目录,然后执行Shell;
execl(“/bin/bash”, “-bash”, NULL);


在这里就分享结束了~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值