前言

  • 进程,shell,shell进程,终端,控制终端,前台进程,后台进程,控制进程,前台进程组,后台进程组,会话,守护进程,init进程,用户进程,系统进程 它们之间的联系与区别

那么接下来,就请我一点一点为大家解开,这里的庐山真面目

shell进程与终端的基础概念

Shell 是操作系统的一个接口,提供了一个命令行界面,用户可以通过这个界面与操作系统交互。在 Unix/Linux 系统中,Shell 是一个命令行解释器,它解释用户输入的命令并调用相应的程序执行。Shell 还是一个编程环境,可以编写复杂的 shell 脚本。

进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。进程之间是相互独立的,每个进程均运行在其专用且受保护的内存空间内。

更多的具体的关于进程的基础概念大家可以看我的这篇文章:

  • 终端(Terminal)最初是指物理设备,如键盘和显示器。在 Unix/Linux 系统中,终端成为了一种抽象概念,指的是通过某种方式(物理或网络)与系统交互的一个接口。
  • 现在的终端更多的是指一种设备或者是一个应用程序(如你在使用的ssh终端或图形界面下的终端模拟器),它为用户与操作系统交互提供了环境。在Unix/Linux中,每个终端都会对应一个设备文件,例如/dev/tty1,/dev/tty2等。

shell进程与终端之间的关系

  • 当你打开一个终端窗口(例如,通过 ssh 登录,或者在 GUI 下打开一个控制台窗口)时,会创建一个 Shell 进程。这个 Shell 进程会在终端接收你的输入,解析这些输入,然后执行相应的命令。因此,Shell 进程就像是终端(用户)和操作系统之间的媒介。

  • 为了更好地理解,我们可以想象这样一种场景:你在终端窗口中键入命令 “ls”,然后按回车。此时,Shell 进程接收到 “ls” 命令,解析它,并调用 “ls” 程序。 “ls” 程序运行后,将输出发送回 Shell 进程,Shell 进程再将这些输出显示在终端窗口中。这就是 Shell 进程与终端之间的基本交互方式。

再一次的,更进一步的深入了解进程与终端之间的关系

  • 在 UNIX 系统中,当用户通过终端登录系统后,的确会得到一个 shell 进程,这个终端成为 shell 进程的控制终端。这里的 "控制终端" 是指能够接收用户输入并显示程序输出的设备或虚拟设备

  • 对于每一个进程,它的控制终端信息保存在它的进程控制块(Process Control Block,PCB的。当 shell 进程使用 fork() 创建新的进程时,新的进程会继承 shell 进程的 PCB 信息,包括控制终端的信息,因此新的进程的控制终端也是同一个终端。

  • 在 UNIX 系统中,每个进程都有三个默认的文件描述符:标准输入(stdin,文件描述符为 0),标准输出(stdout,文件描述符为 1),以及标准错误输出(stderr,文件描述符为 2)。

    • 默认情况下(没有重定向),这些文件描述符都指向控制终端。因此,进程从标准输入读取数据,就是读取用户在终端的键盘输入;进程向标准输出或标准错误输出写数据,就是向终端的显示器输出
  • 控制终端还有一个重要的功能,就是能够向前台进程发送信号。在 UNIX 系统中,有一些特殊的键盘输入可以产生信号。例如:

    • Ctrl + C 会产生 SIGINT 信号,这是一个中断信号,用来请求进程终止运行;
    • Ctrl + \ 会产生 SIGQUIT 信号,这也是一个请求进程终止运行的信号,但与 SIGINT 不同,SIGQUIT 还会产生 core dump 文件,用来保存进程终止时的状态,以供后续分析。

再再再次的深入了解到底什么是控制终端,从产生到作用

  • 当我们通过SSH等远程登录工具连接到Linux主机时,远程登录服务会启动一个shell进程来处理你的命令请求,这个新启动的shell进程会创建一个新的会话,并将你的远程终端设置为这个会话的控制终端。
    • 也就是说,Linux主机同意与我们的终端建立连接的时候:
      • 第一步:系统会启动一个shell进程
      • 第二步:shell进程会创建一个新的会话,并自己成为该会话的领头进程
      • 第三步:shell进程将我们的远程终端设置成为这个会话的控制终端。
  • 控制终端的作用是
    • 输入输出设备:控制终端通常用作会话中所有进程的默认输入和输出设备。
    • 信号发送:控制终端可以用来向前台进程组中的进程发送信号。
    • 作业控制:控制终端也用于实现 Unix 的作业控制功能。
    • 终端设备的参数控制:通过控制终端,可以对终端设备的各种参数进行控制,比如字符的显示方式、输入输出速度等。
    • 会话的划分:控制终端是划分不同会话的一个重要标志。每个会话都有一个与之关联的控制终端,通过这个控制终端,用户可以与会话中的进程进行交互。

总之,当我们的那个登录终端,成为了一个会话的控制终端后,才会具有以上的这些功能,拥有了这些功能,我们才能在Linux系统上展开一些工作。这也就是我对控制终端的理解。

总结

  • Shell 进程:当你打开一个终端窗口时,会启动一个 Shell 进程。这个 Shell 进程提供一个命令行界面,用于接收用户的输入,解析这些输入,然后执行相应的命令。

  • 终端:终端是用户与操作系统交互的接口。用户在终端输入命令,这些命令由 Shell 进程接收并执行。执行的结果再通过 Shell 进程返回到终端显示。

  • 交互方式:用户在终端输入命令,Shell 进程接收并解析这些命令,然后调用相应的程序执行。执行的结果再通过 Shell 进程返回到终端,显示给用户。

  • 关系:Shell 进程和终端之间的关系非常密切。Shell 进程就像是终端(用户)和操作系统之间的桥梁,它接收用户在终端的输入,解析并执行这些输入,然后将执行结果返回到终端显示给用户。

简而言之,Shell 进程与终端之间的关系就像是一个传声筒和人们之间的关系:人们通过传声筒(Shell 进程)说话,传声筒将声音(命令)传递出去,并将回声(执行结果)传回给人们(用户)

最后的最后,如果你觉得我的这篇文章写的不错的话,请给我一个赞与收藏,关注我,我会继续给大家带来更多更优质的干货内容

05-16 00:15