キーを押すと,キーボードコントローラーがスキャンコードをカーネルのキーボード ドライバー に送付します.キーボードの中にはプログラム可能な物もありますが, キーとスキャンコードの対応は固定となっているのが普通です.カーネルのキーボー ドドライバーは,受け取った情報をそのままアプリケーションに伝達する役割を果た します(スキャンコードモードの場合.X 使用時など).またキーボードドライバー は,キーが押されたか・はなされたかに応じ, スキャンコードの流れをキーコード にパースする機能をも果たしています(キーを一つ押す毎に,6つのスキャンコード を生成します).
こうしてつくられたキーコードは,アプリションに引き渡されます
(キーコードモードの時.例えば showkey
がこれを用いています)
キーコードモード以外の場合には,キーコードをキーマップの中で検索し,
対応する文字・文字列をアプリケーションに引き渡したり,キーマップに
記述されている命令を実行する作業が行われます.
(例:あるキーを押した時に,キーボードがスキャンコード 0x1e, 0x9e を生成した場合を考えてみましょう.このコードはキーコード 30,158 に変換 されます.ついでこれは 0141, すなわち ASCII あるいはlatin-1 コード 'a'に置き 換えられます.削除キーを押し,再びこれをはなすと,キーボード はスキャンコー ド 0xe0 0x53 0xe0 0xd3 を生成し, これはキーコード 111,239 に変換され,ついで ESC [ 3 という4文字からなる文字列に置き換えられます.この二例は いずれも,US キーボード,初期設定状態のキーマップを前提としたものです. 特定の命令をキーコンビネーションに割り振った例には,Ctrl-Alt-Del があります)
setkeycodes
というユーティリティーを利用すれば,スキャンコードと
キーコードとの対応を変更できます.しかし,こうした作業が必要になることは稀でしょう.
キーコードと文字・文字列・命令との対応,すなわちキーマップを変更する場合には,
loadkeys
というユーティリティー を用います.詳しいことについては,
getkeycodes(8), setkeycodes(8), dumpkeys(1), loadkeys(1)
の
各マニュアルページをご覧ください.
上で「アプリケーションに引き渡す」と表現したことを正確に言えば「端末ドライバ
ーに引き渡す」ということになります.つまりここから先は,シリアルケーブルを通
じて送致されたテキストの場合と全く同じように処理されることになるのです.この
処理を詳細に規定しているのは,stty
というプログラムです.