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

news2024/9/24 20:46:43

😁博客主页😁:🚀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.coloradmin.cn/o/2126139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT实现TCP/UDP通信

服务器端&#xff1a; 客户端&#xff1a; 服务器&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QMessageBox> #include <QDebug&…

哈喽GPT-4o,现代程序员提高编码能力的正确打开方式

目录 round 1&#xff1a;图片识别能力ChatGPT4oClaude3.5 Sonnet图片识别能力小结&#xff1a;图片识别能力&#xff0c;ChatGPT4o完胜。 round 2&#xff1a;代码能力ChatGPT4oClaude3.5 Sonnet代码能力小结&#xff1a;代码能力&#xff0c;Claude3.5 Sonnet小胜。 round 3&…

一个人,如何管理上百个污水处理站?

管理上百个污水处理站&#xff0c;无疑是一项复杂而艰巨的任务&#xff0c;它不仅要求管理者具备深厚的专业知识、卓越的组织协调能力&#xff0c;还依赖于先进的技术支持与科学的管理模式。以下几点策略&#xff0c;可为高效管理众多污水处理站提供参考框架&#xff1a; 1. 部…

Unity+LeapMotion2的使用

开始吧 导入步骤1.到官网下载软件并安装2.安装插件3.场景中添加检测管理器4.场景中添加手部模型 更多细节 导入步骤 1.到官网下载软件并安装 地址 重启电脑后连接设备 可以看到连接成功 2.安装插件 &#xff08;也可以看官方教程&#xff09; Project—>PackageManag…

9.9日记录

1.常见排序算法的复杂度 1.快速排序 1.1快速排序为什么快 从名称上就能看出&#xff0c;快速排序在效率方面应该具有一定的优势。尽管快速排序的平均时间复杂度与“归并排序”和“堆排序”相同&#xff0c;但通常快速排序的效率更高&#xff0c;主要有以下原因。 出现最差情况…

DC 板 boot 测 nor 兼容性记录(qspi )

DC 板 boot 测 nor 兼容性记录&#xff08;qspi &#xff09; 软件问题&#xff1a; 1、DC板在跑 qspi时&#xff0c;在跑ddr 初始化部分需要修改以下参数&#xff0c;否则会在fsbl stage1 或者 stage 3 出错。 Board配置选 ad101_v10&#xff1b; 2、由于socket与DC板接触可能…

22. Revit API: 几何对象(三)- Solid操作

一、前言 几何对象中&#xff0c;Face就先跳过了&#xff0c;这里讲讲如何使用 Revit API 中 Solid 操作相关类。 使用SolidUtils&#xff0c;主要是复制和移动。使用GeometryCreationUtilities&#xff0c;生成Solid。使用SolidSolidCutUtils和BooleanOperationsUtils&#…

Python 从入门到实战14(字符串相关操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了字符串进行简单说明。今天继续讨论字符…

斗地主之顺子

题目描述 在斗地主扑克牌游戏中&#xff0c;扑克牌由小到大的顺序为:3,4,5.6,7.8,9,10,J,Q,K,A,2&#xff0c;玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。 其中顺子的出牌规则为:由至少5张由小到大连续递增的扑克牌组成&#xff0c;且不能包含2。 例如:(3.4.…

【Windows系统工具】dll综合解决工具,解锁专业版功能!

电脑上经常会出现dll文件丢失的情况&#xff0c;那么面对这种情况&#xff0c;小白用户应该如何应对并且解决呢&#xff1f; 这时&#xff0c;不得不提出dll综合解决工具的重要性了。虽然电脑上有很多自带的工具可以使用&#xff0c;但是方法步骤都比较复杂&#xff0c;很多小白…

day4 QT

作业 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), speech(new QTextToSpeech) {ui->setupUi(this);id startTimer(1000); }Widget::~Widget() {delete ui; }void Widget::tim…

从C语言过渡到C++

&#x1f4d4;个人主页&#x1f4da;&#xff1a;秋邱-CSDN博客☀️专属专栏✨&#xff1a;C &#x1f3c5;往期回顾&#x1f3c6;&#xff1a;单链表实现&#xff1a;从理论到代码-CSDN博客&#x1f31f;其他专栏&#x1f31f;&#xff1a;C语言_秋邱的博客-CSDN博客 目录 ​…

常用的 CMD 指令及其功能

目录 1&#xff1a;Win R命令。 2&#xff1a;cmd命令。 3&#xff1a;盘符名: 命令。 4: mkdir命令。 5&#xff1a;dir命令。 6: dir 名称。 7&#xff1a;Tab。 8&#xff1a;cd name。 9: copy con 文件的名字。 10: type 文件名。 11: cd .. 命令。 12&a…

分享 6 款在日常电脑办公中频繁使用的软件

分享6款经常能用到的电脑办公软件&#xff0c;个个功能强大又易用&#xff0c;装进电脑可以提高工作效率&#xff0c;让你每天准点下班~ 1、Dropit 这个软件真的很给力&#xff0c;特别适合我们这种平时电脑桌面上乱七八糟的人。你知道的&#xff0c;有时候下载各种东西&…

自然语言处理系列六十八》搜索引擎项目实战》搜索引擎系统架构设计

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十八搜索引擎项目实战》搜索引擎系统架构设计…

【人工智能】Transformers之Pipeline(十七):文本分类(text-classification)

目录 一、引言 二、文本分类&#xff08;text-classification&#xff09; 2.1 概述 2.2 DistilBERT—BERT 的精简版&#xff1a;更小、更快、更便宜、更轻便 2.3 应用场景​​​​​​​ 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 …

布偶猫应该喂什么猫罐头:交响乐金罐、希喂、尾巴生活测评

布偶猫&#xff0c;萌宠界的甜心代表&#xff0c;爱撒娇又黏人。想让它健康成长&#xff1f;喂养是关键。选粮不当&#xff0c;健康受损。今日精选三款热门主食罐&#xff0c;依据布偶猫营养需求&#xff0c;直接评测&#xff0c;助你快速了解何为理想之选。无需繁琐&#xff0…

状态机按键消抖(学习笔记)

状态转移图&#xff1a; module key_filter(Clk,Reset_n,Key, // Key_P_Flag, // Key_R_Flag,Key_Flag,Key_state);input Clk;input Reset_n;input Key; // output reg Key_P_Flag; // output reg Key_R_Flag;output Key_Flag;output reg Key_state; reg Key_P_…

002 JavaClent操作RabbitMQ

Java Client操作RabbitMQ 文章目录 Java Client操作RabbitMQ1.pom依赖2.连接工具类3.简单模式4.工作队列模式&#xff08;work&#xff09;公平调度示例 5.发布/订阅模式&#xff08;fanout&#xff09;交换机绑定示例代码 6.路由模式&#xff08;direct&#xff09;7.Topic匹配…

RQ-RAG:提升检索增强生成模型的查询精炼能力

人工智能咨询培训老师叶梓 转载标明出处 大模型在面对未见场景时&#xff0c;往往会产生不准确或虚构的回答&#xff0c;这限制了它们的实用性。为了解决这一问题&#xff0c;香港科技大学、香港理工大学和麻省理工学院的研究团队提出了一种名为RQ-RAG&#xff08;Retrieval-A…