- 进程组:
概念:进程组是一个或多个进程的集合
每个进程除了有一个进程ID之外,还属于一个进程组。通常与同一个作业相关联,可以接收到来自同一个终端的信号。
每个进程组有一个唯一标识的进程组ID。
每个进程组都可以有一个组长进程,组长进程的ID等于进程ID
组长进程可以创建一个进程组,创建该组的进程,然后终止,只要该进程组中有一个进程存在,无论组长进程是否终止,该进程组都是存在的
就好比一个班级的班长如果不在,那这个班级还是存在的下面就举一个例子:
杀掉组长进程后,该进程组还在:
在命令行输入”&”表示将该进程放在后台运行
ps选项:
a:不仅列出当前用户的进程,也列出所有其他用户的进程
x:不仅列出有控制终端的进程,也列出所有无控制终端的进程
j:列出与作业控制相关的信息
Ctrl +z/c/ 终止一个进程组
作业:
Shell分前后台来控制的不是进程而是作业或者进程组。一个作业可以由多个进程组成。
Shell可以运行一个前台作业和任意多个后台作业,称为作业控制
bash是一个独立的作业,独立的进程组
作业与进程组的区别:如果作业中的某个进程又创建了子进程,则子进程不属于作业,但属于进程组
一旦作业运行结束,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 is running...\n",getpid());
sleep(1);
}
}
else
{
//father
int i = 10;
while(i)
{
printf("parent %d is going to dead... i = %d\n",getpid(),i--);
sleep(1);
}
}
return 0;
}
运行结果如下:
当程序运行起来,在前台新起了一个作业,包含父子两个进程
10秒之内shell无法执行任何命令,说明此时的前台作业不是shell
当10秒后父进程退出,子进程还在继续运行,但此时输入命令,shell就可以执行了,说明此时的shell变成了前台作业
- 作业控制:
- 会话:
概念:会话是一个或多个进程组的集合。
一个会话可以有一个控制终端,一个会话中的几个进程组可被分为一个前台进程组或多个后台进程组。所以一个会话中,应该包括控制进程(会话首进程),一个前台进程组和任意后台进程组
默认前台进程组:bash
默认会话首进程:bash
SID为会话ID,三个进程属于同一个进程组,同一个会话