https://blog.csdn.net/wangjun7121/article/details/88658233
https://blog.csdn.net/weixin_43025343/article/details/130917034(***)
https://zhuanlan.zhihu.com/p/515515169?utm_id=0
https://www.yii666.com/blog/339078.html (深入到驱动)
https://blog.csdn.net/dong__ge/article/details/128541977
https://blog.csdn.net/todd911/article/details/8025540
https://blog.csdn.net/ch122633/article/details/126855929
https://blog.csdn.net/wang11876/article/details/131300100
https://www.cnblogs.com/aozhejin/p/16065019.html
目录
一、常见tty设备类型
https://blog.csdn.net/HandsomeHong/article/details/80915669
https://www.cnblogs.com/aozhejin/p/16065019.html
1.tty设备分类
- /dev/ttySn (串行端口终端)
串行终端,串口设备对应的终端。
- /dev/ttyn (虚拟终端)
例如ubuntu不启动图形界面时,那么就会默认连接到/dev/tty1这个虚拟终端。
- /dev/tty (控制终端/当前终端)
即当前用户正在使用的终端,是一个映射(类似于软链接),指向当前所使用的终端(例如/dev/tty1,/dev/pts/0)
表示当前tty设备,当前终端。如果你用串口登录的设备就是串口终端,如果你用ssh登录的的设备就是ssh终端,如果你用adb登录的设备就是adb终端.
往/dev/tty下写数据总是写到当前终端。
通过tty命令可以查看当前tty设备的实际设备。
- pty(伪终端)
Ubuntu的terminal终端、ssh的远程终端等都是伪终端
伪终端架构(master-slave):https://blog.csdn.net/wang11876/article/details/131300100
https://www.cnblogs.com/aozhejin/p/16065019.html
https://www.php.cn/faq/382655.html
伪终端的两种标准:
https://www.cnblogs.com/MrVolleyball/p/10024540.html
● pty是一对虚拟的字符设备,提供双向通信。pty一般由master与slave组成
● pty的出现是为了满足现在的登陆需求:网络登陆(ssh登陆、telnet登陆等)、Xwindow等
● 历史上有两套接口标准:分别是BSD与unix98,当前大多数pts都是基于unix98标准来实现的
/dev/pts/n
/dev/pts/X(X 是一个数字编号,譬如 0、1、2、3 等)设备节点:这类设备节点是伪终端对应的设备节点,也就是说,伪终端对应的设备节点都在/dev/pts 目录下、以数字编号命令。譬如我们通过ssh 或 Telnet 这些远程登录协议登录到开发板主机,那么开发板 Linux 系统会在/dev/pts 目录下生成一个设备节点,这个设备节点便对应伪终端。
/dev/pty[p-za-e][0-9a-f]
unix98实现的sshd pty
https://www.cnblogs.com/MrVolleyball/p/10024540.html
/dev/ptmx与/dev/pts是一对多的关系
- /dev/console (应用层的控制台)
一些进程的打印信息会输出到控制台。在用户层和内核都有一个console,分别对应printf和printk的输出。kernel下的console是输入输出设备driver中实现的简单的输出console,只实现write函数,并且是直接输出到设备。user空间下的console,实际就是tty的一个特殊实现,大多数操作函数都继承tty,所以对于console的读写,都是由kernel的tty层来最终发送到设备。
2.往各tty终端发送数据
- 往/dev/ttyn, /dev/pts/n, /dev/ptyn, /dev/ttySn会写到对应的终端上去。
- 往/dev/tty上写则会写到当前终端。
- /dev/console
往/dev/console写情况则不太一样
1.在ubuntu上测试时(没启动图像界面,启动的/dev/tty1)会写到/dev/tty1。
2.板子上则会写到/dev/ttyS0,不同的板子终端名称可能不一样,但一般都是/dev/tty*[0-9]
二、tty重定向
https://blog.csdn.net/u010261063/article/details/108483991
https://blog.csdn.net/longyuelang/article/details/130754290
- 将/dev/console重定向到当前tty上
#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;
}
redirect 定义在 drivers/tty/tty_io.c
中, tioccons 函数对应于 tty ioctl 的 TIOCCONS 命令。
三、读写tty设备
https://blog.csdn.net/weixin_44316455/article/details/134670734
四、伪终端操作函数
-
创建一个伪终端对(openpty)
https://blog.51cto.com/u_15676268/10724040 -
获取终端名称(ttyname/ttyname_r)
https://blog.csdn.net/yehenhei/article/details/52783218
https://blog.csdn.net/canpool/article/details/121804161
五、查看tty设备关联的进程
lsof /dev/pts/0
0 条评论