PTY主机缺少读功能

PTY主机缺少读功能

终端模拟器在缺少读取功能的情况下如何从 ptm 设备读取数据?有一个 PTY 驱动程序:https://github.com/torvalds/linux/blob/master/drivers/tty/pty.c。我看到 pty_write 函数,但看不到类似pty_read()函数的东西。据我了解,pty从机不需要读取功能,因为它是一个TTY设备,有自己的读取缓冲区。因此,在 tty 线路纪律中读取相应的方法:https://github.com/torvalds/linux/blob/master/drivers/tty/n_tty.c#L2132

但是主设备呢?当该设备甚至不是通用 tty 设备时,终端仿真器如何读取该设备?

答案1

来自主 pty 的读取将被分派到相同的n_tty_read(),即,N_TTY与从 pty 相同的线路规则被附加到主 pty。

读取系统调用的整个跟踪类似于:

sys_read() -> ksys_read() -> vfs_read() -> __vfs_read()
  -> file->f_op->read = tty_fops.read -> tty_read()
    -> ld->ops->read = n_tty_ops.read -> n_tty_read()

并且生产线纪律通过以下方式连接到主 pty

ptmx_open()
  -> tty_init_dev()
     -> alloc_tty_struct()
        -> tty_ldisc_init()
           -> tty_ldisc_get(tty, N_TTY)

情况可能会因以下事实而令人困惑:

A)主 pty 使用的 termios 配置设置为原始/直通,因此可能看起来线路规则甚至不存在;-)(请参阅ptm_driver->init_termios...中的初始化unix98_pty_init())。

b)所有 termios ioctl(tcsetattr() -> ioctl(TCSETS)等)都会作用于奴隶的termios 配置,即使在 master pty 上调用时也是如此(请参阅tty_mode_ioctl()drivers/tty/tty_ioctl.c)。

相关内容