Linux 终端控制是一种强大的技术,它可以让我们更深入地控制终端以及与终端相关的所有东西,例如登录用户,vim编辑器等。本文将着重介绍TTYS层次的奥秘,深入了解TTY的主要组件以及它们是如何起作用的。
首先,我们来看看 TTY 的层次结构。图 1提供了一个简图,展示了TTY抽象层次结构:
![1.png](https://upload-images.jianshu.io/upload_images/5030629-190154b67a7bfa17.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
图 1:TTY抽象层次结构
从上面我们可以看出,TTY 基本上可以分为三个部分:
– TTY 设备驱动程序:这是低层次的硬件驱动程序,可以处理串口和终端等设备的输入输出,包括获取输入数据,控制发送数据以及更新设备的状态等。
– TTY 内核部分:包括管理 TTY 的和控制 TTY 之间的交互等使用的行为,以及实现 TTY 的特定的功能和选项等。
– 用户空间:它提供了 TTY 和用户对话的接口,它能够控制 TTY 的输入和输出,并实现了终端和终端控制程序之间的交互,所以可以在 Linux 命令行窗口中使用 TTY。
既然我们已经来了解 TTY 的层次结构,那么下面我们来看看如何使用代码来控制 TTY。 TTY设备驱动程序提供了一些内核级的接口,下面是有关 TTY 控制的代码,其中, tty_ioctl() 是用于 TTY 控制的内核函数:
“`c
int tty_ioctl (struct tty_struct * tty,
unsigned int cmd,
unsigned long arg)
{
switch (cmd) {
// 打开TTY
case TIOCSCTTY:
if (tty_paranoia_check(tty, current->tty, “tty_ioctl”))
return -EACCES;
if (current->signal->tty != tty &&
tty->session == NULL) {
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
}
current->signal->tty = tty;
tty->session = current->signal;
tty->pgrp = process_group(current);
return 0;
// 关闭TTY
case TIOCCLOSE:
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
tty_kref_put(tty);
return 0;
}
return -ENOIOCTLCMD;
}
这段代码实现了一个控制 TTY 的函数,既可以打开 TTY,也可以关闭 TTY,这在控制 TTY 时非常有用。
通过上述的内容,我们可以看出,TTY 层次的结构其实就是一种抽象的技术,可以把设备的输入输出抽象成一种更抽象的概念,并且通过编写相关的控制代码,更加轻松地控制 TTY 以及它有关的东西。