web-dev-qa-db-ja.com

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デバイスでなくても、このデバイスからどのように読み取ることができますか?

2
TwITe

マスターptyからの読み取りは、同じn_tty_read()にディスパッチされます。つまり、スレーブptyと同じ_N_TTY_ラインディシプリンがマスターにアタッチされます。

読み取りシステムコールのトレース全体は、次のようなものです。

_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構成は、raw /パススルーに設定されているため、回線の規律がそこにさえないように見える場合があります;-) (unix98_pty_init()の_ptm_driver->init_termios..._初期化を参照してください)。

b)すべてのtermios ioctl(tcsetattr() -> ioctl(TCSETS)など)はスレーブに作用しますマスターptyで呼び出された場合でもtermios config( tty_mode_ioctl() in _drivers/tty/tty_ioctl.c_を参照)。

1
mosvy