次のページ 前のページ 目次へ

8. 知っておくとよい便利なプログラム

getty に関する情報のほとんどは Modem-HOWTO に移動しました。 端末に直接接続する getty の使用法に関する情報が Text-Terminal-HOWTO に 少し書かれています。

8.1 シリアルポートの監視/診断用のプログラム

各種モデム制御線を監視し、これが正(1 または緑)であるか負(0 または赤) であるかを示すプログラムがいくつかあります。

これらのプログラムのいくつかは既に使えるようになっているかもしれません。 そうでない場合には、 シリアル用ソフトウェア から入手してください。1998 年 6 月の時点では、筆者は Linux 用のシリア ルポート監視プログラムを知りません。

8.2 割り込みの優先度の変更

8.3 setserial とは何か?

この節は 3 つの HOWTO(Modem, Serial, Text-Terminal)に入っています。 HOWTO によって内容が多少異なります。

はじめに

ラップトップ機(PCMCIA)では絶対に setserial を使わないでください。 setserial は、シリアルポートの I/O アドレスやポートの ハードウェアに設定されている割り込み(IRQ)、使用している UART の種類等 をデバイスドライバのソフトウェアに伝えられるようにするプログラムです。 このプログラムは、現在ドライバに設定されている内容の表示も行います。 加えて、 ハードウェアを探査して UART の種類や IRQ を調べさせることもできますが、 これには厳しい制限があります。 探査の節を見てください。 setserial は PnP シリアルポートのハードウェアの IRQ 等を設定でき ない点に注意してください。

組み込みのシリアルポートが 1 つか 2 つしかなければ、普通は setserial を使わなくても正しく設定されます。シリアルポートがこれ以上ある場合(ま たはシリアルポートに問題がある場合)には、setserial を使う必要があるで しょう。 setserial のマニュアルページ以外にも、 /usr/doc/setserial...//usr/share/doc/setserial の情報を調べてください。お使いの Linux ディストリビューションでの setserial の扱いが書かれているはずです。

setserial はドライバに IRQ 等を割り当てるために、多くの場合は起動 時に起動スクリプトが自動的に実行します。 setserial は serial モジュールがロードされている場合(または同等の 機能がカーネル構築時に組み込まれている場合)にしか動作しません。 (何らかの理由で)serial モジュールを後からアンロードする と、カーネルは以前に setserial で行った設定を忘れます。 したがって、設定を元に戻すためには setserial を再び実行しなければ なりません。起動 スクリプト経由での実行に加え、serial モジュール(など)がロードされた時 には setserial に似た何らかのプログラムも実行されます。 したがって、画面上で 起動メッセージを見る時に setserial が 2 度実行されたように見える かもしれませんが、実際に 2 度実行されているのです。

setserial を使って、ポートがクローズされた後に動作し続ける時間を設定す ることができます(これは、メイン RAM 上のバッファにまだ残っている文字を 全て出力させるためです)。この設定はボーレートが遅い(1200 以下)場合には 必要です。また「フロー制御」によるウェイトが多くかかる場合には、速度が 速くても必要となります。 マニュアルページの "closing_wait" を見てください。

setserial は、シリアルポートのハードウェアそのものの IRQ や I/O アドレスの設定は行いません。ハードウェアの設定は、ジャンパまたはプラグ &プレイで行います。setserial には、ハードウェアに既に設定され ているのと同じ値を指定しなければなりません。使えると思うアドレスを勝手 にでっちあげて、それを setserial に教えてはいけません。しかし、I/O ア ドレスが分かっているけれど IRQ が分からない場合には、setserial に IRQ を調べるように指示することもできます。

使用可能なコマンドの一覧は、単に引き数無しで setserial を実行すれ ば表示されます。このコマンドは、トラブル処理の際に普通使う詳細表示 オプションである -v のような 1 文字オプションは表示できません。 setserial では I/O アドレスのことを「ポート」と呼ぶ点に注意してく ださい。

setserial -g /dev/ttyS*
を実行すると、そのポートに関するデバイスドライバの設定状況が表示されま す。詳しい情報を表示させるには "-g" オプションに "-a" を追加します。 ただし、ほとんどの人はこの追加の情報を扱う(あるいは理解する)必要はありま せん。なぜなら普通はデフォルトの設定で十分だからです。普通の場合は、 ハードウェアは "setserial" が報告するのと同じ設定になっていますが、 問題がある場合には、"setserial" が間違っている可能性が高いでしょう。 実際、setserial を実行して全く嘘の I/O ポートアドレスや IRQ, UART を設定することができます。それ以降に "setserial ..." を実行すると、この嘘 の値がエラーメッセージもなしに表示されます。もちろん、このような間違っ た値ではシリアルポートドライバは(動くとしても)正しく動作しません。

setserial による設定は PC の電源を切ると消えますが、PC の電源を再 び入れた時には設定ファイルの情報(または前の設定)が残っているかもしれま せん。最近のバージョンでは setserial を使って変更した設定は自動的 に設定ファイルに保存されます。古いバージョンでは、設定ファイルはユーザ が手で編集した時しか内容が変わらないので、何度起動しても同じ設定が使わ れます。 設定スクリプト/ファイルの節を 見てください。

探査

適切なオプションを使えば、setserial は(指定された I/O アドレス について)シリアルポートを探査できますが、そのためには I/O アドレスを推 定しなければなりません。例えば setserial に /dev/ttyS2 を探査させ ると、setserial は ttyS2 があるとコマンド自身が思っているアドレス (2F8)しか探査しません。ttyS2 が別のアドレスにあることを setserial に指示した場合は、setserial はそのアドレスを探査します。 探査の節を見てください。

setserial の目的は UART がそこにあるかどうか調べ、もし UART が あればその IRQ を調べることです。"setserial" は最後の手段として使って ください。というのも、こういったことを行うにはもっと早い方法 (モデムの検出に wvdialconf を使ったり、起動メッセージのごく最初の部分 を見たり、pnpdump --dumpregs を使う等)があるからです。 物理的なハードウェアの検出を試す場合に は、setserial の -v オプション(詳細表示)と autoconfig コマン ドを使ってください。得られる出力が 16550A といった UART の種類であれば 成功です。逆に UART の種類について "unknown" と表示された場合には、 その I/O アドレスにはシリアルポートは全くないと思われます。一部の安物 のシリアルポートはうまく認識されないので、"unknown" と表示されて もそこにシリアルポートが存在することもあります。

setserial は UART の種類の自動検出以外にも IRQ の自動検出ができますが、 これも必ずしも正しく動作するとは限りません。バージョン 2.15 以上の setserial では最後の探査の結果は保存され、設定ファイル /etc/serial.conf に格納されるかもしれません。 このファイルは、次に Linux を起動する時に使われます。 起動時に serial モジュールがロードされる等した時は、UART の探査は 自動的に行われ、その結果が画面に出力されます。 しかし、表示される IRQ は間違っているかもしれません。 同じものをもう一度出力させた時に得られるのは、普通は探査を行わず、 したがってハードウェアの実際の設定について信頼できる情報を出力しない スクリプトの実行結果です。 単に誰かがスクリプトに書き込んだ設定データか /etc/serial.conf に保存さ れた設定データが表示されているだけです。

2 つのシリアルポートのハードウェアに同じ I/O アドレスが設定されている ことがあります。もちろんこれは認められていないのですが、実際にそういう ことは起こります。一つのアドレスに実際にシリアルポートが 2 つある時も、 探査では一つのシリアルポートしか検出されません。しかし、違う IRQ が設 定してあれば、IRQ の探査で IRQ = 0 が表示されるかもしれません。筆者の 場合は、こうなったのは最初に setserial を使って嘘の値を設定した時 だけです。

起動時の設定

カーネルが serial モジュールをロードする時(または「モジュール相当 のもの」がカーネルに組み込まれている場合)には、ttyS{0-3} だけが 自動検出され、ドライバは IRQ 4 と 3 しか使わないように設定されます( ハードウェアに実際に設定されている IRQ に関わらず)。これは setserial を実行したときのように、起動メッセージとして表示されま す。3 つ以上のシリアルポートを使っていると、IRQ の衝突が起きてしまうか もしれません。

正しい IRQ を setserial に教えてこういった衝突を回避するために(あるい は別の理由のために)、setserial を再び実行するファイルがどこかにあ るかもしれません。これはシリアルポートを使う他のどのプロセスよりも前に、 起動の最初の方のステップで実行されます。実際、読者の皆さんが使っている ディストリビューションでも、起動時に setserial プログラムが起動スクリ プトから自動的に実行されるように設定されているかもしれません。 お使いのディストリビューションでの扱い方についての詳しい説明は、 /usr/doc/ や /usr/share/doc/ というディレクトリにある "setserial..." のような名前のファイルに書かれているかもしれません。

設定スクリプト/ファイル

ここでの目的は /etc ツリーにあって起動時に setserial を実行する スクリプトを修正(または作成)することです。ほとんどの ディストリビューションにはそのためのファイルが付属しています(しかし最 初は /etc ツリーに置かれていないかもしれません)。さらに、バージョン 2.15 以降の setserial は大抵 /etc/serial.conf ファイルを持っています。 これは setserial を実行するスクリプトが使うファイルで、ユーザが スクリプトを直接編集する必要をなくすためのものです。さらに、 (バージョン 2.15 以降では)コマンドラインから setserial を使うだけで 最終的に設定ファイルを変更できます。

したがって、バージョン 2.15 より前ならばすべきことはスクリプトを編集す ることだけです。バージョン 2.15 以降では、次の 3 つの作業のどれかを行えば 大丈夫です: 1. スクリプトを編集する。 2. /etc/serial.conf を編集する。 3. コマンドラインから "setserial" を実行し、自動的に /etc/serial.conf を編集させる。このうちのどれを使う必要がある かは、お使いのディストリビューションや設定の方法によります。

スクリプトの編集 (バージョン 2.15 以降ではたぶん使いません)

setserial のバージョンが 2.15 (1999年)より前の場合、setserial の 設定には /etc/serial.conf は使われません。したがって、起動時に "setserial" を実行しているファイルを探し、これを編集する必要があります。 このようなファイルが存在しなければ、新しく作る(または起動の初期段階に 実行されるファイルにコマンドを追加する)必要があります。このようなファイルが現在 使われているなら、/etc ディレクトリツリー内のどこかにあるでしょう。し かし、バージョン 6.0 より前の RedHat ではこのファイルは /usr/doc/setserial/ に置かれているので、使う前には /etc ツリーに移動さ せる必要があります。このようなファイルを見つけるには "locate" コマンド を使うとよいでしょう。例えば、'locate "*serial*" ' のように入力します。

以前は /etc/rc.d/rc.serial というスクリプトが一般的に使われて いました。Debian は /etc/rc.boot/0setserial を使っていました。 かつては /etc/rc.d/rc.local というファイルも使われていま したが、このファイルはあまり早くは実行されないので、適切とは言えませ んでした。rc.local が実行されるよりも前に他のプロセスがシリアルポート をオープンしようとして、シリアル通信が失敗するという問題が報告されまし た。

このようなファイルが用意されていれば、その中にはコメントアウトさ れた指定例がたくさん入っているはずです。これらの一部をアンコメントした り修正することにより、正しい設定を行えるはずです。 setserial へのパスが正しいことと、デバイス名が正しいことを確かめ てください。このファイルを手で実行して(単にスーパーユーザとしてファイ ル名を入力します)正しく動作するかどうか調べることにより、テストを行う ことができます。こういったテストは何度も再起動して正しい設定にするより もずっと早く行えます。もちろん、コマンドラインから setserial を実 行することによりコマンド単独のテストも行えます。

ttyS3 について UART や IRQ を自動的に setserial に調べさせたければ、 以下のような指定を追加します。

/sbin/setserial /dev/ttyS3 auto_irq skip_test autoconfig
自動的に設定したい全てのシリアルポートに対してこれを行ってください。実 際にマシン上に存在するデバイス名を必ず使ってください。場合によっては、 これはハードウェアのせいで正しく動作しないので、IRQ や UART の実際の 設定がわかっているのなら、"setserial" を使って明示的にこれらの値を割り 当てるとよいでしょう。例えば、

/sbin/setserial /dev/ttyS3 irq 5 uart 16550A  skip_test 
のようにします。

バージョンが 2.15 以降の場合(お使いのディストリビューションが変更を行っ ている場合。RedHat は行っていません)には、これを行うのは比較的面倒 かもしれません。というのも、起動時に setserial を実行するファイル である /etc/init.d/setserial 等はユーザが編集するためのファイルではな いからです。 /etc/serial.conf を用いる新しい設定方法 の節を見てください。

/etc/serial.conf を用いる新しい設定方法

バージョン 2.15 より前の setserial では、setserial の設定方法は、 起動時に setserial を実行するシェルスクリプトを手で編集することでした。 スクリプトの編集 (バージョン 2.15 以降ではたぶん使いません) の節を見てください。 バージョン 2.15 (1999 年) 以降の setserial では、この シェルスクリプトは編集されないことになり、設定ファイルである /etc/serial.conf からデータを読み込むようになりました。 さらには serial.conf を編集する必要さえないこともあります。 なぜなら、"setserial" コマンドをコマンドラインで使うと、 serial.conf は自動的にきちんと編集されるからです。

この方式なら、わざわざ設定(あるいは設定変更)のためにファイルを編集しな くても、Linux を起動する度に setserial を正しく動作させられます。 ただし大きな落とし穴があります。というのも、serial.conf を編集する のは実際には "setserial" ではないということです。ディストリビューション ごとに扱いが違うため話はなおさらややこしくなっています。 さらに、動作を変えるためにユーザが serial.conf を編集することもできます。

よく起こるのはこういうことです: ユーザが PC をシャットダウンした時、 起動時に "setserial" を実行するスクリプトは再び実行されますが、今回は "stop" の分岐に書かれている部分しか実行しません。この部分は "setserial" を使って "setserial" の現在の状態を調べ、この情報を serial.conf ファイルに書き込みます。したがって、"setserial" を実行して serial.conf ファイルを変更しようとしても、変更は即座に行わ れるのではなく、マシンを正常にシャットダウンした時にしか行われません。

ここまでくればどういう問題が起こる可能性があるのか想像がつくかもしれま せん。 シャットダウンが正常にできず(誰かが電源スイッチを切る等)、変更が保存さ れなかった場合を考えてください。また、"setserial" で試行錯誤をしていて、 最後に元の状態に戻すのを忘れていた場合(または元の状態に戻す時にミスを した場合)を考えてください。すると「試行錯誤中」の設定が保存されてしま います。

手動で serial.conf を編集すれば、編集した部分はシャットダウンの時に 破棄されます。なぜなら、シャットダウンの時にその時点の setserial の 状態に戻されるからです。シャットダウンの時に serial.conf を変更させな いための方法もあります。serial.conf の最初の行に書かれている "###AUTOSAVE###" といった部分を削除するのです。すくなくともある ディストリビューションでは、インストール直後の初めてのシャットダウンの 時に最初の行から "###AUTOSAVE###" を削除することは自動的に行われます。 serial.conf にはたぶん、参考になる情報がコメントの形で書かれているでしょ う。

起動時に(設定ファイルに従って) setserial を実行す るために通常使われるファイルは、/etc/init.d/setserial (Debian) や /etc/init.d/serial (Redhat) 等ですが、普通はこのファイルを編集すべきで はありません。バージョン 2.15 を使っている RedHat 6.0 では、 起動時に setserial を実行させたい場合に /etc/init.d/ に移動させる /usr/doc/setserial-2.15/rc.serial ファイルが付いています。

ポートを無効にするには setserial を使って "uart none" を設定しま す。/etc/serial.conf のフォーマットは、コマンドラインで "setserial" の 後に置くパラメータとほぼ同じものを各ポートについて 1 行ずつ書く形式で す。自動保存を行っていなければ、/etc/serial.conf を手で編集してくださ い。

BUG: 1999 年 7 月の時点では、###AUTOSAVE### に由来するバグ/問題があり ます。これは "setserial -Gg /dev/ttyS*" で表示される setserial のパラメータしか保存されず、他のパラメータが保存されないとい うものです。"setserial" の全てのパラメータを表示させるには -a フラグを 使います。 これはごく一部のユーザにしか影響を与えないでしょう。というのも普通、 保存されないパラメータはほとんどの場合はデフォルト値で大丈夫だからです。 これはバグとして報告されているので、現在は修正されているかもしれません。

setserial で設定した現在の設定をシャットダウンすることなく設定ファイル (serial.conf)に保存するには、シャットダウンの時に通常行われる処理をさ せます。 つまり、シェルスクリプト /etc/init.d/{set}serial stop を実行 します。 "stop" コマンドにより現在の設定が保存されますが、シリアルポート自体は 動作したままです。

場合によっては新旧両方の設定方法がインストールされているかもしれません が、起動時に実行されるのはたぶんそのうちの片方だけでしょう。Debian で は、古くて使わないファイルに "...pre-2.15" というラベルが付いています。

IRQ

デフォルトでは、ttyS0 と ttyS2 が IRQ 4 を共有し、ttyS0 と ttyS3 が IRQ 3 を共有しています。しかし、次の条件が成り立たなければシリアルの割 り込みの共有はできません: すなわち (1) カーネルが 2.2 以降である、 (2) 割り込みの共有をサポートするようにカーネルをコンパイルしている、 (3) シリアルポートが割り込みの共有をサポートしているという条件です。

割り込みの共有とバージョン 2.2 以降のカーネル をご覧ください。

ttyS0 と ttyS1 の 2 つのシリアルポートしか使っていない場合にも問題はあ りません。というのも、存在しないデバイスについては共有する IRQ の衝突 が起きないからです。

内蔵モデムを追加した状態でも ttyS0 と ttyS1 をそのままにするならば、未 使用の IRQ を見つけ、これをシリアルポートの両側(またはモデムカード)に 設定し、setserial を使ってデバイスドライバに割り当てなければな りません。IRQ 5 がサウンドカードに使われて いなければ、これをモデム用に使ってもよいでしょう。ハードウェアの IRQ を設定するには、isapnp や PnP BIOS, あるいは Linux を PnP にするための パッチを使う必要があるかもしれません。余っている IRQ を調べる参考とし て、"man setserial" を実行して "IRQ 11" などを検索してみてください。

8.4 stty

はじめに

stty はシリアルポートの設定を色々やりますが、 アプリケーションプログラム(および getty プログラム)が設定を扱うことも よくあるので、ユーザが使う必要はあまりありません。 このプログラムは、問題が起こった時 やポートの設定を見たい時には便利です。端末やコンソールで ``stty -a'' を実行すればポートの設定を見ることができます。また、-a (all) オプショ ンを付けずに stty を実行すれば、通常と異なる設定になっている部分が短く リスト表示されます。シリアルポートの達人になろうというのでなければ、全 ての設定を覚える必要はありません。ほとんどはデフォルトのままで大丈夫な はずで、1970 年代に作られた特定の古いダム端末に対してだけ設定がいくつか 必要となります。

setserial は実際のシリアルポートだけを扱うのに対して、stty は シリアルポートと仮想端末(PC モニタで使う Linux 標準のテキストインタフェー ス等)の両方に対して使われます。PC モニタに対しては、stty の設定の多く は無意味です。ボーレート等を変えても実際には何も変わらないように見える でしょう。

stty の設定をいくつか示すと、速度(ビット/秒)、パリティ、ビット/バイト、 ストップビットの数、8 番目のビットを落とすかどうか、モデム制御シグナル、 フロー制御、ブレーク信号、行末マーカー、文字ケースの変更、パディング、 バッファ溢れの際にビープ音をならすかどうか、入力した文字をエコー表示するか、 バックグラウンドタスクの端末への書き込みを許すかどうか、特殊(制御)文字 の定義(どのキーを押すと割り込みがかかるか等)があります。 詳しくは stty の マニュアルページか info ファイルを見てください。termios のマニュアル ページも見てください。これは stty で設定できるのと同じオプションを 含んでいますが、(1999 年半ばの時点では) stty のマニュアルページが 説明できていない機能も含んでいます。

一部の getty の実装(getty_ps パッケージ)では、stty に通常与えるコマン ドは getty の設定ファイル(/etc/gettydefs)に書かれます。この設定ファイ ルがなくても、getty のコマンドラインはユーザが stty を必要としないよう に十分な設定ができます。

stty の設定などを変更する C プログラムを書くことができます。これに関す る文書をいくつか見れば、stty コマンドの使い方(およびたくさんある使用可 能な引き数)もよく理解できるでしょう。Serial-Programming-HOWTO も役に立 ちます。マニュアルページ termios には C 言語の構造体(termios 型)の 説明があります。この構造体は stty の設定をコンピュータのメモリに格納し ます。C 言語の構造体のフラグ名の多くは、stty コマンドの引き数とほぼ同 じです(そして同じ動作をします)。

「別の」端末に対しての stty の使用

stty を使って、自分が現在使っている端末の調査や設定を行うの は簡単です。これを別の(よその)端末やシリアルポートに対して行うのは面 倒かもしれません。 例えば、読者の皆さんが PC のモニタ (tty1) にいて、そして stty を 使ってシリアルポート ttyS2 を扱いたいと考えているとします。 2000 年より前の頃は、リダイレクト演算子 < を使う必要がありました。 2000 年以降では(お使いの setserial のバージョンが 1.17 以上で、stty の バージョンが 2.0 以上ならば)、-F オプションを使うという別の方法があり ます。これはリダイレクションを使う古い方法が失敗する場合でも動作します。 しかし、たとえ最新版であっても、ttyS2 上に端末があり、そこでシェルが動 作しているならば、表示されるものは確かではなく、設定しようとしてもうま くいかないだろうということを注意しておきます。 その理由を理解したければ 端末の 2 つのインタフェース をご覧ください。

新しい方法は ``stty -F /dev/ttyS2 ...'' です(あるいは -F の代わりに --fileを使います)。... が -a であれば、このコマンドで stty の全ての設 定が表示されます。リダイレクションを使う古い方法(最近のバージョンでも まだ使えます)では ``stty ... < /dev/ttyS2'' を使います。 新しい方法では動作するのに古い方法だとハングする場合は、オンにしてくれ るモデム制御線がないためにポートがハングしていると思われます。このよう に、古い方法もまだトラブル解決に役立ちます。 詳しくはこの後の節を読んでください。

リダイレクションを使う古い方法

リダイレクション演算子には問題があります(この演算子ではなく、新しい -F オプションを使えば問題は起きません)。stty を使おうとすると時々、 コマンドがハングし、何も起こらないことがあります(リターンキーを押して も、次のコマンドのプロンプトが出ない)。これは大抵ポートがハングしてしまっ たためであり、これはモデム制御線のいずれかがオンになるのをポートが待っ ているために起こります。例えば、モデム制御線を無視するように "clocal" を設定していない場合、CD 信号がオンにならなければポートはオープンでき ませんし、stty はポートに対して動作しません(新しい -F オプションを使っ ていない場合)。同様の状況は、 ハードウェアフロー制御でも起こるようです。オンになる必要がある導線がポー トに繋いだケーブルになければ、ハングするのを防ぐ簡単な方法はありません。

このようなハングを防ぐ方法の一つは、新しい -F オプションを使い、 "clocal" や "crtscts" を設定することです。-F オプションが使えない場合 は、たとえ制御線がオフであってもポートを強制的に動作させるプログラムを、 そのポートに対して使ってみてもよいでしょう。 すると多分このプログラムは、この先ポートをオープンするために制御線が必 要なくなるようにポートを設定できます: すなわち clocal または -crtscts を設定します。"minicom" を使ってこれを行うには、別の ttyS 等に合わせて minicom を再設定し、それから minicom の終了と再実行を行わなければなり ません。その後再び minicom を再設定しなければならないので、単に PC を 再起動するだけの方が簡単かもしれません。

リダイレクションを使う古い方法は、ttyS2 を stty への標準入力とします。 すると、stty プログラムは「ファイル」である ttyS2 にリンクして これを「読み取る」ことができるようになります。しかし、ttyS2 に送られた バイトデータは普通に期待される通りに読み取るのではなく、ポートの読み取 りや変更ができるように、このリンクを使ってポートの設定を調べます。 ``stty ... > /dev/ttyS2'' を使って端末を設定しようとする人もいますが、 このコマンドで設定することはできません。この場合は設定は行われずに、使っ ている端末(例えば tty1)に対する stty コマンドで普通に表示されるメッセージ が得られ、これが ttyS2 に送られます。しかし、ttyS2 の設定は全く変わり ません。

端末の 2 つのインタフェース

コマンドライン編集機能を有効にしてシェル(bash など)を使っている時 は、2 つの異なる端末インタフェース(stty -a を実行した時に表示されるも の)があります。コマンドラインで入力を行う時には一時的な "raw" インタフェー ス(つまり "raw" モード)を持っており、それぞれの文字は入力するごとにコ マンドラインエディタが読み込みます。<リターン>キーを叩くと、コマ ンドラインエディタは終了し、端末インタフェースはその端末の通常の "cooked" インタフェース(cooked モード)に切り替わります。この cooked モードは、次のプロンプトが端末に送られるまで続きます。この cooked モー ドでは何も入力しませんが、raw モードで入力された文字は <リターン> キーが押されると cooked モードになります。

プロンプトが端末に送られると、端末は "cooked" モードから "raw" モード に変わります(これはエディタを起動する時とちょうど同じように行われます。 というのも、コマンドラインエディタを起動しようとしているからです)。 "raw" モードの設定は、"cooked" モードから得た基本設定のみに基づいて行 われます。raw モードはこれらの設定を保持しますが、他のいくつかの設定は モードを "raw" に変えるために変更します。前の "raw" モードで使われた設 定には全く依存しません。したがって、stty を使って raw モードの設定を変 えると、「設定された」と思われる端末上で<リターン>キーを叩いた途 端にこのような設定は無くなってしまいます。

ここで、stty を入力して端末インタフェースを見る時には、cooked モードか raw モードの設定を表示することができます。その時にはどちらを見るのかを はっきりさせる必要があります。コマンドラインを表示している端末を扱うた めに別の端末から stty を使う場合には、表示は raw モードのものになりま す。行われた変更は raw モードにしか適用されず、「設定」しようとした端 末上で誰かが<リターン>を押すと消えてしまいます。しかし、自分のい る端末で(リダイレクトの < を使わずに) stty コマンドを入力し、それか ら<リターン>を押した場合は話が違ってきます。<リターン>キー により端末は cooked モードになります。行われた変更は保存され、端末が raw モードに戻った時にも残っています(もちろん raw モードで変更できない 設定の場合は除きます)。

この状況により問題が起こることがあります。例えば、端末インタフェースを ぐちゃぐちゃにしてしまい、これを戻すために別の端末に行って "stty -F dev/ttyS1 sane" (等)を実行したとしましょう。ところが、この方法は 使えません! もちろんぐちゃぐちゃになってしまった端末から "stty sane ..." の入力を試 みることはできますが、入力した文字を見ることはできません。上記の現象は ダム端末だけではなく、PC モニタ上で使う仮想端末や、X 上の端末ウィンド ウにも当てはまります。言い換えれば、これは Linux を使うほとんど全ての 人に当てはまります。幸運なことに、stty を起動時に実行するファイルはシェ ルが動作していない端末(あるいは端末が繋がっていないシリアルポート)を扱 えるので問題はありません。

どこに stty コマンドを置くか?

コンピュータが起動する度に stty にシリアルインタフェースを設定 させる必要があるのなら、コンピュータが起動する(Linux が起動する)度 に実行されるファイルに stty コマンドを入れておく必要があります。このファイ ルはシリアルポートが使われる(ポートにおける getty の実行も含みます)前 に実行されなければなりません。これを置くことができる場所はたくさんあり ます。複数の場所にこれを置いたのに、その場所のうちの一つしか知らなけれ ば(覚えていなければ)衝突が起きてしまうでしょう。したがって、設定したこ とは記録しておきましょう。

stty コマンドを置く場所の一つは、システムが起動する時に setserial を実行するファイルの内部です。この場所はディストリビューションや バージョンごとに異なります。低レベルの処理が先に行われるようにするため、 これは setserial の後に置くのが良いでしょう。 置かれているファイルが起動時に全て実行されるディレクトリ(System V Init) が /etc ディレクトリツリーの下にあれば、"stty" という名前のファイルを 作って stty コマンドを実行させても良いでしょう。

8.5 isapnp とは何か?

isapnp は、内部モデムを含めた ISA バス用のプラグ&プレイ (PnP)デバイスを設定するためのプログラムです。このプログラムは "isapnptools" と呼ばれるパッケージに他のプログラム("pnpdump")と一緒に 入っています。"pnpdump" は全ての ISA PnP デバイスを見つけ、これら のデバイスを設定するオプションを出力します。この出力は、PnP の設定ファ イルである /etc/isapnp.conf に追加できる形式です。コンピュータの起動時 に毎回実行され、ISA PnP デバイスを設定できるように、isapnp コマンドは システムの起動ファイルに書かれます。BIOS が PnP をサポートしていなくて も、これを行うことは可能です。詳しくは Plug-and-Play-HOWTO を見てくだ さい。


次のページ 前のページ 目次へ