TTY(4) — UNIX Programmer’s Manual
名前
tty − 一般端末インタフェース
形式
#include <sgtty.h>
解説
ここでは、スペシャルファイル /dev/tty と会話型の端末ドライバについて述べます。 ラインディシプリン
システムは、通信回線を制御するためのそれぞれ違った回線 規制(line disciplines)を行っています。 システムの現バージョンでは端末を使う際に利用できる 2 つの規制があります。
old旧端末ドライバ(バージョン 7 UNIX)。これは、標準シェル sh(1) または jsh(1) を使用する時に使用されます。
newバークレイ版標準端末ドライバ。ジョブ制御の特徴を持っています。これは、 csh(1)、 または jcsh(1) を使用するときに使用しなければなりません。
ラインディシプリンの切り替えは、TIOCSETD ioctl で行われます。
int ldisc = LDISC; ioctl(f, TIOCSETD, &ldisc); LDISC は、標準 tty ドライバのときは OTTYDISC で、 新 tty ドライバのときは NTTYDISC です。 標準(old) tty ドライバは、ラインディシプリン 0 と決められています。 現在のラインディシプリンは、TIOCGETD ioctl で得ることができます。 なお、保留されている入力は、ラインディシプリンが変わったときに消滅します。
すべての低速調歩式伝送ポートは、ハードウェアの種類にかかわらず、 どのラインディシプリンでも使用することができます。 この章以降の部分では、この“old” と“new” のラインディシプリン について述べます。 制御端末 端末ファイルがオープンしても、接続が確立されるまでは そのプロセスは待ち状態となります。 実際には、ユーザプログラムは、 このファイル(tty)をめったにオープンしません。 つまり、これらのファイルは、 getty(8) または rlogind(8C) によってオープンされ、ユーザの標準入出力ファイルとなります。
制御端末を持たないプロセスが端末ファイルをオープンするとき、 端末ファイルがそのプロセスの制御端末となります。 その後、制御端末がクローズされても、 fork(2) による子プロセスはその制御端末を引き継ぎます。 /dev/tty ファイルは、各プロセスにおいてプロセスと結び付いた制御端末 (control terminal)と同じ意味をもちます。 このファイルは、出力がリダイレクトされて (tty 以外のファイルに切り替えられて)も、 メッセージを確実に端末に書き出したいプログラムに有用です。 また、出力に対するファイル名が必要なプログラムを使用する時、 画面へ出力するために現在使用中の端末名を調べるのが面倒な場合にも使用されます。 プロセスが端末制御から切り離されるには、 /dev/tty ファイルをオープンし、 次に ioctl(f, TIOCNOTTY, 0) を実行します。 これは、サーバプロセスでの望ましい使い方です。 プロセスグループ csh(1) のようなコマンドプロセッサは、関連するジョブを単一のプロセスグループに置き、 このプロセスグループを端末に組み合せることによって、 異なるジョブ間で端末を調停することができます。 プロセスグループに組み合わされる端末は、TIOCSPGRP ioctl(2) を使用して設定されます。
ioctl(fildes, TIOCSPGRP, &pgrp) また、TIOCSPGRP の代わりに TIOCGPGRP を用いれば、 pgrp に現在のプロセスグループが返ってきます。 新端末ドライバは、カレントプロセスグループではない端末へのアクセスを 制限することによって、この調停を支援します。 後述の "ジョブアクセス制御" を参照してください。 モード
端末ドライバには、3 つの主なモードがあり、 入出力文字の処理量で区別されています。
cooked通常のモード。このモードでは、入力行が集められ、 その編集が行われます。編集された行は、改行、 t_brkc 文字(通常は未定義)、または t_eofc 文字(通常はEOT)、control-D(^D と記す)が入力された時に 利用できるようになります。 このモードでは、キャリッジリターンは、 普通、改行と同じ意味になり、タイプ時に改行に置き換えられます。 すべてのドライバ機能(入力編集、割り込み発生、遅延発生や タブ拡張による出力処理等)が、このモードで適用されます。
CBREAKこのモードは、文字、語、行の編集入力機能を抑制し、 入力文字がそのままユーザプログラムで使えるようにします。 フロー制御、リテラルネクスト(次の特殊文字を解釈しない)、 割り込み処理は、このモードでも行われます。出力処理も行われます。
RAWこのモードでは、すべての入力処理が抑制され、 すべての文字がそのままプログラムに渡されます。出力処理も行われません。
端末がブロッキングしない I/O モードであるとき、 入力処理のスタイルは、大きく異なっています。 fcntl(2) の FNDELAY フラグの解説を参照してください。 この場合、制御端末からの read(2) はブロックされません。そして、利用できる入力がなければ、 エラー表示 (EWOULDBLOCK) が返されます。
入力があるときには、SIGIO シグナルを送るように、 プロセスから要求を出すこともできます。 また、出力キューにたまっている量が許容量以下に減少したときも同様です。 このモードを使うには、 fcntl(2) を使用して FASYNC フラグをセットしなければなりません。 入力編集 通常、UNIX 端末は全二重モードで操作します。 文字は、いつでも入力することができ、出力の最中でも可能です。 入力文字が失われるのは、 システムの文字入力バッファが完全に使い尽くされてしまった時 (これは、滅多にありません)、 あるいはプログラムがまだ読み込んでいない入力文字の数が 許容される最大入力文字数となった時です。 その最大文字数は、現在 256 文字です。 RAW モードでは、その文字数が限界に達した時に、 端末ドライバが何の注意もなく入力したすべての文字を捨てますが、 CBREAK または cooked モードでは、端末ベルを 鳴らして限界以上の入力を拒否します。
漢字端末においては、フラグ中の EVEN ビットと ODD ビットの両方をクリアし、 パリティなしの 8 ビットキャラクタがプログラムに読み込まれます。 もし、EVEN ビットと ODD ビットの両方がセットされていると、 入力文字は奇偶パリティのビットを取り除いてから、 プログラムで読まれます。EVEN ビットまたは ODD ビットのどちら か一方をクリアすることによって、 そのパリティをもつ入力文字を捨てることも可能です (以下の モードの要約 を参照してください)。
すべてのラインディシプリンでは、TIOCSTI ioctl を使用して端末入力をシミュレートすることができます。 この ioctl は、3 つ目の引数として char のアドレスをとります。 システムは、この文字が、指定した端末から入力されたかのような動作をします。 スーパーユーザ以外は、その端末は制御端末でなければなりません (これは、標準バージョン7 UNIX にはありません)。
通常、入力文字は入力直後に出力キューに入れられ、エコーされます。 stty(3) コールや TIOCSETN ioctl や TIOCSETP ioctl を使用してフラグ中の ECHO ビットをクリアすることによって、 エコーできないようにできます(以下の モードの要約 を参照してください)。
cooked モードでは、端末からの入力は、行単位に処理されます。 read しようとしているプログラムは、 通常、1 行分が受け取られるまでサスペンドさせられます (後述の ジョブアクセス制御 中の SIGTTINと、 以下の モードの要約 の FIONREAD を参照してください)。 read コールでどんなに多くの文字を要求しても、1 行までが返されます。 しかし、行全体を一度に読み込む必要はありません。 1 回の read で何文字でも(たとえ 1 文字でも)要求可能で、 文字を失うようなことはありません。
入力中、行の編集は通常行われ、erase 文字、 sg_erase (デフォルトは DELETE)はタイプされた最後の文字を消し、 sg_kill 文字 (デフォルトは control-U : ^U) は行単位に消去します。 これらの文字が入力行の先頭や EOF をとおり越して、 消去を行うことはありません。 またこれらの文字の前に ‘\’ を付けることによって、 これらの文字をそのまま入力することができます。 古いテレタイプドライバでは、‘\’ とその文字がそのまま画面に表示 されますが、新ドライバでは、‘\’ は消されます。
ドライバは、キャリッジリターンまたは改行文字を 入力行の終わりとして取り扱います。 キャリッジリターンは改行に置き換え、 リターンとラインフィードをエコーします。 もし、ローカルモードの中の CRMOD ビットがクリアされていれば、 キャリッジリターン処理は行われず、単にリターンとして エコーされ、cooked モード入力を終了しません。
新ドライバには、リテラルネクスト文字 ^V があり、 cooked モードでも CBREAK モードでも入力できます。 これは、次の 1 文字が文字として以外の機能を持っていても、 その特別な意味を無効にし、 単に文字として扱うものです。 これは erase 文字や kill 文字をエスケープする ‘\’ よりも 好ましいものです。 しかし、歴史的な理由から、 新ドライバでも ‘\’ が古い機能として(一時的にせよ)残されています。
新端末ドライバは、通常のモードで、次の 2 つの編集文字も提供しています。 単語消去機能(通常は ^W)は、一つ前の語を消します。 その前のスペースは消しません。 ^W のために語が定義されていて、それはブランクを含まない文字の列です。 タブはブランクとみなされます。 再印字文字(通常は ^R)は、未処理の入力を新しい行の先頭からタイプしなおします。 cooked モードでは、画面上から消去しようとした文字が、 プログラムの出力で表示状態が乱れたら、自動的に再タイプが行われます。 入力エコーと再表示 端末ドライバには、端末からの入力に対するエコーを操作する いくつかのモードがあります (UNIX バージョン7 にはありません)。 これは、ローカルモードワードのビットによって制御されます。 ハードコピー端末。 ハードコピー端末を使用している時、通常 LPRTERA ビット をローカルモードワードに設定します。 論理的に消去された文字が、前に ‘\’ を付けて逆順に、 そして、後ろに ‘/’ をつけてプリントアウトされます。 CRT 端末。 CRT 端末を使用するとき、LCRTBS ビットをローカルモードワードに設定します。 端末ドライバは、入力が消去されると、 適当な数の erase 文字をエコーします。 通常、erase 文字は ^H です。 これにより、端末のカーソルを、論理的に消去した文字が タイプされる前の状態に戻します。 入力が非同期の出力によって乱れた時には、 入力は自動的に再タイプされます。 CRT の文字消去。 CRT 端末を使用するとき、LCRTERA ビットが設定されていると、 文字や語を消去するシーケンスが使われた時に、 入力は “バックスペース-スペース-バックスペース” の シーケンスで画面から消去されます。 また、LCRTKILL ビットが設定されていると、 行消去文字が使われた時に、同様にして削除されます。 制御文字のエコー。 LCTLECH ビットがローカルステートワードに設定されていると、 表示できない文字 (制御文字)は、 通常、^X(X のとき)のように修正してエコーされます。 DELETE は ^? とエコーされます。 CRT 端末上で使用される通常のモードは、スピードに依存します。 1200 ボー未満では、LCRTERA と LCRTKILL の処理速度は遅いので、 通常 stty(1) は LCRTBS と LCTLECH だけを設定します。 1200 ボー以上では、これらのすべてのビットが通常セットされます。 stty(1) は、これらのオプション設定と新端末ドライバの使用を まとめて “newcrt” としています。 出力処理
1文字以上が書かれる時、以前に書かれた文字の印字が終了すると、 ただちに端末に転送されます(前述のように入力文字は、 入力時に出力キューに入れることによってエコーします)。 出力文字が印字されるよりもかなり速くプロセスが文字を出力する時、 出力キューが制限を越えた場合には、 そのプロセスがサスペンドされます。 そのキューがある程度まで掃き出されると、プログラムは再開します。 漢字端末に対しては、パリティは出力されません。 そうでなければ、通常偶数パリティを発生します。 EOT 文字は、それに応答してハングアップしてしまう端末があるので、 cooked モードでは送出しません。 RAW モードや cooked モードを使用しているプログラムは、充分注意すべきです。
端末ドライバは、特殊文字に対する遅延の発生やパリティの生成を含んで、 cooked モードや CBREAK モードに必要な出力処理を提供しています。 遅延は、バックスペース ^H、ホームフィード ^L、キャリッジリターン ^M、 タブ ^I、改行 ^J で使用できます。
端末ドライバは、タブを拡張してスペースに置き換えることもできます。 タブは、8 カラム毎に設定されているとします。 また、改行文字を、その前にキャリッジリターンが付くようにも変換できます。 これらの機能は、tty フラグワード中のビットで制御されます。 以下の「モードの要約」を参照してください。
端末ドライバは、端末が小文字を持っていない場合、 大文字と小文字間のマッピングを行ったり、 機能の足りない端末上で特別な処理を行ったりします。
最後に、新端末ドライバには、出力フラッシュ文字(通常は ^O)があります。 それは、LFLUSHO ビットをローカルモードワードに設定します。 以降の出力は、プログラムにクリアされるか、 何かタイプされるまでフラッシュされます。 この文字は、cooked モードおよび CBREAK モードの両方に効果があり、 もし差し止めている入力があれば、再表示します。 入出力キューの文字をフラッシュさせる TIOCFLUSH ioctl もあります。 大文字端末と Hazeltine
LCASE ビットが tty フラグ中で設定されていれば、 大文字は対応する小文字にマップされます。 大文字は、その前に ‘\’ を付けることによって入力することができます。 大文字は、出力時に ‘\’ が前に付けられます。 さらに、次のエスケープシーケンスが出力時に生成され、 また入力時に受け付けられます。
`|~{} に対して
\´\!\^\(\) を用います。
ASCII 文字の ~ を使用することができない Hazeltine 端末を扱うためには、 LTILDE ビットをローカルモードワードに設定してください。 こうすることにより、 ~ 文字は、出力時に ` 文字に置き換えられます。 フロー制御
出力を一時停止させたり再開させたりするための 2 つの 文字(通常、停止文字として ^S、再開文字として ^Q)があります。 出力がすでに停止されているときにタイプされた余分な停止文字は、 再開文字と停止文字が同一のものに設定されていない限り、 効果を持ちません(再開文字と停止文字が同一のものに 設定されているときには再開されます)。
フラグワード中で、端末を TANDEM モードにするためのビットをセット することができます。 このモードでは、システムは、入力キューがオーバーフローする 危険のある際に停止文字(デフォルトは ^S)を生成し、 入力が十分に処理されたら再開文字(デフォルトは ^Q)を生成します。 このモードは、端末がこれらの規約に従う別のマシンである場合に便利です。 回線制御とブレーク 端末回線の状態を制御するために使用できる、いくつかの ioctl コールがあります。 TIOCSBRK IOCTL は、ブレーク状態にするよう、 ハードウェアインタフェース中のブレークビットをセットします。 これは、TIOCCBRK によって (通常、 sleep(3) による遅延の後)クリアできます。 入力時のブレーク状態は、RAW モード中ではナル文字として、 また cooked モードあるいは CBREAK モード中では割り込み文字として、 反映されます。 TIOCCDTR ioctl は、データ端末レディの状態をクリアします。 これは、TIOCSDTR によって再びセットすることができます。
データセットからキャリア信号が落ちたとき(通常、ユーザが端末をハング アップした場合)、 SIGHUP ハングアップシグナルが、端末で区別される プロセスグループ中の各プロセスに送られます。 これで、通常、プロセスは終了させられます。 この SIGHUP は、ドライバのローカル状態ワード中の LNOHANG ビット をセットすることにより、抑止することもできます。 次に、他のプロセスによる端末へのアクセスが無効になり、 したがってそれ以上の読み込みは失敗し、 端末を読んでその入力上の eof を調べているプログラムはうまい具合に終了します。 TIOCHPCL ioctl により、最後のクローズ時に電話回線がハングアップする(切れる)ように 設定することもできます。 これは通常、出力回線でこちらから電話をかける場合に行われます。 割り込み文字
cooked モードおよび CBREAK モードで割り込みを生成するいくつかの文字があり、 それらは端末の制御グループ中のプロセスに送られます。 それは、それらの文字が端末でタイプされたときに待ち状態の入力 および出力をフラッシュ(TIOCFLUSH 式に)することを除いて、 プロセスグループを得るために TIOCGPGRP ioctl が行われ、 killpg(2) システムコールが実行されたのと同じことになります。 次に、構造体のフィールド名であるこれらの文字(デフォルトの文字)を示します。 文字は変更することもできます。
^Ct_intrc (ETX) は SIGINT シグナルを生成します。 これは、不要になったプロセスを停止させたり、 インタラクティブなプログラム中で制御を再び得たりするときの常套手段です。
^\t_quitc (FS) は SIGQUIT シグナルを生成します。 これは、プログラムを終了させて、 可能ならばコアイメージをカレントディレクトリ中の core ファイルに生成するときに使用されます。
^Zt_suspc (EM) は SIGTSTP シグナルを生成します。 これは、カレントプロセスグループをサスペンドするのに使用されます。
^Yt_dsuspc (SUB) は ^Z と同様に SIGTSTP シグナルを生成します。 この文字がタイプされたときではなく、 プログラムが ^Y を読もうとしたときにシグナルが送られます。 ジョブアクセス制御
新しい端末ドライバを使用する場合、制御端末で区別されたプロセス グループ中のプロセスではないプロセスがその端末から読み込もうとすると、 そのプロセスグループに SIGTTIN シグナルが送られます。 このシグナルは、通常、そのプロセスグループのメンバを停止させます。 しかし、もし、プロセスが SIGTTIN を無視していたり、SIGTTIN をブロックさせたり、 vfork(2) を使用してプロセスの作成中だったりすると、−1 が返され、EIO が errno にセットされます。
ローカルモードで LTOSTOP ビットをセットして、 新しい端末ドライバを使用する場合、 プロセスがその端末で区別されるプロセスグループ中にないと、 そのプロセスは制御端末上に書き込むことが禁止されます。 SIGTTOU シグナルを無視あるいは保持するようなプロセス、または vfork(2) の途中であるようなプロセスは、出力を生成することができます。 ターミナル/ウィンドウサイズ
サイズを変えられるウィンドウを持つ端末やワークステーションに適応するために、 端末ドライバは、現在の端末のサイズを得たりセットしたりするための メカニズムをサポートしています。 ドライバはこの情報を内部的に使用するのではなく、 たんに記憶し、統一のとれたアクセスのメカニズムを用意します。 サイズが変更されると、SIGWINCH シグナルが端末のプロセスグループに送られるため、プログラムはサイズの変更を検知することができます。 この機能は 4.3BSD で付加されたもので、 それ以前のバージョンのシステムでは使用できません。 モードの要約 端末ドライバの発展によって、ありがたくないことに、 ドライバデータのさまざまな部分からなる 7 つの異なった構造体があります。 最初の sgttyb は、UNIX のバージョン 6, 7 に共通した情報です。 2 番目は、バージョン 7 で追加された制御文字についてです。 3 番目は、4BSD で追加されたローカル状態のワードです。 4 番目は、新ドライバに加えられた特殊文字の構造体についてです。 5 番目は、4.3BSD で追加された端末とウィンドウのサイズの構造体です。 6 番目は漢字モードのワードで、7 番目が JIS 漢字端末のための 特殊文字の構造体です。 この2つは NEWS-OS で追加されました。 将来、1 つの構造体でこのすべての情報にプログラムから アクセスできるようになるかもしれません。 基本モード:sgtty
基本 ioctl は、 <sgtty.h> で定義された構造体を使用します。
struct sgttyb {
char sg_ispeed;
char sg_ospeed;
char sg_erase;
char sg_kill;
short sg_flags;
};
sg_ispeed と sg_ospeed フィールドは、次の表に従ってデバイスの入出力速度を記述しています。 他のハードウェアが使用された場合は、不可能な速度への変更は無視されます。 表の値は、 <sgtty.h> で定義するものと同じです。
B00(電話を切る)
B50150 ボー
B75275 ボー
B1103110 ボー
B1344134 ボー
B1505150 ボー
B2006200 ボー
B3007300 ボー
B6008600 ボー
B120091200 ボー
B1800101800 ボー
B2400112400 ボー
B4800124800 ボー
B9600139600 ボー
B192001419200 ボー
B384001538400 ボー
EXTA14External A
EXTA15External B
IBM2741 (134.5 ボー) に必要なコード変換や回線制御は、 ユーザプログラムによって行わなければなりません。 202 データセット(1200 ボー)に必要な半二重ラインディシプリンは提供されません。 全二重の 212 データセットはうまく動作します。
sg_erase と sg_kill フィールドは、それぞれ erase 文字と kill 文字を指定します (デフォルトは、DELETE と ^U です)。
sg_flags は、システムの端末に対する扱いを決めるいくつかのビットから構成されています。
ALLDELAY0177400遅延アルゴリズム選択
BSDELAY0100000バックスペース遅延の選択(実現されていません)
BS00
BS10100000
VTDELAY0040000フォームフィードと垂直タブ遅延の選択
FF00
FF10040000
CRDELAY0030000キャリッジリターン遅延の選択
CR00
CR10010000
CR20020000
CR30030000
TBDELAY0006000タブ遅延の選択
TAB00
TAB10002000
TAB20004000
XTABS0006000
NLDELAY0001400改行遅延の選択
NL00
NL10000400
NL20001000
NL30001400
EVENP0000200入力において偶数パリティを許します
ODDP0000100入力において奇数パリティを許します
RAW0000040raw モード:すべての文字に対して動作する 8 ビットインタフェース
CRMOD0000020入力の CR を LF にマップ。LF を CR-LF として出力
ECHO0000010エコー(全二重)
LCASE0000004入力では大文字から小文字に。出力では小文字を大文字にマップします
CBREAK0000002入力されるとすぐにその文字を返します
TANDEM0000001自動フロー制御
端末へある文字が送信されたとき、機械的またはその他の動作のため にどのくらいの時間転送をストップするかを、この遅延ビットが指定 します。すべての場合において、値 0 は遅延がないことを示します。
バックスペースの遅延は、現行では無視されますが、Terminet 300’s で 使用するはずでした。
フォームフィード/垂直タブ遅延を指定すると、それは約 2 秒間続きます。
キャリッジリターンの遅延タイプ 1 は、0.08 秒続き、Terminet 300 に 適合します。遅延タイプ 2 は、VT05 と TI700 で使用し、約 0.16 秒で す。タイプ 3 は、concept-100 に合っていて、 パッドラインは、9600 ボーで最低 9 文字分、回線を引き延ばします。
改行遅延タイプ 1 は、現在のカラムに依存し、Teletype model 37 の ものに合わせられています。タイプ 2 は、VT05 を使用し、約 0.1 秒です。 タイプ 3 は、遅延 0 です。
タブ遅延タイプ 1 は、動作量に依存し、Teletype model 37に合わせられています。 タイプ 3 は XTABS と呼ばれ、遅延はありませんが、 出力においてタブを適当な個数のスペースに置き換えます。
偶数パリティと奇数パリティのためのフラグが入力のパリティチェックと 出力のパリティ生成をコントロールします (cooked モードと CBREAK モードのとき)。
EVENPODDP| 入力出力
セットセット| 偶、奇パリティ偶数パリティ
セットクリア| 偶数パリティ偶数パリティ
クリアセット| 奇数パリティ奇数パリティ
クリアクリア| パリティなしパリティなし (漢字端末用)
RAW は、LFLUSHO で出力をフラッシュすることを除いて、 すべての出力処理を禁止します。 入力の 8 ビット全部が入力と同時に与えられ、 出力に 8 ビット全部を渡します。 入力のブレーク状態はナル文字として得られます。 raw モードで入力データがオーバーフローすると、入力キュー 及び出力キュー内の全てのデータが捨てられます。 これは、新旧両ドライバに適用されます。
CRMOD は、入力のキャリッジリターンを改行文字に変換します。 出力やエコーの改行文字は、キャリッジリターンのあとにラインフィードを 付けたものとして出力されます。
CBREAK は、半分 cook される rare モードです。 プログラムは、文字が入力されるとすぐにそれを読むことができます (1 行すべてが入力されるのを待つわけではありません)。 入力編集を除いてすべての処理が行われます。 文字や語の消去、行の削除、入力の再表示、\ や EOT の特殊コードの 扱いはできません。
TANDEM モードは、入力キューがオーバーフローになる危険性がある 時には停止文字(デフォルト ^S)を、 入力キューが充分に掃けてしまった時は、 再開文字(デフォルト ^Q)をシステムが発生するようにします。 それは、’端末’ が別のコンピュータであるとき、 フロー制御に便利です。
注意 :同じ ’STOP’ 文字や ’START’ 文字が、双方向のフロー制御のために使われます。 t_stop 文字は、入力では出力を停止する文字として受け取られ、 出力では入力を停止する文字として作り出されます。 t_start 文字は、入力では出力を再開する文字として受け取られ、 出力では入力を再開する文字として作り出されます。 基本 ioctl
多くの ioctl(2) コールが端末に対して適用されます。それは、次のような形式で行います。
#include <sgtty.h>
ioctl(fildes, code, arg)
struct sgttyb ∗arg;
使用できるコードは、次のとおりです。
TIOCGETP端末に関する基本パラメータを取り出し、 sgttyb 構造体に格納します。
TIOCSETP指示されている sgttyb 構造体に従ってパラメータを設定します。 出力が終了するまでのインタフェースはそのままでいて、 モード変更前にまだ読んでいない文字を捨ててしまいます。
TIOCSETNTIOCSETP のようにパラメータを設定しますが、 遅延や入力のフラッシュはありません。 しかし、RAW に、または RAW から変わろうとするとき、入力が保存できません。
次のコードでは、 arg が無視されます。
TIOCEXCL“排他的使用” モードを設定します。 ファイルがクローズされるまで次のオープンが許されません。
TIOCNXCL“排他的使用” モードをやめます。
TIOCHPCLファイルのクローズが最後の時、端末の接続を切ります。 これは、回線が発信コールで使用する ACU と組み合わされているとき利用できます。 次のコードでは、 arg が int を指すポインタです。
TIOCGETDarg はポインタで、それの指す int 変数に現在のラインディシプリン番号を代入します。
TIOCSETDarg はポインタで、それの指す int の内容を現在のラインディシプリン番号としてセットします。
TIOCFLUSHarg で指された int が 0 の場合、入出力のキューにあるすべての キャラクタはフラッシュされます。 int が 0 以外の場合、int の内容は <sys/file.h> で定義された FREAD、FWRITE ビットになります。FREAD ビットが セットされていれば、入力キューにあるすべてのキャラクタはフラッシュされます。 FWRITE ビットがセットされていれば、 出力キューにあるすべてのキャラクタはフラッシュされます。 残りのコールは純粋なバージョン 7 の UNIX では使用できません。 引数が必要なものは記述されています。 そうでないものは arg を 0 にしてください。
TIOCSTI引数は文字のアドレスで、システムはその文字が端末から 入力されたかのように動作します。
TIOCSBRKブレークビットをセットし、ブレーク信号の送信を開始します。
TIOCCBRKブレークビットをクリアし、ブレーク信号の送信を終了します。
TIOCSDTRデータ端末レディをセットします。
TIOCCDTRデータ端末レディをクリアします。
TIOCSTOP"STOP" 文字が入力された時のように、出力を停止します。
TIOCSTART"START" 文字が入力された時のように、出力を再開します。
TIOCGPGRParg はポインタで、それの指す int 変数にこの制御端末になっている プロセスグループのプロセスグループ ID を入れます。
TIOCSPGRParg はポインタで、それの指す int の値がこの端末のプロセス グループ ID として設定されます。
TIOCOUTQ端末の出力キューの文字数が arg の指す int 変数に返されます。
FIONREAD引数のディスククリプタからすぐに読み出しできる文字数が、 arg の指す int 変数に返される。 これは、ファイル、パイプ、端末に対して働きます。 端末特殊文字:tchars
各端末に関する 2 番目の構造体は、新旧のインタフェースにある 特殊文字を指定します。次の構造体は、 <sys/ioctl.h> で定義され、それは自動的に <sgtty.h> に含まれているものです。
struct tchars {
chart_intrc;/∗ 割り込み ∗/
chart_quitc;/∗ 中止 ∗/
chart_startc;/∗ 出力開始 ∗/
chart_stopc;/∗ 出力停止 ∗/
chart_eofc;/∗ エンドオブファイル ∗/
chart_brkc;/∗ 入力の区切り(nl のような) ∗/
};
それらの文字のデフォルト値は、^C、^\、^Q、^S、^D、−1 です。 −1 の文字の値は、その文字の持っている機能を削除します。 t_brkc は、デフォルトが −1 で、行を終端させるという点で改行と同じ動作をします。 エコーも行われ、プログラムにも渡されます。 stop 文字と start 文字は同じものであってもよく、 その時にはトグル動作をします。 その他の特殊文字(erase と kill も含めて)を同じものにすることは、 おそらく反生産的です。 使用できる ioctl コールは次のとおりです。
TIOCGETC特殊文字を取り出し、指定した構造体の中にそれらを入れます。
TIOCSETC上記の構造体で与えられた文字を特殊文字として設定します。 ローカルモード
各端末に関する 3 番目の構造体は、ローカルモードワードです。 ローカルモードワードのビットは、次のとおりです。
LCRTBS000001 消去の時、消去文字の代わりにバックスペース機能を行います
LPRTERA000002 プリンタ端末の消去モード
LCRTERA000004 消去文字を BS-SP-BS としてエコーします
LTILDE000010 Hazeltine 端末で ~ を ’ に変換して出力します
LMDMBUF000020 キャリアが落ちたとき、出力を停止/再開します
LLITOUT000040 出力変換を行いません
LTOSTOP000100 バックグラウンドジョブの出力で SIGTTOU シグナルを送ります
LFLUSHO000200 出力が一掃されます
LNOHANG000400 キャリアが落ちても、hangup シグナルを送りません
LETXACK001000 Diablo 風のバッファハック(未実装)
LCRTKIL002000 行削除の時、BS-SP-BS で行を完全に消去します
LPASS8004000 どのモードでも、入力で 8 ビットすべてを通します
LCTLECH010000 コントロール文字の入力を ^X で、削除を ^? でエコーします
LPENDIN020000 次の読み込みかまたは文字入力で保留入力をタイプしなおします
LDECCTQ040000 ^S 後、DEC システムのように唯一 ^Q が出力を再スタートします
LNOFLSH100000 割り込み文字が入力されたとき、保留中の I/O をフラッシュするのを禁止します
使用できる ioctl 機能は、次のとおりです。
TIOCLBISarg はポインタで、それの指す int 変数は、ローカルモードワードの中でセットしたいビットを含むマスク の値を持ちます。
TIOCLBICarg はポインタで、それの指す int 変数は、ローカルモードワードの中でクリアしたいビットを含むマスク の値を持ちます。
TIOCLSETarg はポインタで、それの指す int 型の値をローカルモードワードにセットします。
TIOCLGETarg はポインタで、それの指す int 変数に現在のローカルモードワードの値を代入します。 ローカル特殊文字:ltchars
各端末に関する 4 番目の構造体は、新端末ドライバの割り込み文字を定義する ltchars 構造体です。それは、次のとおりです。
struct ltchars {
chart_suspc;/∗ プロセスを停止させるシグナル ∗/
chart_dsuspc;/∗ read まで待ってプロセスを停止するシグナル ∗/
chart_rprntc;/∗ 行の再表示 ∗/
chart_flushc;/∗ 出力フラッシュ ∗/
chart_werasc;/∗ ワード消去 ∗/
chart_lnextc;/∗ 次の文字を文字どおりに扱う ∗/
};
それらの文字のデフォルト値は、^Z、^Y、^R、^O、^W、^V です。
使用できる ioctl 機能は、次のとおりです。
TIOCSLTCarg はポインタで、それの指す ltchars 構造体が新しくローカル特殊文字を定義します。
TIOCGLTCarg はポインタで、それの指す ltchars 構造体に現在のローカル特殊文字を代入します。 ウィンドウ/端末サイズ
各端末は、 winsize 構造体に現在の端末またはウィンドウのサイズの情報を持っています。 winsize 構造体の内容は次のとおりです。
struct winsize{
unsigned short ws_row; /∗ 文字単位の行数 ∗/
unsigned short ws_col; /∗ 文字単位の桁数 ∗/
unsigned short ws_xpixel; /∗ ピクセル単位の水平サイズ ∗/
unsigned short ws_ypixel; /∗ ピクセル単位の垂直サイズ ∗/
値が 0 のフィールドは “未定義” と解釈されます。 最後にクローズしたときに構造体全体が 0 になります。
使用できる ioctl 機能は次のとおりです。
TIOCGWINSZ
arg はポインタで、それの指す winsize 構造体に現在の端末またはウィンドウのサイズ情報を代入します。
TIOCSWINSZ
arg はポインタで、それの指す winsize 構造体が現在の端末またはウィンドウのサイズ情報としてセットされます。 情報の内容が、以前の情報と異なったものに更新された場合、 SIGWINCH シグナルが端末のプロセスグループに送られます。 漢字モード
各端末ごとに漢字モードをもつように、tty 構造体が拡張されています。 "#define KANJI" を "#include <sgtty.h> " の前に書いてください。 第 1 に、漢字モードワードは、接続されている端末の種類を表し、 そのドライバの動作を定義しています。 漢字モードワードのビットは次のとおりです。
KM_ASCII0x0000 ASCII 端末
KM_JIS0x0001 JIS 漢字端末
KM_SJIS0x0002 シフトJIS 漢字端末
KM_EUC0x0003 EUC 漢字端末
KM_KANJI0x0003 漢字端末マスク
KM_SYSSJIS0x0000 内部漢字コードはシフト JIS コード
KM_SYSEUC0x0080 内部漢字コードは EUC
KM_SYSKANJI0x0080 内部漢字コードマスク
KM_BS10x0004 漢字を消すために、BS コード 1つだけを必要とする
KM_NOTA0x0008 この型の CRT は、行末で ASCII 選択エスケープシーケンスを発生しません
KM_GRPH0x0010 この型の CRT は、漢字をグラフィックプレーンに書きます
使用できる ioctl 機能は次のとおりです。
TIOCKSETarg はポインタで、それの指す int 型の値を漢字モードワードにセットします。
TIOCKGETarg はポインタで、それの指す int 変数に現在の漢字モードワードの値を代入します。 漢字特殊文字:jtchars
この構造体は、JIS 漢字端末モードで使用され、 1 バイトの JIS ローマン(ASCII)か 2 バイトの漢字コードかを選択する エスケープシーケンスの最後の文字を定義します。 その構造体は、次のとおりです。
struct jtchars{
char t_ascii; /∗ ASCII コードを指示するエスケープシーケンスの最終文字 ∗/
char t_kanji; /∗ 漢字コードを指示するエスケープシーケンスの最終文字 ∗/
};
これらの値のデフォルトは J と B です。
ESC(J JIS ローマン(JIS X 0201-1976)
ESC(B ASCII
ESC(H 規格外(JIS ローマンとしている漢字端末がある)
ESC$B 新 JIS 漢字(JIS X 0208-1983)
ESC$@ 旧 JIS 漢字(JIS C 6226-1978)
使用できる ioctl 機能は、次のとおりです。
TIOCKSETCarg は、ポインタで、それの指す jtchars 構造体が新しく漢字の特殊文字を定義します
TIOCKGETCarg は、ポインタで、それの指す jtchars 構造体に現在の漢字特殊文字を代入します。
関連ファイル
/dev/tty /dev/tty∗ /dev/console
関連事項
csh(1), stty(1), test(1), ioctl(2), sigvec(2), stty(3C), getty(8)
NEWS-OSRelease 3.3