进程间关系:同步,互斥和其他。

shell终端:可运行一个前台作业和任意多个后台作业,这称为作业控制。

进程组每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或多个进程的集合。
通常,它们与同一作业相关联,可以接收来自同一终端的各种信号。

注:只要在某个进程组中一个进程存在,则该进程组就存在,这与其组长进程是否终止无关

作业Shell分前后台来控制的不是进程而是作业( Job)或者进程组( Process Group。一个
前台作业可以由多个进程组成,一个后台也可以由多个进程组成。

Shell可以运行一个前台作业和任意多个后台作业,这称为作业控制。

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

会话( Session)是一个或多个进程组的集合。

一个会话可以有一个控制终端。建立与控制终端连接的会话首进程被称为控制进程。
一个会话中的多个进程组可被分为一个前台进程组以及一个或多个后台进程组。所以一个会话中,应该包括控制进程(会话首进程),一个前台进程组和任意后台进程组。

内核发送相应的信号给前台进程组中的所有进程。

wKioL1ctlmXBsYjFAAD412wp83Y281.png

bg %1,或bg 1:把前台作业放到后台。

fg %1,或fg 1:把后台作业放到前台。

bash运行原理:识别命令(是否合理),fork子进程,子进程执行代码(bash放后台)

终端:打开terminal,建立会话,bash是前台,后台有非常多的作业。

UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),控制终端是保存在PCB中的信息,而我们知 道fork会复制PCB中的
信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。

注:没有重定向时,每个进程的标准输入、标准输出和标准错误输出都指向控制终端

#include<stdio.h>
#include<unistd.h>
int main()
{
    printf("pid: %d\n",getpid());
    printf("in: %s\n",ttyname(0));
    printf("out: %s\n",ttyname(1));
    printf("err: %s\n",ttyname(2));
}

wKiom1ctkkexIUcYAAAR7s6rE68360.png

wKiom1ctlVHQutpjAAC6oonK4v4886.png