终端模拟器在缺少读取功能的情况下如何从 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
)。