次を使用して端末サイズを変更します。
rc = ioctl(fd, TIOCSWINSZ, &ws);
これを Linux テキスト端末 (Alt-Ctrl-F1 で切り替える) で実行すると、期待どおりの結果が得られます。ioctl syscall によって指定された範囲内の入力と出力全体。
しかし、SSH で localhost に接続して同じプログラムを実行すると、部分的にしか機能しません。つまり、ioctl で設定された端末サイズよりも広いコマンドを入力することはできませんが、出力は ioctl で指定された端末の境界を越えることができ、入力は ioctl で設定されたよりも多くの行を取ることができます。また、自動改行やその後の改行もありません。
プログラムを直接実行したときに表示される唯一の違いは、端末 /dev/ttyN で実行され、メジャー番号は 5 です。SSH 経由でプログラムを実行すると、端末として /dev/pts/N を使用し、メジャー番号は 136 です。ということで、端末の違いで発生することがわかりました。
私の質問:
1. それは正しいですか? 理由はターミナルドライバーにありますか?
2. どうすれば修正できますか? ローカル tty 端末のように、SSH 経由で同じ動作が必要です。
ありがとう!
質問する
2210 次
1 に答える
9
通常、端末の実際の大きさをカーネル ドライバに伝えるためにTIOCSWINSZ
、tty マスター (Linux コンソール自体など) によって使用されます。xterm
tty スレーブで実行されているプログラム (つまり、アプリケーション自体) はTIOCGWINSZ
、端末のサイズを照会するために使用します。ほとんどの tty ドライバーは、他の方法でのプッシュをサポートしていません。TIOCSWINSZ
一般に、アプリケーションから tty スレーブを呼び出して、マスターにそのサイズを変更させることはできません。
などの一部の端末は、xterm
サイズ変更を要求するエスケープ シーケンスをサポートしていますが、これは単なるバイト エスケープ シーケンスであり、ioctl()
コマンドではありません。
アプリケーションが端末のサイズを強制するようにしたい場合、ポータブルにはこれを行う方法はありません。移植性に欠けますが、エスケープ シーケンスを試行TIOCSWINSZ
または送信するなど、いくつかの特別なトリックを適用できます。xterm
于 2012-07-15T10:59:47.747 に答える