版权声明:本文为博主原创文章,任何组织或者个人可以在任何媒介上发表或转载我的文章、图片等.且转载后必须注明出处和邮箱,博客地址(https://blog.csdn.net/u011011827),本人邮箱([email protected]) https://blog.csdn.net/u011011827/article/details/79231838
- 综述
终端分为硬件和软件终端
硬件终端早就不用了
硬件终端分类为 VT100 xterm.都是硬件.
软件终端是模拟的硬件终端,可以模拟 VT100 或者 xterm
后来我们就把 VT100 xterm 叫做协议了.
VT100 xterm 是用来 传输字符 的 较好的协议,相对于 传输 图形界面的 X ,都是翘楚
早期的 控制台和终端
很早期,一台主机只有一个控制台.可以有多个终端.
开机关机的日志,会输出到控制台来,不会输出到终端.
后来,控制台和终端这种硬件由于时代原因,退伍了,就再也没有硬件的控制台和终端.
从此以后,控制台和终端就是软件的了.
注意,显示器不是控制台,也不是终端.目前我们用的键盘也不是控制器,也不是终端.
硬件终端和控制台是特指的.
控制台和终端的关系
可以这么说,控制台是一种特殊的终端
控制台可以显示开关机消息,但是终端不会显示.
-----
下面都是软件终端
tty7
开机时打印的终端也是软件模拟出来的,是模拟终端,同时也是 控制台
tty1-tty6
开机前半部分 是没有打印信息的,因为那时候他们就不存在,后来被生成了.开始记录开机日志
shell
我们常说的 bash zsh fish sh dash fish 都是shell的具体实现
图形界面终端
每种桌面基本上都会默认使用一种不同的 图形界面终端,这些图形界面终端基于 libX, 后来 fork 了 bash
这样的软件有 gnome-terminal konsole xterm rxvt kvt nxterm eterm
远程上的终端
开关机不会显示信息,其他和控制台没有差异
虚拟终端
tty7 tty1-6 shell 图形界面终端 远程上的终端 都是虚拟终端
目前的虚拟终端不包括键盘和显示器,虽然是打印到了显示器上,虽然用键盘控制.
注意:不用显示器也能查看输出,不用键盘也能控制主机
硬件终端也不包括我们现在常用的键盘和显示器,硬件终端是那个时代特有的东西
- 历史回溯
很早以前, 只有一个主机,只有一个类似键盘的东西,一个类似显示器的东西,这个类似键盘的东西可以当做控制台,被系统管理员用,这套显示和输入设备被称为 控制台
然后大家都想用(并不是做系统管理员),用 ASR33电传打字机 连接到主机, 这个 ASR33电传打字机 就是 我们所谓的 实体终端,目前可以操作但不可以做一些改变设置的事情.因为不是控制台
而这些实体终端有分类 VT100 xterm
上面讲的终端是纯硬件的
VT100 xterm 是硬件
后来 我们 想用 电脑 A 连接到 那个 主机 上, 然后就在 电脑A 上 做了个 软件B ,可以通过软件B 实现 之前的 (在实体终端实现的事情)
然后 这个软件就被称为虚拟终端
虚拟终端是软件的,且模拟了实体终端, 如果我们想让他模拟 VT100, 我们就做出来 模拟VT100 的软件
后来,我们做出来了 既能模拟 VT100 和 xterm 的软件
那现在我们有虚拟终端,我们要连上那个主机,所以我们要 选择 模拟哪一种 实体终端?这个取决于 那个主机当前设置 TERM
目前我们的主机也是支持各种 实体终端的, 所以 到底 主机 当前支持哪种终端,取决于 环境变量 TERM
控制台
开机关机的日志和记录,重要应用程序的日志,都会输出到控制台来。
没见过 重要应用程序的日志 的输出啊
对于linux来说,tty7 像是控制台,因为信息一开始都输出到屏幕上.
tty1-tty6 是虚拟终端
tty1-tty6 一开始是没有的,再启动的过程中生成的,tty7是一开始就在的
可能日志文件也是一种终端?不清楚.
远程上的 终端
不像是 控制台终端, 因为不能捕捉开机关机的日志和记录,但是 重要应用程序的日志也不见有
- 另外
1/
xterm 是 硬件终端的一种分类
在 linux 发行版中,有一个应用程序 也叫做 xterm,但 它是 图形界面终端 的一种
他们只是重名,但不是一个概念.不要搞混了
2/
伪终端
有人讲伪终端是虚拟终端的一种分类,并说伪终端 是 由 ssh服务器 虚拟出来的 终端
- 进一步深入
从进程树入手(pstree -p)
软件终端到最后都是bash 或者 dash 这样的东西
软件终端客户端 ----> 软件终端服务器
所以 我们要 到 linux 上获取终端,可能 客户端和服务器都在linux上,也可能服务器在linux,客户端不在linux.
虚拟终端从进程树的角度看来,分为4种
1/
从 lightdm 进程 继承过来的一支 (tty7下 的 图形界面中 打开的终端)
2/
从 sshd 进程 继承过来的一支 (远程开终端)
3/
从 login 进程 继承过来的一支 (从 tty1-6 login)
这一支又分为两种
1/
login 的儿子进程 (login 后获得的 终端)
2/
login 后 startx 后 在图形界面下开的 终端
4/
vnc 分支
启动vncserver ,然后用vncclient 连接,然后 vncclient 得到一个桌面,在这个桌面里面开启一个图形界面终端
这时候会起一个进程,但是这个进程不以vncserver 为根,而是以 1 进程 为根.
另外 除了 图形界面终端 的 其他图形界面进程都源自于 ~/.vnc/xstartup
还可能有更多的分支,例如telnet ,虽然现在telnet 都不用了
其实不管是 lightdm 还是 sshd 还是 login ,这三个东西都不是内核的组成部分.
但是 tty的概念 是内核中的东西. 好奇怪
- tty
我们如果想知道某个终端 为什么 是 /dev/tty1 , 或者为什么是 /dev/pts/1 ,就看tty 命令就行了.因为 结果是tty打印出来的
dpkg -L `dpkg -l |grep utils |awk '{print $2}'| head -10 | tail -5| head -1| xargs echo` |grep tty -9
靠这个定位 tty 是哪个包里面的,哈哈哈,发现 是 coreutils
sudo apt-get source coreutils
编译之后,边运行tty命令边分析tty的代码:
里面就一个 ttyname 函数值得一看,关键是 这个函数还不在 包里面
$ ldd src/tty
linux-vdso.so.1 => (0x00007ffd92baf000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007feba3e43000)
/lib64/ld-linux-x86-64.so.2 (0x000055944f887000)
$ nm src/tty |grep ttyname
U ttyname@@GLIBC_2.2.5
然后我要分析GLIBC吗?呵呵呵
果然我又分析了 glibc-2.2.5 ,里面的 ttyname 函数 返回值 是NULL,而且这个函数是什么鬼,怎么可以长成这样子
char *
ttyname (fd)
int fd;
{
__set_errno (ENOSYS);
return NULL;
}
于是,我就想编译一下,./configure 的时候 出了问题
*** These critical programs are missing or too old:gcc make
*** Check the INSTALL file for required versions.
我不懂怎么换编译链,目前没有换编译链的需求,就此作罢.改天再提.
-
- 参考资料