转自https://feng-qi.github.io/2017/05/04/how-to-read-write-to-tty-device/

    <p>这是 StackExchange 上的一个问答,在这里翻译一下原文地址为:<br><a href="https://unix.stackexchange.com/questions/138342/how-to-read-write-to-tty-device" target="_blank" rel="noopener">How to read/write to tty* device?</a></p>

问题描述

我有一个设备通过 USB 传输信息到我的计算机。Arch Linux 通过在/dev/下建立了一个
名为ttyUSB0的文件来设置这台设备。我一直使用GTKterm来接收信息并将信息显示在一
个模拟终端窗口上。

我的问题是:GTKterm具体是怎样读/写ttyUSB0这个文件的,我从哪儿能学到实现相似
功能的技术?即,从最简单的情况来说,我怎么写一个字符到ttyUSB0,或者从它接收一
个字节并写入到文件中去?

Michael Homer 的回答

你可以像使用其他文件一样使用 TTYs 文件。你可以用你所用语言打开文件的一般方法来打
开它们并读写。他们是相比于其他“普通”文件是有一些特殊行为,但基本来说是一样的。我
会在文末说到一些特殊情况,但还是先看一些实验吧。

你可以在一个普通终端做的一件有趣的事情是,运行tty它就会打印和下面相似的一行输出:

1
/dev/pts/2

这是你的终端运行所依赖的 TTY 设备,你可以向那个终端写点什么:

1
2
3
$ echo Hello > /dev/pts/2
Hello
$

你甚至可以从它读取信息:

1
2
3
4
5
$ read X < /dev/pts/2
hello
$ echo $X
hello
$

(read Xsh用来“从标准输入读取一行并保存到变量 X”的命令;<表示使用/dev/pts/2
作为 read 命令的标准输入;第一个“hello”是我键入的,第二个是终端输出的)。

如果你用screenxterm打开另一个 shell,你可以在新打开的那个 shell 里运行
echo spooky > /dev/pts/2,这些文本会在你原来的 shell 里显示出来,对其他命令来
说也是一样的。


以下这个很简单的 C 程序就可以做到你想做的事,向/dev/pts/3写入一个字符,然后从
它那儿读取一个字节:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
char byte;
int fd = open("/dev/pts/3", O_RDWR);
write(fd, "X", 1);
ssize_t size = read(fd, &byte, 1);
printf("Read byte %c\n", byte);
return 0;
}

一个绑定到 shell 或终端模拟器的真实 TTY 设备会产生一些有趣的行为,但你应该能得到
一些反馈(get something back)。


想要存取一个终端你需要有相应的权限。这些只是标准的文件权限,就和你用ls -l看到
还有用chmod设置的一样:你需要读的权限来打开文件并读取它,写的权限来写入它。在
你终端后面的 TTY 将属于你的,但其他用户的并不,而对应于 USB 设备的TTY 可能属于也
可可能不属于你,这取决于你的配置。你可以用与平常相同的方法改变权限。

只要所写的程序可以与之正常交互,你就不需要做什么特殊的设置。你可以在例子中看到你
并不需要为了让另一头读取你写入的数据而每次都关闭文件:TTY 文件表现得像管道,只要
数据来了只管从两端传入。当我向 TTY 写文本时立马就能显示出来,所以当我后来从中读
取的时候已经没有数据等着我了。这并不跟写入一个普通文件时数据会保存到磁盘上一样——
它会直接被传送到另一端,或者保存到内存中直到被读取。

你可能会想用select这个函数,它让你可以在等待设备传入数据的做些其他事,当然如果
你就是想等待数据到来那你也可以使用阻塞的方式读取,而让操作系统做相关的调度。

需要时刻注意的一件事是内核中缓冲区的大小是有限的,如果你一次写入的数据太多可能会
导致你不希望发生的阻塞。如果这是一个问题的话,可以使用非阻塞 IO 如
open("/dev/...",O_RDWR|O_NONBLOCK)。 不管哪种方式原则都是一样的。

</div>

转 tty 设备读写的更多相关文章

  1. 对Linux内核tty设备的一点理解(转)

    虽然一直做嵌入式Linux,宿主机和开发板通信天天都在用tty设备通信,但是其实自己对TTY设备及终端的概念认识几乎是0.对于Linux内核的终端.tty.控制台等概念的认识很模糊.由于在学习的时候碰 ...

  2. 64位内核注冊tty设备

    在64位系统中,注冊tty设备须要注意的是,Android跑在EL0而且在32位模式下,kernel跑在EL1而且在64位模式下,不但内核须要打开CONFIG_COMPAT选项,非常多android上 ...

  3. Windows驱动开发-设备读写方式

    设备读写方式共三种: 方式 Flag 特点 缓冲区方式读写 DO_BUFFERED_IO I/O管理器先创建一个与用户模式数据缓冲区大小相等的系统缓冲区.而你的驱动程序将使用这个系统缓冲区工作.I/O ...

  4. linux块设备读写流程

    在学习块设备原理的时候,我最关系块设备的数据流程,从应用程序调用Read或者Write开始,数据在内核中到底是如何流通.处理的呢?然后又如何抵达具体的物理设备的呢?下面对一个带Cache功能的块设备数 ...

  5. 测试 USB 存储设备读写性能(Mb/s),平均读写速度等

    1.将U盘(USB3.0)插入被测试机器,假定识别设备为sdc2.创建vfat文件系统分区/dev/sdb1分区容量大于30GBumount /dev/sdc1mkfs -t vfat /dev/sd ...

  6. 对于Linux内核tty设备的一点理解

    http://blog.chinaunix.net/uid-7828352-id-3233064.html

  7. linux一切皆文件之tty字符设备(深入理解sshd创建pty的过程) (五)

    一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 3.块设备支 ...

  8. python读写操作文件

    with open(xxx,'r,coding='utf-8') as f:   #打开文件赋值给F ,并且执行完了之后不需要 f.close(). 在Python 2.7 及以后,with又支持同时 ...

  9. Linux驱动设计——字符设备驱动(一)

    Linux字符设别驱动结构 cdev结构体 struct cdev { struct kobject kobj; struct module *owner; const struct file_ope ...

随机推荐

  1. 顺F分享,你是在裸奔吗?

    " 对顺F旗下各APP顺藤摸瓜分析--顺F分享." 前文对顺F速运和顺F速运国际版进行了分析,二者使用同一套接口,虽然保护强度不高,但对代码和数据的保护却区别对待,实在让人诧异. ...

  2. CarTool 使用,获取图片资源

    程序:gitHub: 项目地址 使用方法: 1.拿到资源包 在itunes里找到喜欢的应用,然后下载,直接将app拖到桌面.得到一个一个ipa资源包,如图 2.将资源包改成zip格式 3.解压zip资 ...

  3. Spring/Spring boot正确集成Quartz及解决@Autowired失效问题

    周五检查以前Spring boot集成Quartz项目的时候,发现配置错误,因此通过阅读源码的方式,探索Spring正确集成Quartz的方式. 问题发现 检查去年的项目代码,发现关于QuartzJo ...

  4. springboot整合spring Data JPA

    今天敲代码,一连串的错误,我也是服气~果然,我们不是在出bug,就是在找bug的路上…… 今天完成的是springboot整合spring data JPA ,出了一连串的错,真是头大 java.sq ...

  5. 函数的名称空间,函数的嵌套(global, nonlocal),函数名的运用

    一 函数的名称空间 内置空间:存放python解释器内置函数的空间 全局空间:py文件运行时开辟的,存放的是执行的py文件(出去函数内部)的所有的变量与值的对用关系,整个py文件结束后才会消失. 局部 ...

  6. https://jwt.io/一个可以解析token的神奇网站

    网址:https://jwt.io/ 效果:

  7. [视频教程] 使用composer安装使用thinkphp6.0框架

    安装composer -vvv的参数是表示展示安装进度,测试时使用其他参数安装失败,一直卡着不动curl -vvv https://getcomposer.org/installer | phpmv ...

  8. 不能聚焦元素问题 WebDriverException: Message: unknown error: cannot focus element

    上周碰到了 Unable to locate element,即“无法定位元素”,后靠两行代码解决: wait = ui.WebDriverWait(driver,5) wait.until(lamb ...

  9. 软件工程基础团队第二次作业(团队项目-需求分析&系统设计)成绩汇总

    一.作业题目 团队第二次作业:需求分析&系统设计 二.具体要求 1.作业任务 任务一:组长组织项目组开展需求调研工作(可采取需求调查.问卷.分析已有软件.网上资料等方法).概要设计.详细设计. ...

  10. input:file样式怎样修改

    问题描述: 我需要点击input:file来修改img中的图片,但是input:file样式太丑 解决办法: 给file设置透明度为0,让用户看不见他 创建新的button按钮 修改button按钮样 ...