スポンサーリンク

TTY(4) FreeBSD カーネルインタフェースマニュアル TTY(4)

名称

tty − 一般的な端末へのインタフェース

書式

#include <sys/ioctl.h>

解説

本セクションではシステムの端末ドライバへのインタフェースを解説します。

端末型特殊ファイル

システム上の各ハードウェア端末ポートは、通常ディレクトリ ‘‘/dev/’’ 内にあ る端末型特殊デバイスファイル (例えば ‘‘/dev/tty03’’ など) に関連付けられ ます。ユーザがこうしたハードウェア端末ポートからシステムにログインしたと きには、システムはすでに関連するデバイスをオープンしており、通常の対話的 利用のために回線を準備しています ( getty(8) を参照)。一方、ハードウェア端 末ポートにではなく、別のプログラムに接続する特別な端末型ファイルもありま す。そういった特別な端末デバイスは 疑似端末 (pty) と呼ばれ、ネットワーク 越しに (例えば rlogin(1)telnet(1) を利用して) ログインする際に、ログ イン先のシステムに対して同様のインタフェースをユーザに与えるのに必要な機 構を提供します。そのような場合にも、端末型ファイルがどのようにオープンさ れ準備されたかといった細かなことは、システム内部の特別なソフトウェアがす でに処理してくれています。こういった具合に、ユーザは通常どのようにこれら の回線をオープンし利用するかといった細かなことに気を回す必要はありませ ん。また、これらの回線は (発信モデムを通して) システムのダイヤルアウトに もよく使われますが、その場合にも、こうした端末型特殊ファイルへのアクセス の詳細を隠してくれるプログラムをシステムが提供します ( tip(1) 参照)。

ユーザが対話的にログインしたとき、システムはその回線をある様式 ( 回線制御 規則 (line discipline) と呼ばれます) に従う動作をするように準備します。回 線制御規則の詳細は、コマンドレベルでは stty(1) に、プログラミングレベルで は termios(4) に解説がされています。ユーザは独自のログイン端末に関する設 定を変更しようと思うかもしれません。そんなときは、先に挙げたほうのマニュ アルページを参照してよくある事例を調べるとよいでしょう。本マニュアルペー ジの残りでは、端末デバイスを低レベルで使用したり制御したりする際の詳細に ついて解説します。おそらく、システムの提供する機能と似たものを提供しよう とするプログラムでは必要なことでしょう。

回線制御規則

端末型ファイルは、標準システムコールを用いてオープン、読み込み、書き込み ができるという点でシステム中の他のファイルと同じように使用されます。存在 する端末型ファイルそれぞれにつき、 回線制御規則と呼ばれるソフトウェア処理 モジュールが関連付けられます。 回線制御規則は、本質的には、低レベルのデバ イスドライバのコードと高レベルの一般インタフェースルーチン ( read(2)write(2) など) を結びつけ、そのデバイスについてのセマンティクスを実装する 役目を持ちます。最初に端末型ファイルがプログラムからオープンされると、 termios 回線制御規則と呼ばれるデフォルトの 回線制御規則がそのファイルに関 連付けられます。これはほとんどの場合で利用される主要な回線制御規則であ り、通常、ユーザが端末に関連付けるようなセマンティクスを提供します。 termios 回線制御規則が有効になると、端末型ファイルは termios(4) で記述さ れている規則に従って動作し、操作されます。端末セマンティクスの完全な解説 については termios マニュアルページを参照してください。このマニュアルペー ジで解説されている操作は、一般にすべての 回線制御規則に対して共通な機能を 表しています。しかし、これらの中には termios 以外の回線制御規則と一緒に使 用しても意味の無い呼び出しや、ハードウェアでサポートされていない (また は、疑似端末の場合のように、ハードウェア自体を持たないため使用できない) ものもあります。

端末型ファイルの操作

次に挙げる操作はすべてシステムコール ioctl(2) を使って呼び出されます。パ ラメータ requestargp の説明については ioctl マニュアルページを参照し てください。ここに定義されている ioctl リクエストに加え、有効となった回線 制御規則によっては特有の リクエストを他に定義していることもあります (実際 は、 termios(4) はそれらを ioctl リクエストではなく関数呼び出しとして定義 しています)。次のセクションでは利用可能な ioctl リクエストを列挙します。 リクエスト名、その利用目的の説明、そして (パラメータを取る場合は) 型を示 した argp パラメータを記します。例えば、最初の項目では

TIOCSETD int *ldisc

という記述があります。これは、次のような部分コードを用いてファイル記述子 0 に関連付けられた端末上で呼び出されるでしょう。

int ldisc;

ldisc = TTYDISC;

ioctl(0, TIOCSETD, &ldisc);

端末型ファイル用リクエストの解説

       TIOCSETD int *ldisc

ldisc が指す新しい回線規則に変更します。利用可能な回線制御規 則は ~ ⟨sys/ttycom.h⟩ に列挙されています。現在は次のものが利 用可能です:

TTYDISC
termios 対話的回線制御規則
TABLDISC
タブレット回線制御規則
SLIPDISC
シリアル IP 回線制御規則
PPPDISC
PPP 回線制御規則

TIOCGETD int *ldisc
ldisc
の指す整数に現在の回線制御規則を返します。

TIOCSBRK void
端末ハードウェアをブレーク (BREAK) 条件に設定します。

TIOCCBRK void
端末ハードウェアのブレーク条件をクリアします。

TIOCSDTR void
データ端末レディ (DTR) を有効にします。

TIOCCDTR void
データ端末レディ (DTR) をクリアします。

TIOCGPGRP int *tpgrp
端末が関連付けられている現在のプロセスグループを tpgrp の指す 整数に返します。これは termios(4) の tcgetattr() 呼び出しを実 装している下位の呼び出しです。

TIOCSPGRP int *tpgrp
tpgrp
の指すプロセスグループ (整数) に端末を関連付けます。こ れは termios(4) の tcsetattr() 呼び出しを実装している下位の呼 び出しです。

TIOCGETA struct termios *term
デバイスが関連付けられている現在の termios 状態を term の指す termios 構造体に代入します。これは termios(4) の tcgetattr() 呼び出しを実装している下位の呼び出しです。

TIOCSETA struct termios *term
デバイスに関連付けられている termios 状態を即座に設定します。 これは termios(4) の tcsetattr() に TCSANOW オプションを渡し た場合の呼び出しを実装している下位の呼び出しです。

TIOCSETAW struct termios *term
まず出力がすべて完了するのを待ち、それからデバイスに関連付け られた termios 状態を設定します。これは termios(4) の tcsetattr() に TCSADRAIN オプションを渡した場合の呼び出しを実 装している下位の呼び出しです。

TIOCSETAF struct termios *term
まず出力がすべて完了するのを待ち、保留されている入力をクリア し、それからデバイスに関連付けられた termios 状態を設定しま す。これは termios(4) の tcsetattr() に TCSAFLUSH オプション を渡した場合の呼び出しを実装している下位の呼び出しです。

TIOCOUTQ int *num
現在の出力キューにある文字数を num の指す整数に代入します。

TIOCSTI char *cp
タイピング入力をシミュレートします。端末が cp の指す文字入力 を受けたかのように見せかけます。

TIOCNOTTY void
この呼び出しは時代遅れですが、互換性のために残されています。 以前は、制御端末 ( termios(4) の 端末制御セクションを参照) を 持たないプロセスが最初に端末デバイスをオープンしたとき、その 端末をプロセスの制御端末として利用できました。プログラムに よっては最初は制御端末を必要としない場合もあるので、これは危 険なことでした。そこでこの呼び出しは、プロセスから制御端末を 切り離す機能を提供していたのです。ファイル /dev/tty をオープ ンし、そのファイル記述子で TIOCNOTTY を呼び出さなければ なり ません。

現在のシステムでは、 open() 呼び出しにおいてプロセスに制御端 末を割り当てるようなことはしません。端末を制御端末にするため の TIOSCTTY という特別な ioctl が存在します。また、プログラム 中で fork() を行い setsid() システムコールを呼び出して、プロ セスを専用のセッションに置くこともできます。そうするとプロセ スを制御端末から切り離す効果があります。プログラム中で制御端 末を取り除くには、こちらが新しく、望ましい方法です。

TIOCSTOP void
(キーボードから ^S を入力するように) 端末の出力を止めます。

TIOCSTART void
(キーボードから ^Q を入力するように) 端末の出力を開始します。

TIOCSCTTY void
端末をプロセスの制御端末にします (このときプロセスは制御端末 を持っていてはいけません)。

TIOCDRAIN void
すべての出力が終わるまで待ちます。

TIOCEXCL void
端末を専有使用するよう設定します。以後、root 以外がこの端末を オープンすることはできません。もちろん、root によって実行され た (あるいは setuid された) プログラムはこの専有設定には従い ません。これによって、この機能の有用性が制限されることになり ます。

TIOCNXCL void
端末の専有使用を取り消します。以後、この端末をオープンできる ようになります。

TIOCFLUSH int *what
what
の指す整数値が ~ ⟨sys/file.h⟩ に定義されている FREAD ビットを含むなら、入力キューにある文字はすべて消去されます。 FWRITE ビットを含むなら、出力キューにある文字はすべて消去され ます。整数値が 0 なら、 FREAD ビットと FWRITE ビットの両方が セットされているかのように動作します (つまり両方のキューをク リアします)。

TIOCGWINSZ struct winsize *ws
端末に関連付けられたウィンドウのサイズ情報を ws の指す winsize 構造体に代入します。ウィンドウサイズの構造体は、端末 に接続されたデバイスの行数と桁数 (適切な場合にはピクセル数も) を保持します。これはユーザソフトウェアによって設定され、全画 面指向のプログラムのほとんどがこの方法で画面サイズを決定しま す。 winsize 構造体は ~ ⟨sys/ioctl.h⟩ に定義されています。

TIOCSWINSZ struct winsize *ws
端末に関連付けられたウィンドウのサイズを ws の指す winsize 構 造体 (上記参照) 中の値に設定します。

TIOCCONS int *on
on
が 0 以外の整数を指していれば、カーネルコンソールの出力 ( カーネルの printf 先) をこの端末にリダイレクトします。 on が 整数 0 を指していれば、カーネルコンソールの出力を通常のコン ソールに戻します。これは普通、ワークステーション上でカーネル メッセージを特定のウィンドウにリダイレクトするのに使われま す。

TIOCMSET int *state
state
の指す整数は、モデムの状態に対応するビットを含みます。 次のリストは定義済み変数とそれが表すモデムの状態です:

TIOCM_LE
回線利用可能 (Line Enable)
TIOCM_DTR
データ端末レディ (Data Terminal Ready)
TIOCM_RTS
送信要求 (Request To Send)
TIOCM_ST
従局送信 (Secondary Transmit)
TIOCM_SR
従局受信 (Secondary Receive)
TIOCM_CTS
送信可 (Clear To Send)
TIOCM_CAR
キャリア検出 (Carrier Detect)
TIOCM_CD
キャリア検出 (別称)
TIOCM_RNG
被呼表示 (Ring Indication)
TIOCM_RI
被呼表示 (別称)
TIOCM_DSR
データセットレディ (Data Set Ready)

この呼び出しは、端末モデムを state の表す状態に設定します。す べての端末がこの呼び出しをサポートしているとは限りません。

TIOCMGET int *state
上記のような端末モデム回線の現在の状態を state の指す整数に返 します。

TIOCMBIS int *state
state
の指す整数が含むビットは、上記のようなモデムの状態を表 しますが、現在の状態との OR (和) が設定されます。

TIOCMBIC int *state
state
の指す整数が含むビットは、上記のようなモデムの状態を表 しますが、 state 中でオンになっている各ビットを端末中でクリア します。

関連項目

stty(1), ioctl(2), pty(4), termios(4), getty(8)

4th Berkeley Distribution August 14, 1992 4th Berkeley Distribution

スポンサーリンク