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)

상황은 다음과 같은 사실로 인해 혼란스러울 수 있습니다.

ㅏ)마스터 pty에서 사용하는 termios 구성은 원시/통과로 설정되므로 줄 규칙이 존재하지 않는 것처럼 보일 수도 있습니다 ;-)( ptm_driver->init_termios...의 초기화 참조 unix98_pty_init()).

비)모든 termios ioctl( tcsetattr() -> ioctl(TCSETS)등)은 다음에서 작동합니다.노예마스터 pty에서 호출되는 경우에도 termios 구성(참조tty_mode_ioctl()존재하다 drivers/tty/tty_ioctl.c).

관련 정보