进程组&作业&会话&守护进程

一、进程组

1.什么是进程组?

ps:同进程组中的所有进程,都可以接收来自统一终端的各种信号

一个或多个进程的集合

2.组长进程&组长进程ID

组长进程:是一个进程组中的组长,每个进程组都有一个组长进程
组长进程ID:进程组ID=进程ID,如果某个进程的这两个ID是相同的,那此进程就是组长进程

3.查询组长进程和组长进程ID的命令

ps axj|grep 可执行程序//例如:ps axj|grep sle

这里写图片描述

4.kill -9 +组长进程ID //杀掉组长,进程组还在

这里写图片描述

二、作业

1.什么是作业?

作业其实就是进程组

2.作业的分类

(1)前台作业
一个前台作业由多个进程组成
(2)后台作业
一个后台作业也由多个进程组成

ps:shell可以运行一个前台作业和多个后台作业

3.shell的运行方式?

在前台新起作业,shell是无法运行的,因为它被提到了后台,但是如果前台进程退出了,shell就又被提到了前台,可以接受用户输入

ps:即就是命令是发给shell终端的,但是当我们在执行程序时,终端就会被执行的程序占,此时不能输入命令,当程序执行完了,那终端就又会回到shell的怀抱,此时就可以接收命令

4.作业与进程组的区别?

如果作业中的某个进程创建了子进程,那此子进程属于进程组,不属于作业

例如:使用fork来创建父子进程,5秒过后,让父进程退出,子进程一直死循环的执行,如下:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
    pid_t pid=fork();
    if(pid<0)
    {
        perror("fork");
        exit(1);
    }
    if(pid==0)
    {
        while(1)
        {
            printf("I am child process.\n");
            sleep(1);
        }
    }
    else
    {
        int i=5;
        while(i)
        {
            printf("I am father process.\n");
            --i;
            sleep(1);
        }
    }
return 0;
}

运行结果:

这里写图片描述

由此可见,子进程不属于作业,而是属于进程组,因为刚才的作业已经退出了,但是子进程还在,此时的子进程已经被提到后台执行了,所以ctrl -c对进程不起任何作用,终止不了进程,ctrl -c是发给父进程的,可是此时父进程已经退出,所以ctrl -c是发给shell终端了,故终止不了子进程,但是可以通过kill指令杀死整个进程

这里写图片描述

三、会话

1.会话是什么?

会话是一个或多个进程组的集合,一个会话可以有一个控制终端

2.控制进程&会话的内容

(1)控制进程:建立与控制终端连接的会话首进程被称为控制进程(一般bash就是控制进程)
(2)会话的内容:一个会话中,包括控制进程(会话首进程)、一个前台进程组和任意后台进程组

终端1
这里写图片描述
终端2
这里写图片描述
终端3
这里写图片描述

由这三张图来看,新打开一个终端就会新建一个会话

四、作业控制

1.作业控制

shell可以同时运行一个前台作业和任意多个后台作业,这就是作业控制

2.作业控制的相关指令

1)jobs//查看所有的后台进程;2)fg  1//把1号后台进程变为前台进程3)bg//使后台被暂停的进程继续执行
例如:bg 1//使被暂停的1号后台进程继续执行4)ctrl  -z//使正在执行的程序变为后台进程,而且此进程的状态为暂停状态(T状态)5)可执行程序 &//使此可执行程序变为后台进程,而且状态为就绪状态(R状态)
例如:sleep 100&//把sleep  100变成后台进程

这里写图片描述
ps:ctrl -c—>杀掉的是整个进程组,不是进程组中的某一个进程

bg/&:会使进程的状态为运行(Running)状态
ctrl -z:会使进程的状态为暂停(Stopped)状态

3.作业控制的相关信号

(1)18---->SIGCONT---->让一个停止(stopped)的进程继续执行,本信号不能被阻塞(即就是继续运行停止的进程)
(2)20---->SIGTSTP---->停止或暂停进程,但不会终止进程。此信号不能被处理和忽略
                        由Ctrl  -z产生
(3)21---->SIGTTIN---->当后台作业要从用户终端读取数据时,那该作业中地所有进程都会收到此信号,此信号会让进程停止执行
9---->SUGKILL---->终止进程,会立即处理
15---->SIGTREM---->此信号不会被立即处理,而是等进程继续运行之前才会处理,默认处理动作是终止进程

用kill命令给一个进程发送15号信号—->SIGTERM,此信号的作用是使进程终止,但是此信号不会立即处理,而是等进程在准备继续运行之前,才会处理
这里写图片描述

五、守护进程

猜你喜欢

转载自blog.csdn.net/dangzhangjing97/article/details/80044495