😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰: 2024-09-11 15:08:27
本文未经允许,不得转发!!!
目录
🎄一、概述
在 Linux 系统中,有几个常见的终端设备名称,如 tty*
、ttyS*
、ttyAMA*
和 console
。这些设备在系统中扮演着不同的角色,对于理解 Linux 系统的输入输出和用户交互至关重要。
几种设备的介绍:
- 控制台终端(console):指计算机的输出设备, 通常是printk信息输出的设备,对应到
/dev/console
文件; - 控制终端(controlling terminal):代表当前tty设备,对应到
/dev/tty
文件; - 虚拟控制台终端:仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:
/dev/tty0
、/dev/tty1
、/dev/tty2
等。其中/dev/tty0
会指向当前所使用虚拟终端,类似于别名; - 串行端口终端(serial port terminal):指使用计算机串行端口连接的终端设备,一般对应到
/dev/ttySn
文件。但在某些ARM架构处理器的系统中,则是对应到/dev/ttyAMAn
文件; - 伪终端(pseudo terminal):通常是通过ssh登陆的终端,对应到
/dev/pts/*
文件。
针对 tty 设备,可以在终端输入
tty
命令查看当前tty设备(终端)名称:tty
Linux系统中,还可使用下面命令,查看登录到本系统的所有 tty 设备:
who
怎么理解 控制台 和 终端:
在监控系统中,一般有个监控室,这就类似于控制台;但有时使用手机也可以查看监控,这个手机就类似于终端。
🎄二、概念区别
✨2.1 /dev/tty*
tty
的全称是TeleTYpe
,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。在 Linux 中,tty
设备通常代表一个物理或虚拟终端。它可以是一个本地终端连接到系统,也可以是一个通过网络连接的远程终端。终端是一种字符型设备,它有多种类型,通常使用 tty
来简称各种类型的终端设备。
-
/dev/tty
:控制终端(controlling terminal),会指向 当前tty设备。你在终端输入下面命令都会打印到当前终端窗口;echo "abc" > /dev/tty
-
/dev/tty0
:在 Linux 系统中,/dev/tty0
指向 当前虚拟控制台设备,通常与系统的图形终端或第一个文本终端相关联。你在一个虚拟终端(/dev/tty*
)输入下面命令会直接打印到当前窗口,只有系统或超级用户root可以向/dev/tty0
进行写操作:echo "abc" > /dev/tty0
-
/dev/tty1
~/dey/tty63
:在 Linux 系统中,通常代表独立的 虚拟控制台终端,/dev/tty1
表示第一个虚拟控制台终端,可以通过按下特定的组合键(如Ctrl+Alt+F1
、Ctrl+Alt+F2
等)来切换到这些终端。每个这样的终端都是一个独立的用户会话,可以由不同的用户登录和使用。
✨2.2 /dev/ttyS*
ttyS*设备,全称TeleTYpe Serial
,这些是 串行端口终端(Serial Port Terminal
)设备。在过去,串口是连接外部设备(如调制解调器、打印机、终端等)的常见方式。
串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为 那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0), /dev/tts/1(或/dev/ttyS1)等,设备号分别是(4,0), (4,1)等,分别对应于DOS系统下的COM1、COM2等。若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如, 在命令行提示符下键入:echo test > /dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。可接串口来实验。
✨2.3 /dev/ttyAMA*
ttyAMA0 是ARM特定的 串行端口设备 文件,表示某些ARM架构处理器(如Broadcom SoC中的UART接口)。会关联到ARM处理器的内置UART接口。/dev/ttyAMA0
是第一个ARM特定的UART设备,其他类似的设备可能有不同的名称
✨2.4 /dev/console
/dev/console是 Linux 系统的 控制台。在系统启动时显示内核消息和系统日志的主要设备。它通常是一个物理终端设备,直接连接到系统的硬件。
在系统出现严重问题时,控制台是获取关键信息的重要途径。即使系统的其他部分出现故障,控制台通常仍然可以访问,以便进行故障排除和恢复操作。
✨2.5 /dev/pts/*
/dev/pts/*通常代表 伪终端设备。伪终端在很多情况下用于模拟物理终端的行为,例如在网络连接中,当你使用 SSH 连接到远程服务器时,服务器端会为你的连接分配一个伪终端设备,通常命名为 /dev/pts/*
(其中 * 是一个数字)。
作用:伪终端在实现远程登录、终端复用器(如 screen 和 tmux)等方面起着关键作用。它们允许在不同的进程之间进行终端输入输出的模拟和传递。
在使用 ssh 的终端,输入 tty 查看当前tty设备名称如下:
🎄三、系统输出重定向
从上面可以得知,LInux系统的一些系统消息、系统日志都会 /dev/console 打印,在arm开发板中,通常可以以设置内核命令行参数的形式将 /dev/console 文件关联到串口中,这样有利于程序调试阶段从串口查看打印,命令行参数格式一般如下:
console=ttyAMA0,115200n8
但是有些时候,我们希望在所登录的终端就可以查看系统消息、系统日志等输出打印,Linux 针对 tty 设备提供了 输出重定向 的功能,可以将 /dev/console 重定向(Redirecting) 到其他 tty 设备。下面就来看看怎么实现。
✨3.1 预备知识
-
ttyname
首先,认识一个函数ttyname
,可以在Ubuntu输入man ttyname
查看更多内容,这个函数返回一个指针,指向文件描述符fd上打开的终端设备的以空结尾的路径名,或者在错误时返回NULL(例如,如果fd没有连接到终端)。 -
TIOCCONS
这是用于终端的ioctl
函数的一个接口,可以Ubuntu输入man tty ioctl
查看更多内容。
TIOCCONS
会将本来会到/dev/console
或/dev/tty0
的输出重定向到给定的终端。如果这是一个伪终端主服务器,将其发送到从服务器。
如果输出已经被重定向,返回EBUSY
,但是可以通过使用这个ioctl
来停止重定向,fd指向/dev/console
或/dev/tty0
。
在2.6.10版本之前的Linux中,只要没有重定向输出,任何人都可以这样做;从2.6.10版本开始,只有具有CAP_SYS_ADMIN功能的进程才能执行此操作。
✨3.2 输出重定向代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int tty = -1;
char *tty_name = NULL;
if(argc < 2)
{
printf("miss argument\n");
return 0;
}
/* 获取当前tty名称 */
tty_name = ttyname(STDOUT_FILENO);
printf("tty_name: %s\n", tty_name);
if(!strcmp(argv[1], "on"))
{
/* 重定向console到当前tty */
tty = open(tty_name, O_RDONLY | O_WRONLY);
ioctl(tty, TIOCCONS);
perror("ioctl TIOCCONS");
}
else if(!strcmp(argv[1], "off"))
{
/* 恢复console */
tty = open("/dev/console", O_RDONLY | O_WRONLY);
ioctl(tty, TIOCCONS);
perror("ioctl TIOCCONS");
}
else
{
printf("error argument\n");
return 0;
}
close(tty);
return 0;
}
🎄四、总结
👉本文介绍了Linux系统中,tty、ttyS*、ttyAMA*、console 的区别,以及系统输出重定向,最后给出了系统输出重定向的例子代码。
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁
参考:
在Linux中,ttyS0、ttyUSB0和ttyAMA0有什么区别?
Linun开发总结之串口日志重定向
Linux中tty、pty、pts的概念区别
Linux TTY基本概念之ttys*、tty*、ttyS*、console理解
Linux下的consolen(控制台)和terminal(终端)