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) を使って呼び出されます。 パラメータ request と argp の説明については 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)