当前位置: 首页 > article >正文

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

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰: 2024-09-11 15:08:27

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、概念区别
    • ✨2.1 /dev/tty*
    • ✨2.2 /dev/ttyS*
    • ✨2.3 /dev/ttyAMA*
    • ✨2.4 /dev/console
    • ✨2.5 /dev/pts/*
  • 🎄三、系统输出重定向
    • ✨3.1 预备知识
    • ✨3.2 输出重定向代码实现
  • 🎄四、总结

在这里插入图片描述


在这里插入图片描述

🎄一、概述

在 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(终端)


http://www.kler.cn/a/306299.html

相关文章:

  • 第一个 Flutter 项目(1)共46节
  • LeetCode【0035】搜索插入位置
  • Vector Optimization – Stride
  • 密码学的基本原理
  • 除了 Mock.js,前端还有更方便的 Mock 数据工具吗?
  • Spring框架之观察者模式 (Observer Pattern)
  • NPM私库搭建-verdaccio(Linux)
  • 【Kubernetes】常见面试题汇总(十七)
  • Django+Vue基于OpenCV的人脸识别系统的设计与实现
  • CleanMyMac X 4.15.6正式版 mac直装破解版
  • 小阿轩yx-案例:Zabbix监控kubernetes云原生环境
  • ios 用JXCategoryView 库实现tab滑动切换viewController
  • 破解AI生成检测:如何用ChatGPT降低论文的AIGC率
  • Redis Universe: 探索无边界的数据处理星系
  • 网络安全 day6 --- 抓包技术HTTPS协议小程序PC应用WEB转发联动
  • Spring Boot-分布式系统问题
  • 运算符学习
  • Selenium元素定位:深入探索与实践
  • 【Java EE】线程安全问题的原因与解决方案
  • 滚雪球学SpringCloud[3.2讲]:Hystrix:熔断与降级详解
  • 基于JDK1.8和Maven的GeoTools 28.X源码自主构建实践
  • Python基础语法(3)下
  • 计算机毕业设计 网上体育商城系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 实验一 番外篇 虚拟机联网与DHCP服务器
  • 实战千问2大模型第三天——Qwen2-VL-7B(多模态)视频检测和批处理代码测试
  • 【UI】element ui table(表格)expand实现点击一行展开功能