进程间关系

1.1 进程组
每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或多个进程的集合。通常,它们与同一作业相关,可以接收来自同一终端的各种信号。每个进程组有一个唯一的进程组ID。每个进程组都有一个组长进程。组长进程的标识是进程组ID等于进程ID。组长进程可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。实例如下:
在这里插入图片描述
释:
(1)&:表示将进程组放在后台执行。
(2)父进程PPID:11954。
(3)进程PID:12144、12145、12146。
(4)进程组PGID:12144。
(5)kill -9 杀掉组长进程,其它进程还在。
在这里插入图片描述
(6)ps选项
1)a:不仅列当前用户的进程,也列出所有其它用户的进程。
2)x:不仅列有控制终端的进程,也列出所有无控制终端的进程。
3)j:列出与作业控制相关的信息。
2.1 作业
2.1.1 认识作业
2.1.1.1 作业控制
shell分前后台来控制的不是进程而是作业(job)或者进程组(process group)。一个前台作业可以由多个进程组成,一个后台也可以由多个进程组成,shell可以运行一个前台作业和任意多个后台作业,这个称为作业控制。
在这里插入图片描述
释:
(1)&:一个任务或者程序在后台执行。
(2)bg:将一个后台暂停的作业变成继续执行。
(3)fg:将一个后台运行的作业提到前台执行。
(4)jobs:查看后台运行的作业。
(5)Ctrl+z:将一个在前台执行的作业放到后台,并且暂停。
(6)Ctrl+c:杀掉的是整个作业,而不是进程。
2.1.1.2 作业与进程的关系
一旦作业运行结束,shell就把自己提到前台(子进程还在,可是子进程不属于作业),如果原来的前台进程还存在(如果这个子进程还没有终止),它自动变为后台进程组。在前台新起作业,shell是无法运行的,因为被提到后台。但是如果前台进程退出,shell就又被提到前台,所以可以继续接受用户输入。。
例:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main()
{
		pid_t pid = fork();
		if(pid < 0){
				perror("fork error!\n");
				return -1;
		}else if(pid == 0){
				while(1){
						printf("chlid(%d)# I am running!\n", getpid());
						sleep(1);
				}
		}else{
				int i = 5;
				while(i){
						printf("parent(%d)# I am going to dead ... %d\n", getpid(), i--);
						sleep(1);
				}
		}
		return 0;
}

释:程序运行起来之后,在前台新起一个作业,包含父子两个进程,5秒之内,shell取法接受任何命令,说明此时的前台作业不是shell。但是父进程退出之后,子进程还在运行,但此时输入命令shell可以处理,说明此时shell变成了前台作业。换句话说,刚新起的作业退出了,但是子进程还在,就自动被提到后台。子进程所属的进程组还在,组长是父进程,已经退出。
2.1.2 作业与进程和进程组的区别
(1)作业与进程组的区别:如果作业中的某个进程又创建了子进程,则子进程不属于作业。
(2)作业与进程的区别:作业是从外存放到内存的一个过程,它包含一个或多个进程。作业的调度属于高级调度,进程的调度属于低级调度,所以进程一个系统中最基本的也算是必须要求的调度,而作业调度是为了提高系统性能而调度的高级调度。
2.1.3 作业控制有关的信号
在这里插入图片描述
将cat放到后台运行,由于需要读标准输入(也就是终端输入),而后台进程是不能读终端输入的,因此内核发SIGTTIN信号给进程,该信号的默认处理动作是使进程停止。
在这里插入图片描述
释:jobs命令可以查看当前有哪些作业。fg命令可以将某个作业提到前台运行,如果该作业的进程组在后台运行则提至前台运行;如果该作业处于停止状态,则给进程组的每个进程发SIGCONT信号使它继续运行。参数%1表示将第1个作业提至前台运行。cat提到前台运行后,挂起等待终端输入,当输入hello并回车后,cat打印出同样的一行,然后继续挂起等待输入。如果输入Ctrl+z则想前台进程发SIGTSTP信号,该信号的默认动作是使进程停止,cat继续以后台作业的形式存在。bg命令可以让某个停止的作业在后台继续运行,也需要给作业的进程组的每个进程SIGCONT信号。cat进程继续运行,又要读终端输入,然而它在后台不能读终端输入,所以又收到SIGTTIN信号而停止。
在这里插入图片描述
用kill命令给一个停止的进程发SIGTERM(15)信号,这个信号并不会立刻处理,而要等进程准备继续运行之前处理,默认动作是终止进程。但如果给一个停止的进程发SIGKILL信号就不同了。

3.1 会话
会话(session)是一个或多个进程组的集合。一个会话可以有一个控制终端。这通常是登录到其上的终端设备(在终端登录情况下)或伪终端设备(在网络登录情况下)。建立与控制终端连接的会话首进程被称为控制终端。一个会话钟的几个进程组可被分为一个前台进程组以及一个或多个后台进程组。所以,一个会话中应该包括控制进程(会话首进程),一个前台进程组和任意后台进程组,新打开一个终端。如下所示:
在这里插入图片描述
释:SID:会话ID,5427,三个进程组都属于同一个进程组,同一个会话5427是谁呢?
在这里插入图片描述
释:bash!也就是解释器,会话首进程,而且三个进程的父进程都是bash。多打开几个终端对比就会发现,每打开一个终端就建立一个会话。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值