所有程序都需要终端吗?

所有程序都需要终端吗?

一位朋友告诉我,Linux 中的图形系统是在 TTY7 上运行的。所以我想知道是否所有程序都需要在终端(虚拟终端或伪终端)上运行?或者程序可以直接访问内核或 shell 吗?

我之前的问题可能类似,但不能回答我当前的问题。那个问题是关于程序、操作系统内核(任何操作系统)和硬件(CPU)之间的关系。我了解到,对于启动操作系统后运行的大多数程序,确实需要经过内核以及这些不同的“层”。但我当前的问题是关于 Linux 的。

据我所知,Linux 中的 GUI 与操作系统的关系比 Windows 中的松散得多。GUI 是一个进程(所以是 GNOME 之类的 GUI shell 程序的一个实例?),它在 TTY7 上运行。[现在我明白终端是一个 CLI,它会创建一个 shell 会话,shell 负责执行输入到终端中的命令。GUI,就像 Linux 下的 GNOME 一样,也是基于窗口系统构建的 shell(图形 shell),其“shell”会话在 TTY7 上运行。]

所以我的问题是:所有程序/应用程序是否都需要通过终端,就像 GUI shell 程序在 TTY7 上运行一样?

[我知道从终端启动应用程序(例如游戏或 Web 浏览器)会将终端锁定到该应用程序(即,shell 会话成为该进程的父级)。但是当通过鼠标单击从 GUI 打开应用程序时,似乎没有打开任何新终端?]

另外,为什么 GUI 要在终端(默认为 TTY7 或任何其他终端)上运行 - 为什么不直接运行它?

答案1

Unix/Linux/相关系统没有内置要求进程必须有终端,事实上,存在不使用或不关心终端的守护进程是很常见的。

在 Unix 中,一切都是文件。当程序在 Unix/Linux 中打开文件时,它会返回一个临时 ID 号,称为文件描述符

Unix/Linux中启动程序时会自动打开3个文件描述符,编号分别为0、1、2。

0 也称为stdin标准输入,1 也称为stdout标准输出,2 也称为stderr“标准错误”。0、1 和 2 称为“标准流”,是从父进程继承的。

传统上,所有这些都是终端。但它们不一定是。调用程序/父进程(如果您使用 shell,则为 shell)可以将它们连接到它首先打开的其他文件,例如实际文件(由 shell 重定向指定)或stdout另一个进程的文件。

守护进程是常见程序类型的一个例子,其中stdout可能stdin根本不打开,或者不使用,甚至关闭(如果打开)。因此,父进程/shell 可以通过标准流为守护进程提供 TTY,但守护进程可以关闭它或不使用它。

窗口管理器实际上也不必使用标准流中的 TTY。

我认为为窗口管理器指定 的原因tty7是,当您按 Ctrl-Alt 键时, 的设置tty7(可能通过ioctl)会使其从文本模式更改为图形模式。但窗口管理器不会以其他方式使用终端(它甚至可能会关闭打开的文件描述符,因为不需要它)。

参考

相关内容