터미널 에뮬레이터는 읽기 기능 없이 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)
상황은 다음과 같은 사실로 인해 혼란스러울 수 있습니다.
ㅏ)마스터 pty에서 사용하는 termios 구성은 원시/통과로 설정되므로 줄 규칙이 존재하지 않는 것처럼 보일 수도 있습니다 ;-)( ptm_driver->init_termios...
의 초기화 참조 unix98_pty_init()
).
비)모든 termios ioctl( tcsetattr() -> ioctl(TCSETS)
등)은 다음에서 작동합니다.노예마스터 pty에서 호출되는 경우에도 termios 구성(참조tty_mode_ioctl()
존재하다 drivers/tty/tty_ioctl.c
).