进程间关系

1.进程组

每个进程除了有⼀个进程ID之外,还属于⼀个进程组。进程组是⼀个或多个进程的集合。通常,它们与同⼀作业相关联,可以接收来⾃同⼀终端的各种信号。每个进程组有⼀个唯⼀的进程组ID。每个进程组都可以有⼀个组⻓进程。组⻓进程的标识是,其进程组ID等于其进程ID。 组⻓进程可以创建⼀个进程组,创建该组中的进程,然后终⽌。只要在某个进程组中⼀个进程存在,则该进程组就存在,这与其组⻓进程是否终⽌⽆关。

举个栗子:
1)创建三个进程
在这里插入图片描述
‘&’表示将进程组放在后台执行。
2)将第一行打印
在这里插入图片描述
3)查看三个进程信息
在这里插入图片描述
从上图可以看出:三个进程分别为17134,17135,17136。组长为17134,是进程组当中的第一个进程。
4)使用kill -9杀死组长,但是可以看出进程组还在。

ps选项:
a:不仅列出当前用户的进程,也列出所有其他用户的进程。
x:表示不仅列有控制终端的进程,也列出所有无控制终端的进程。
j:表示列出与作业控制相关的信息。
u:以用户为主的格式来显示程序状况

2.作业

1)基本概念

Shell分前后台来控制的不是进程⽽是作业(Job)或者进程(Process Group)。⼀个前台作业可以由多个进程组成,⼀个后台也可以由多个进程组成。Shell可以运⾏⼀个前台作业和任意多个后台作业,这称为作业控制。
作业与进程组的区别:如果作业中的某个进程⼜创建了⼦进程,则⼦进程不属于作业,而属于进程组。⼀旦作业运⾏结束,Shell就把⾃⼰提到前台(⼦进程还在,可是⼦进程不属于作业),如果原来的前台进程还存在(如果这个⼦进程还没终⽌),它⾃动变为后台进程组。

在前台起作业,shell是无法运行的,因为他被提到了后台。但是如果前台作业退出了,那么shell就又被提到了前台,所以又可以继续接受用户输入。举例如下:

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

int main()
{
  pid_t id = fork();
  if(id < 0){
    perror("fork");
    return 1;
  }else if(id == 0){//child
    while(1){
      printf("child(%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;
}
//程序跑起来之后,在前台新起了1个作业,包涵⽗⼦两个进程
//5s之内,shell⽆法接受任何命令!说明此时的前台作业不是shell
//但是⽗进程退出之后,⼦进程还在运⾏,但此时输⼊的命令
//shell可以处理处理的,说明此时shell变成了前台作业
//换句话说,我们刚新起的作业退出了!但⼦进程还在,就⾃动被提到后台
//你可以再看看,⼦进程所属的进程组还在!组⻓是⽗进程(已经退出)
//我们发现他还在⼀致打消息,杀掉即可
2)作业控制

作业控制相关的指令:

&:让作业在后台运作。
fg 组ID:将组提到前台运行。
jobs:查看后台作业。
bg  组ID将组唤醒。
ctrl+z:将前台作业暂停到后台。
ctrl+d或exit:终止bash.

举例如下:
在这里插入图片描述
在这里插入图片描述

3.会话

会话(Session)是⼀个或多个进程组的集合。 ⼀个会话可以有⼀个控制终端。这通常是登陆到其上的终端设备(在终端登陆情况下)或伪终端设备(在⺴络登陆情况下)。建⽴与控制终端连接的会话⾸进程被称为控制进程。⼀个会话中的⼏个进程组可被分为⼀个前台进程组以及⼀个或多个后台进程组。所以⼀个会话中,应该包括控制进程(会话⾸进程),⼀个前台进程组和任意后台进程组。

举个栗子:

在这里插入图片描述
会话ID:18670,两个进程都属于同一个进程组,同一个会话。
而18670如下图所示是bash,也就是我们的解释器,会话首进程,而且两个进程的父进程都是bash。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值