GNU/Linux - tty设备介绍

在 Linux 和其他类 Unix 操作系统中,"TTY "代表 "电传打字机"。最初,TTY 指的是用于文本通信的物理电传打字机终端,但在现代用法中,它一般指在图形环境或基于文本的控制台中用于文本输入和输出的虚拟终端或终端模拟器。

每个 TTY 都提供一个用户界面,通过命令行界面(CLI)与操作系统交互。用户可以使用 TTY 运行命令、启动程序和执行各种任务。

在 Linux 中,TTY 设备在 /dev 目录中表示为特殊文件,如 /dev/tty1, /dev/tty2 等表示虚拟终端,使用文本操作模式。用户可以使用 Ctrl+Alt+Fn 组合键在虚拟终端之间切换,其中 Fn 指 F1 至 F6(或更高,取决于系统配置)功能键。比如我使用Ubuntu,F1键会新开一个图形界面登录窗口,F2键是当前界面,F3 ~ F6,会新开文本模式的tty登录界面。使用用户名和密码登录,登出使用”logout“命令,或者直接关闭终端窗口。每个终端都是独立的session,F1 ~ F6分别对应/dev/tty1 ~ /dev/tty6。

"/dev/pts/0" , "/dev/pts/1" 等表示终端模拟器使用的伪终端。它们用于图形环境或通过 SSH 或 telnet 远程访问系统。每个用户会话通常都有自己的伪终端,你多开一个控制台,就多一个伪终端。

“tty " 前缀是类 Unix 操作系统中用来表示终端设备的惯例。 "/dev/tty "及其变体("/dev/ttyS0"、"/dev/tty1 "等)代表不同类型的终端设备,每种设备都有特定的用途。

In Linux and other Unix-like operating systems, "TTY" stands for "teletypewriter." Originally, TTY referred to physical teletypewriter terminals used for text-based communication, but in modern usage, it generally refers to the virtual terminals or terminal emulators used for text input and output within a graphical environment or a text-based console.

Each TTY provides a user interface to interact with the operating system through a command-line interface (CLI). Users can run commands, launch programs, and perform various tasks using a TTY. 

In Linux, TTY devices are represented as special files in the /dev directory, such as "/dev/tty1",  "/dev/tty2", etc., for virtual terminals in text mode. Users can switch between virtual terminals using the Ctrl+Alt+Fn key combinations, where Fn refers to function keys from F1 to F6 (or higher, depending on the system configuration).

And "/dev/pts/0" ,  "/dev/pts/1" , etc., for pseudo-terminals used by terminal emulators. They are used in graphical environments or when accessing the system remotely via SSH or telnet. Each user session typically has its own pseudo-terminal.

This “tty” prefix is a convention used in Unix-like operating systems to denote terminal devices.   ”/dev/tty“ and its variants (”/dev/ttyS0“, ”/dev/tty1“, etc.) represent different types of terminal devices. Each of these devices serves a specific purpose.

Also there are some special suffixes in different environments. 

比如在x86_64 Ubuntu中,

$ ls /dev/tty*

显示的输出结果:

/dev/tty

/dev/tty0 ~ /dev/tty63

/dev/ttyprintk

/dev/ttyS0 ~ /dev/ttyS31

/dev/ttyUSB0



$ ls /dev/pts/

0  1  ptmx

$ ls /dev/ptmx

/dev/ptmx

tty0 ~ tty63,表示可用的虚拟终端。

ttyS0 ~ ttyS31,表示的是串口设备,serial port (COM0 ~ COM31),表示物理或虚拟串口(physical or virtual serial port)。这么多序号的设备节点都存在,表示的是虚拟串口。这些串口是用来和外部串口设备进行通讯的,比如modems,serial printers等。

ttyprintk是用于调试和监控(debugging and monitoring) kernel-level 事件和信息的(events and messages),将kernel log发送到缓冲区,然后使用dmesg来读取。

这里/dev/ttyUSB0是接了一个设备,serial-to-usb的串口转USB线,这个是真实存在的一个物理串口设备。

/dev/pts/0 ~ /dev/pts1 是伪终端,因为我就开了2个终端窗口,所以是数量是2。

/dev/pts/ptmx以及/dev/ptmx是master pseudo-terminal device,主伪终端设备,用来管理其他伪终端。

在i.MX93 ARM-Linux中:

# ls /dev/tty*

/dev/tty

/dev/tty0 ~ /dev/tty63

/dev/ttyGS0

/dev/ttyLP0 ~ /dev/ttyLP7   



# ls /dev/pt

ptmx  pts/



# ls /dev/ptmx

/dev/ptmx

/dev/ttyGS0 是 USB Gadget Serial device。

/dev/ttyLP0 ~ /dev/ttyLP7,是片上UART端口,DTS使能后出现设备节点。

在i.MX6UL(L) ARM-Linux中:

# ls /dev/pts

无

# ls /dev/ptmx

/dev/ptmx



# ls /dev/tty*

/dev/tty

/dev/tty0 ~ /dev/tty63

/dev/ttyGS0

/dev/ttymxc0 ~ /dev/ttymxc7 /* 片上UART,DTS使能后出现设备节点 */

/dev/ttymxc0 ~ /dev/ttymxc7, 是片上UART端口,DTS使能后出现设备节点 。

在嵌入式系统中,tty设备名会根据主芯片而产生不同。比如上面的/dev/ttymxc0 和/dev/ttyLP0。

“mxc” 表示是i.MX chip,而LP表示Low Power Uart。这是基于不同芯片系列,串行接口设备名称会不同,上面例子是i.MX family of processors的serial interface的terminal device。

除了上面介绍的,还有一些其他的tty类型设备。比如:

 ”/dev/ttyAMA*“ 表示的是树莓派(Raspberry Pi devices)设备的UART serial ports。

"/dev/ttyUSB*" 和 ”/dev/ttyACM*“ 表示USB serial ports和USB modems,和USB串口设备进行通讯。

要识别 TTY 设备,可以使用 tty 命令。它将显示与当前终端会话相关联的 TTY 设备的路径。Linux 中的 tty 命令是一个内置工具,用于显示连接到标准输入的终端的文件名。

To identify TTY devices, you can use the tty command. It will display the path of the TTY device associated with your current terminal session. The tty command in Linux is a built-in utility that displays the file name of the terminal connected to the standard input.

在用户空间的程序,就可以通过/dev/ttyXX的设备文件,虚拟的或真实的,来进行串行通讯。例如,要向串口设备写入数据,有两种方法,一种是通过shell命令,一种是使用代码编程实现。

Shell命令举例,最简单的是直接echo命令,还可以使用printf命令、文件重定向等。

$ echo "123123" > /dev/ttyS1

使用编程的方法,C、Python或Perl语言,需要先调用open函数打开文件,然后使用write函数写入数据。Python的写法:

with open('/dev/ttyX', 'w') as tty:

    tty.write("Hello, world!\n")

读取串口或其他tty设备的数据的话和写入数据类似:

$ cat /dev/ttyS1



# 文件重定向,File redirection

$ cat /dev/ttyS1 > output.txt

编程方法,Python:

with open('/dev/ttyX', 'r') as tty:

    data = tty.read()

    print(data)

C: Using low-level file operations

#include <stdio.h>

#include <fcntl.h>

#include <unistd.h>



int main() {

    int fd = open("/dev/ttyX", O_RDONLY);

    if (fd < 0) {

        perror("Error opening TTY device");

        return 1;

    }

    char buffer[1024];

    ssize_t bytes_read = read(fd, buffer, sizeof(buffer));

    if (bytes_read < 0) {

        perror("Error reading from TTY device");

        close(fd);

        return 1;

    }

    printf("Read %zd bytes: %s\n", bytes_read, buffer);

    close(fd);

    return 0;

}

请记住,从 TTY 设备读取数据通常需要等待用户输入或来自外部设备的数据,因此在数据可用之前,读取操作可能会阻塞。此外,确保拥有适当的权限来读取 TTY 设备文件。

Remember that reading from TTY devices often involves waiting for user input or data from external devices, so reading operations may block until data is available. Additionally, ensure that you have appropriate permissions to read from the TTY device file.

你可以使用系统调用(如 C 语言中的 ioctl())或命令行工具(如 stty)以编程方式控制 TTY 设备,以操作终端设置。请记住,在底层与 TTY 设备交互可能需要管理权限,直接操作 TTY 可能会破坏系统功能或造成意想不到的后果。在使用 TTY 设备等系统级组件时务必小心谨慎。

You can control TTY devices programmatically using system calls like ioctl() in C or by using command-line tools like stty to manipulate terminal settings. Keep in mind that interacting with TTY devices at a low level might require administrative privileges, and manipulating TTYs directly can potentially disrupt the functioning of your system or cause unintended consequences. Always proceed with caution when working with system-level components like TTY devices.

总的来说,Linux 中的 TTY 是指用户通过基于文本的输入和输出与操作系统交互的界面。另外,通过多种不同的 /dev/tty 设备,Linux 就能支持各种终端和串行通信方案,包括基于文本的控制台交互、串行设备通信、虚拟终端和远程访问。

Overall, TTY in Linux refers to the interface through which users interact with the operating system via text-based input and output.  And the presence of multiple ”/dev/tty“ devices allows Linux to support a wide range of terminal and serial communication scenarios, including text-based console interaction, serial device communication, virtual terminals, and remote access.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/586772.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【算法小白周赛1A】分析 - 题解与代码

题目链接&#xff1a;https://www.starrycoding.com/problem/155 题目描述 小可可最近在学数学运算&#xff01;他希望考考你&#xff0c;给你两个整数 A , B A,B A,B&#xff0c;询问 A B A\times B AB 是否是偶数。 注意&#xff0c;可能存在前导 0 0 0&#xff0c;比如…

面试题-Redis篇

什么是 Redis? Redis 是完全开源免费的&#xff0c;遵守 BSD 协议&#xff0c;是一个高性能的 key-value 数据库。 Redis 与其他 key - value 缓存产品有以下三个特点&#xff1a; Redis 支持数据的持久化&#xff0c;可以将内存中的数据保存在磁盘中&#xff0c;重启的时 …

【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、回调函数二、快速排序(Qsort)2.1 Qsort参数部分介绍2.2 不…

【Flutter】极光推送配置流程(小米厂商通道) 章二

前言 继【Flutter】极光推送配置流程(极光通道/华为厂商/IOS) 章一 并且&#xff0c;我大概率不会去修改第一篇文章的内容。 随着我自己在配置公司的项目的同时&#xff0c;我希望一直更新这个推送系列文章。 在章一配置完后&#xff0c;也是出现了一些问题&#xff0c;所以本…

【第1章】spring-mvc搭建

文章目录 前言一、准备二、搭建1.搭建2.项目结构 三、第一个Servlet程序1. jsp2. servlet3. 启动 总结 前言 Java已经进入了飞速发展的阶段&#xff0c;spring-mvc也发生了巨大的变化&#xff0c;最让人无法忍受的就是javax.servlet.* 变成了jakarta.servlet.* ps:虽然使用起来…

GPT-ArcGIS数据处理、空间分析、可视化及多案例综合应用

在数字化和智能化的浪潮中&#xff0c;GIS&#xff08;地理信息系统&#xff09;和GPT&#xff08;生成式预训练模型&#xff09;的结合正日益成为推动科研、城市规划、环境监测等领域发展的关键技术。GIS以其强大的空间数据处理、先进的空间分析工具、灵活的地图制作与可视化能…

吴恩达2022机器学习专项课程(一)7.2 逻辑回归的简化成本函数课后实验 Lab5

问题预览/关键词 二分类问题的训练集&#xff08;多特征&#xff09;绘制训练集数据的散点图自定义plot_data() Python实现逻辑回归的成本函数自定义sigmoid() 调用成本函数不同的w&#xff0c;b&#xff0c;绘制逻辑回归模型的决策边界验证哪条决策边界效果好总结 二分类问题的…

精通GDBus:Linux IPC的现代C接口

目录标题 1. GDBus介绍2. GDBus的优点3. 安装GDBus4. 使用GDBus连接到D-Bus总线实现D-Bus服务调用D-Bus方法发送和接收信号 5. 总结 在Linux环境下&#xff0c;不同的程序需要通过某种方式进行通信和协同工作。GDBus是GLib库的一部分&#xff0c;提供了一个基于GObject系统的、…

中科驭数受邀成为移动云智能芯片开放实验室首批成员企业

4月28日至29日&#xff0c;2024中国移动算力网络大会在苏州举行。大会以“算力网络点亮AI新时代”为主题&#xff0c;全面展示了中国移动最新算力网络成果与能力。中科驭数作为移动云智能芯片开放实验室首批合作伙伴&#xff0c;受邀参加入驻仪式&#xff0c;中科驭数高级副总裁…

OpenCV的图像矩(64)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV如何为等值线创建边界旋转框和椭圆(63) 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; Image Moments&#xff08;图像矩&#xff09;是 OpenCV 库中的一个…

C语言----函数

1.函数的概念 函数&#xff1a;founction c语言的程序代码都是函数组成的 c语言中的函数就是一个完成某项特定的任务的一段代码&#xff0c;这段代码有特殊的写法和调用方法 c语言中我们一般见到两种函数&#xff1a; .库函数 .自定义函数 2.库函数 有对应的头文件 #i…

Python | Leetcode Python题解之第60题排列序列

题目&#xff1a; 题解&#xff1a; class Solution:def getPermutation(self, n: int, k: int) -> str:factorial [1]for i in range(1, n):factorial.append(factorial[-1] * i)k - 1ans list()valid [1] * (n 1)for i in range(1, n 1):order k // factorial[n - …

大数据分析与内存计算学习笔记

一、Scala编程初级实践 1.计算级数&#xff1a; 请用脚本的方式编程计算并输出下列级数的前n项之和Sn&#xff0c;直到Sn刚好大于或等于q为止&#xff0c;其中q为大于0的整数&#xff0c;其值通过键盘输入。&#xff08;不使用脚本执行方式可写Java代码转换成Scala代码执行&a…

【面试经典 150 | 回溯】单词搜索

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;回溯 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回顾…

C语言实验-循环结构和选择结构

一&#xff1a; 求和:1(14)(149)(14916)…(14916…n2)? 其中n的值由键盘输入&#xff1b; #define _CRT_SECURE_NO_WARNINGS #include<stdio.h>int main() {int sum 0;int n 0;printf("请输入一个整数");scanf("%d", &n);for (int i 0; i &l…

【记录】Python3| 将 PDF 转换成 HTML/XML(✅⭐pdfminer.six)

本文将会被汇总至 【记录】Python3&#xff5c;2024年 PDF 转 XML 或 HTML 的第三方库的使用方式、测评过程以及对比结果&#xff08;汇总&#xff09;&#xff0c;更多其他工具请访问该文章查看。 注意&#xff01;pdfminer.six 和 pdfminer3k 不是同一个&#xff01;&#xf…

Java 写一个死锁的例子

public class DeadLock {public static void main(String[] args) {Object lock1 new Object();Object lock2 new Object();new Thread(new A(lock1,lock2),"线程A").start();new Thread(new B(lock1,lock2),"线程B").start();} }class A implements Run…

JAVAEE—servlet的概念及使用,使用servlet接口实现一个表白墙

文章目录 servlet的概念静态页面和动态页面servlet的作用 写出一个servlet程序目录的创建设置smart tomcat编写helloworld servlet的概念 首先我们要搞明白什么是servlet&#xff0c;servlet是一种实现动态页面的技术&#xff0c;他是由tomcat提供给程序员的一组API可以帮助程…

新版多功能在线生成收款码系统源码

相信大家已经听说过收款码三合一这个概念&#xff0c;并且在很多场景中都看到过商家开始使用这样的收款码。前台放置着一个二维码&#xff0c;上边写着“支付宝、微信、QQ扫码付款”&#xff0c;不管使用哪个软件扫码&#xff0c;都能正确识别。但是&#xff0c;我们平台发现使…

Linux 的静态库和动态库

本文目录 一、静态库1. 创建静态库2. 静态库的使用 二、动态库1. 为什么要引入动态库呢&#xff1f;2. 创建动态库3. 动态库的使用4. 查看可执行文件依赖的动态库 一、静态库 在编译程序的链接阶段&#xff0c;会将源码汇编生成的目标文件.o与引用到的库&#xff08;包括静态库…
最新文章