进程组 作业及会话

1.进程组 

每个进程组有 一个唯 一的进程组ID,就跟进程有自己唯一的一个进程ID一样。每个进程除了有自己的进程ID外,还会属于一个进程组,一个或多个进程的集合称为一个进程组。它们与同一作业作业相关联。

只要进程组中有一个进程存在,那么这个进程组就是存在的(之前说过一个进程也能称为一个进程组

2.作业

Shell分前后台来控制的不是进程而是作业或者进程组一个前台作业可以由多个进程组成,一个后台也可以由多个进程组成,shell可以执行一个前台程序和多个后台程序。(下面来举个例子,来验证一下)


我们fork一个子进程,然后两秒后父进程退出,看结果。



一旦运行我们立马按住ctrl+c,可以看到子程序立马停了下来,按Ctrl+c相当于给前台发了一个信号,程序能停下来说明此时该子进程还是在前台的。然后再运行一次,稍微等上一会儿再去按ctrl+c的时候,并没有任何反应,程序一直死循环打印输出的结果,在子进程运行的同时,父进程sleep的时间到了,父进程就退出了,那么该子进程就变成了孤儿进程,它不是一个作业,此时shell回到前台,把该孤儿进程挤到后台,所以当我们在象前台发信号的时候,就不能控制这个已经去了后台的孤儿进程,这是想要杀掉这个进程就只能使用kill指令。


此时我们首先需要使用命令ps aux来显示所有作业及进程组信息(或者ps axj),然后找到文件所对应的进程号使用kill 9 +进程号去杀掉这个进程。


为了看我们的tem.c是不是不在了,再一次ps aux



此时看到tem.c不在了,我们的输出也停下来了,可见我们成功的杀了那个孤儿进程。

作业与进程组的区别:如果作业中的某个进程又创建了子进程,则 该子进程不属于作业。

 一旦作业运 行结束,Shell就把 己提到前台,如果原来的前台进程还存在(如果这个 子进程还没终 止),它 自动变为后台进程组。

3.作业控制

首先我们起一个后台命令./可执行文件名 &


这里的1是作业号 2728是进程pid,接下来用jobs查看后台作业


fg 1 命令把后台作业放到前台,bg 1把作业从前台放到后台。1是作业号。




4.会话

会话是一个或多个进程组的集合(注意与进程组概念进行区分)。每一个会话有一个控制终端,我们每开一个终端就会多一个会话(bash)。


此时我们有一个会话,所以有一个bash,我们此时再开一个终端观察结果


此时我们就看到了两个会话(bash)

 一个会话中的 几个进程组可被分为 一个前台进程组以及 一个或多个后台进程组。所以 一个会话中,应该包括控制进程(会话 首进程), 一个前台进程组和任意后台进程组。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值