愚かな端末agettyキーボードレイアウトフィルタ

愚かな端末agettyキーボードレイアウトフィルタ

私は最近古いHeathkit Dum Terminalを購入しましたが、それをcolemakキーボードレイアウトで使用したいと思います。端末がシリアルを介して直接ASCIIコードを送信するので、それがうまくいくとはloadkeys思いません。 (ある場合はいレイアウトを変更する簡単なソリューションを知りたいです。 )

私の現在の計画は、単純なソフトウェアで受信または送信されるすべてのバイトをフィルタリングすることです。 (正しく設定されているにもかかわらず)互換性のないエスケープコードをまだ使用しているいくつかのコマンドラインプログラムもありTERM、これらのプログラムも手動でフィルタリングしたいと思います。

本質的に、私はagettyと端末の間にあり、バイトが送受信されると手動でバイトをフィルタリングできるプログラムを作成したいと思います。

バイトフィルタリングは非常に簡単ですが、これを行うことができるagettyインタフェースを作成する方法がわかりません。独自のデバイスを作成する必要がありますかmknod

(また、バイトを読み込み、新しいバイトを書き込むためにターミナルとLinuxシステムの間にあるマイクロコントローラまたはRaspberry Piを使用することを検討しました。

見たり読んだりする場所の提案はとても役に立ちます。

答え1

一部の「愚かな」端末には、端末の「BIOS設定」に似た設定メニューが組み込まれています。これらの設定には通常、キーボードレイアウトの選択が含まれます。しかし、ヒスケット端末(どんなモデルですか?)おそらく古い学校です。端末にキーボードレイアウトを切り替えるメカニズムがあっても、Colemakレイアウトは2006年頃に開発されたため、これを提供する可能性はほとんどありません。

agetty- またはすべてのgettyプロセス - initTTYデバイスを初期化し、適切なリセットコードを端末に送信し、ログインプロンプトを表示し、ユーザー名を取得する(またはPID#1は何でも)起動します。完了すると、ユーザーからパスワードを取得するプロセスになりますgettyexec()login

しかし注意してください。これは+exec()ではなくただです。したがって、セッションを開始するタスクが完了すると、そのプロセスは消え、最終的にユーザーのシェルに置き換えられます。ユーザーのセッションが終了すると、TTY デバイスにプロセスがなくなったことが検出され、プロセスを再開するために別のインスタンスが起動されます。fork()exec()gettylogininitgetty

したがって、端末からのすべての着信文字をフィルタリングし続けるには、セッション全体で同じままにする必要があります。ユーザーセッションが終了したら、init次のログインセッションのために新しいインスタンスを起動できるように、プロセスが消えたい場合があります。

プログラムの操作中に実際のシリアルポートTTYデバイスが使用されるため、TTYデバイスインターフェイスもコピーする必要があります。 2つの別々のプログラムが同じシリアルポートを同時に読み取ろうとすると、悲劇が発生します。幸い、最初から始める必要はありません。 TTYインターフェースのコピーは正確に擬似TTYはい。望むよりman 3 openpty

このようにデバイス設定を初期化し、適切なリセットコードを端末に送信する必要がありますagetty。これにより、プログラムはログインプロンプトを表示し、文字フィルタリングループを初期化します。ユーザー名プロンプトへの応答を受け取ったら、疑似TTY、fork()+疑似TTYの「スレーブ」側に接続し、フィルタリングされた文字を実際の端末からマスター側の医師に渡し始めるプログラムを要求する必要がありますexec()login-TTY。擬似TTYから実際の端末に返されたTTYおよびフィルタリングされていない出力。

プログラムは、TTYデバイスでデータを積極的に待機しながらCPUサイクルを無駄にしないでください。代わりに、またはシステムコールを使用してデータがselect(2)処理poll(2)されるまで効率的に待つ必要があります。

読書ttysnoopパッケージソースコードTTYセッションを記録するには、同様の操作を実行する必要があるため、便利です。

関連情報