私が知っているのは、プロセスがデフォルトでファイル記述子0/1をstdin / stdoutに設定することです。しかし、viのようなプログラムはウィンドウサイズをどのように知ることができますか?特に、デスクトップ環境でウィンドウのサイズを自由に調整できる場合は、さらにそうです。これが信号を介してどのように送信されるのかわからないので、他のメカニズムがあるようです。
私はターミナルエミュレータについて何も知らず、これがこの問題に関連している可能性があると思います。どんなアドバイスでも助けてくれてありがとう。
ベストアンサー1
端末のサイズはカーネルの内部構造に保存され、ioctlを介してクエリおよびTIOCGWINSZ
設定できますTIOCSWINSZ
。詳しくはioctl_tty(2)
マンページをご覧ください。
ウィンドウサイズを設定するたびにTIOCSWINSZ
(たとえば、xterm
GUIウィンドウのサイズを変更するときなど)、カーネルは次のSIGWINCH
メッセージを送信します。フォアグラウンドプロセスグループ端末の。
アイデアは、このようなプログラムがそのvi
信号をキャプチャしてウィンドウサイズを更新することですTIOCGWINSZ
。
xterm
ウィンドウサイズは通常、擬似ttyマスター(たとえば、または)を駆動するプログラムによって設定されますが、sshd
ttyを開くことができるすべてのプロセス(読み取り専用または書き込み専用モード)でこれを行うことができます。
これらのioctlのコマンドラインインタフェースはstty
プログラムを通じて実装されています。 (例えばstty cols 80 rows 40
)。これは、固有のサイズがなく、その情報を渡す標準的な方法がない実際のシリアル端末に役立ちます。
まだ標準化されていないが、[1]、これらのどれもLinuxに限定されず、BSDやSolarisなどの他のシステムでも同様に機能します。重要な違いは背景コントロールttyのサイズを変更したいプロセスはBSDとSolarisではシグナルを受け取りますが、TIOCSWINSZ
Linuxではそうではありません。SIGTTOU
これらのシステムの一つで背景プロセスは、SIGWINCH
制御ttyのサイズが変更されたとき、またはフォアグラウンドプロセスになると信号を受信しません。フルスクリーンプログラムは、前景で実行中または停止していると仮定し、信号に基づいてSIGCONT
端末サイズを照会します(代替画面に切り替えるか、標準モードをオフにするなどの他のtty操作も含まれます)。
プロセスは、制御ttyになるためにttyに対するオープンハンドルを持つ必要はなく、制御ttyにならなくてもttyに対するオープンハンドルを持つことができます。
ttyのフォアグラウンドプロセスグループに入ることに加えて、ターミナルサイズ変更プロセスを通知する他の方法はありません。さらに、通知できる普遍的な方法はありません。その他端末パラメータの変更:編集可能な信号やイベントは生成されませtcsetattr(3)
ん。select(2)
[1]標準インターフェイスは将来のPOSIXバージョンに含まれる予定で、次のように簡単に実装できる機能がtcgetwinsize
含まれています。tcsetwinsize
ioctl(TIOC[SG]WINSZ)
ここもっと学ぶ。