【Linux C | 终端设备】Linux下 tty、ttyS*、ttyAMA*、console 的区别,以及系统输出重定向(附带代码)

😁博客主页😁:🚀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+F1Ctrl+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(终端)

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wkd_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值