端末情報(ウィンドウサイズなど)はどのようにLinuxプログラムに転送されますか?

端末情報(ウィンドウサイズなど)はどのようにLinuxプログラムに転送されますか?

私が知っているのは、プロセスがデフォルトでファイル記述子0/1をstdin / stdoutに設定することです。しかし、viのようなプログラムはウィンドウサイズをどのように知ることができますか?特に、デスクトップ環境でウィンドウのサイズを自由に調整できる場合は、さらにそうです。これが信号を介してどのように送信されるのかわからないので、他のメカニズムがあるようです。

私はターミナルエミュレータについて何も知らず、これがこの問題に関連している可能性があると思います。どんなアドバイスでも助けてくれてありがとう。

ベストアンサー1

端末のサイズはカーネルの内部構造に保存され、ioctlを介してクエリおよびTIOCGWINSZ設定できますTIOCSWINSZ。詳しくはioctl_tty(2)マンページをご覧ください。

ウィンドウサイズを設定するたびにTIOCSWINSZ(たとえば、xtermGUIウィンドウのサイズを変更するときなど)、カーネルは次のSIGWINCHメッセージを送信します。フォアグラウンドプロセスグループ端末の。

アイデアは、このようなプログラムがそのvi信号をキャプチャしてウィンドウサイズを更新することですTIOCGWINSZ

xtermウィンドウサイズは通常、擬似ttyマスター(たとえば、または)を駆動するプログラムによって設定されますが、sshdttyを開くことができるすべてのプロセス(読み取り専用または書き込み専用モード)でこれを行うことができます。

これらのioctlのコマンドラインインタフェースはsttyプログラムを通じて実装されています。 (例えばstty cols 80 rows 40)。これは、固有のサイズがなく、その情報を渡す標準的な方法がない実際のシリアル端末に役立ちます。


まだ標準化されていないが、[1]、これらのどれもLinuxに限定されず、BSDやSolarisなどの他のシステムでも同様に機能します。重要な違いは背景コントロールttyのサイズを変更したいプロセスはBSDとSolarisではシグナルを受け取りますが、TIOCSWINSZLinuxではそうではありません。SIGTTOU

これらのシステムの一つで背景プロセスは、SIGWINCH制御ttyのサイズが変更されたとき、またはフォアグラウンドプロセスになると信号を受信しません。フルスクリーンプログラムは、前景で実行中または停止していると仮定し、信号に基づいてSIGCONT端末サイズを照会します(代替画面に切り替えるか、標準モードをオフにするなどの他のtty操作も含まれます)。

プロセスは、制御ttyになるためにttyに対するオープンハンドルを持つ必要はなく、制御ttyにならなくてもttyに対するオープンハンドルを持つことができます。

ttyのフォアグラウンドプロセスグループに入ることに加えて、ターミナルサイズ変更プロセスを通知する他の方法はありません。さらに、通知できる普遍的な方法はありません。その他端末パラメータの変更:編集可能な信号やイベントは生成されませtcsetattr(3)ん。select(2)

[1]標準インターフェイスは将来のPOSIXバージョンに含まれる予定で、次のように簡単に実装できる機能がtcgetwinsize含まれています。tcsetwinsizeioctl(TIOC[SG]WINSZ)ここもっと学ぶ。

おすすめ記事