ターミナルエミュレータは、読み取り機能なしで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設定はraw / passに設定されているため、行ルールが存在しないように見える場合があります;-)(ptm_driver->init_termios...
の初期化を参照unix98_pty_init()
)。
雨)すべてのtermios ioctl(tcsetattr() -> ioctl(TCSETS)
など)は以下で動作します。奴隷マスターptyから呼び出された場合でもtermiosの設定(参照tty_mode_ioctl()
存在するdrivers/tty/tty_ioctl.c
)。