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

四、伪终端操作函数

五、查看tty设备关联的进程

lsof /dev/pts/0

分类: tty设备

0 条评论

发表回复

您的电子邮箱地址不会被公开。