ターミナルエミュレータは、読み取り機能がないときに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デバイスでなくても、このデバイスからどのように読み取ることができますか?
マスター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
_を参照)。