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設定はraw / passに設定されているため、行ルールが存在しないように見える場合があります;-)(ptm_driver->init_termios...の初期化を参照unix98_pty_init())。

雨)すべてのtermios ioctl(tcsetattr() -> ioctl(TCSETS)など)は以下で動作します。奴隷マスターptyから呼び出された場合でもtermiosの設定(参照tty_mode_ioctl()存在するdrivers/tty/tty_ioctl.c)。

おすすめ記事