TTY_IOCTL

Section: Linux Programmer's Manual (4)
Updated: 2002-12-29
Index JM Home Page roff page
 

名前

tty ioctl - 端末とシリアルラインの ioctl (入出力制御)  

書式

#include <termios.h>

int ioctl(int fd, int cmd, ...);  

説明

端末とシリアルポートについての ioctl() コールは、多くのコマンド引き数を受け付ける。 多くがいろいろな型の 3 番目の引き数を必要とする。 ここでは argp または arg と呼ぶ。

ioctl を使用すると移植性のないプログラムになる。 可能な場合は、 termios(3) に記述されている POSIX インタフェースを使うこと。  

端末属性の取得と設定

TCGETS        struct termios *argp
tcgetattr(fd, argp) と同じ。

現在のシリアルポートの設定を取得する。
TCSETS const struct termios *argp
tcsetattr(fd, TCSANOW, argp) と同じ。

現在のシリアルポートの設定を変更する。
TCSETSW        const struct termios *argp
tcsetattr(fd, TCSADRAIN, argp) と同じ。

排出 (drain) を行うための出力バッファの使用を許可し、 現在のシリアルポートの設定を変更する。
TCSETSF        const struct termios *argp
tcsetattr(fd, TCSAFLUSH, argp) と同じ。

排出 (drain) を行うための出力バッファの使用を許可し、 処理していない入力を破棄して、 現在のシリアルポートの設定を変更する。

以下の 4 つの ioctl は TCGETS, TCSETS, TCSETSW, TCSETSF と似ている。 ただし、 struct termios * の代わりに struct termio * を取る。

TCGETA struct termio *argp
TCSETA        const struct termio *argp
TCSETAW       const struct termio *argp
TCSETAF       const struct termio *argp
 

termios 構造体のロック

端末の termios 構造体はロックすることが可能である。
このロック自体は termios 構造体であり、 0 でないビットまたはフィールドはロックされた値を示す。
TIOCGLCKTRMIOS struct termios *argp
端末の termios 構造体のロック状態を取得する。
TIOCSLCKTRMIOS const struct termios *argp
端末の termios 構造体のロック状態を設定する。
root のみがこれを実行できる。
 

ウィンドウサイズの取得と設定

ウィンドウサイズはカーネル内に保持されるが、 カーネルによって使用されない (仮想コンソールの場合は例外であり、新しいフォントを読み込んだ場合など、 仮想端末のサイズが変更された場合、カーネルはウィンドウサイズを更新する)。
TIOCGWINSZ     struct winsize *argp
ウィンドウサイズを取得する。
TIOCSWINSZ     const struct winsize *argp
ウィンドウサイズを設定する。

これらの ioctl で使用される構造体は、以下のように定義される。

struct winsize {
    unsigned short ws_row;
    unsigned short ws_col;
    unsigned short ws_xpixel;   /* 未使用 */
    unsigned short ws_ypixel;   /* 未使用 */
};

ウィンドウサイズが変更された場合、 フォアグラウンドプロセスグループに SIGWINCH シグナルが送られる。  

break の送信

TCSBRK        int arg
tcsendbreak(fd, arg) と同じ。

端末が非同期シリアルデータ転送を使用しており、 arg が 0 の場合、0.25 から 0.5 秒の間に break (0 のビット列のストリーム) が送信される。 端末が非同期シリアルデータ転送を使用している場合、 break が送信されるか、この関数は何もせずに返る。 arg が 0 以外の場合、何が起こるか分からない。

(SVr4, UnixWare, Solaris, Linux は、 tcsendbreak(fd,arg)arg が 0 以外の場合、 tcdrain(fd) のように扱う。 SunOS は arg を倍数として扱い、ビットのストリームを arg 回送信する。 arg が 0 の場合も同じ。 DG/UX と AIX は、(0 以外の場合) arg をミリ秒単位の時間間隔として扱う。 HP-UX は arg を無視する。)

TCSBRKP        int arg
いわゆる「POSIX 版」の
TCSBRK である。 これは 0 以外の arg を 1/10 秒単位の時間間隔として扱う。 またドライバが break をサポートしていない場合は、何もしない。
TIOCSBRK       void
break をオンにする。
つまり 0 のビット列の送信を開始する。
TIOCCBRK       void
break をオフにする。
つまり 0 のビット列の送信を停止する。
 

ソフトウェアフロー制御

TCXONC        int arg
tcflow(fd, arg) と同じ。

tcflow(3) の引き数 TCOOFF, TCOON, TCIOFF, TCION を参照すること。
 

バッファのカウントと書き出し (flush)

FIONREAD      int *argp
入力バッファにあるバイト数を取得する。
TIOCINQ        int *argp
FIONREAD と同じ。
TIOCOUTQ       int *argp
出力バッファにあるバイト数を取得する。
TCFLSH int arg
tcflush(fd, arg) と同じ。

tcflush(3) の引き数 TCIFLUSH, TCOFLUSH, TCIOFLUSH を参照すること。
 

入力の偽装

TIOCSTI       const char *argp
指定されたバイトを入力キューに挿入する。
 

コンソール出力のリダイレクト

TIOCCONS      void
/dev/console または
/dev/tty0 に送られる出力を、指定された端末 (tty) にリダイレクトする。 指定された端末が疑似端末 (pty) のマスタの場合、出力はスレーブに送られる。 出力がまだリダイレクトされていなければ、 誰でもリダイレクトを行うことができる。 既にリダイレクトされている場合は EBUSY が返されるが、 root は、 /dev/console または /dev/tty0 を指す fd に対してこの ioctl を使用することにより、リダイレクトを止めることができる。
 

端末の制御

TIOCSCTTY     int arg
指定された端末をカレントプロセスの制御端末にする。
カレントプロセスはセッションリーダでなければならず、 かつ既に制御端末を持っていてはならない。 この端末が既に他のセッショングループの制御端末である場合、 ioctl は EPERM で失敗する。ただし呼び出したユーザが root で、かつ arg が 1 である場合を除く。 この場合、端末は盗まれ (stolen)、 この端末を制御端末としていた全てのプロセスは端末を失う。
TIOCNOTTY       void
指定された端末がカレントプロセスの制御端末である場合、
この制御端末を放棄する。 プロセスがセッションリーダの場合、 フォアグラウンドプロセスグループに SIGHUPSIGCONT を送り、カレントセッションの全てのプロセスは制御端末を失う。
 

グループ ID とセッション ID の処理

TIOCGPGRP     pid_t *argp
成功した場合、
*argp = tcgetpgrp(fd) と同じ。
この端末上のフォアグラウンドプロセスのプロセスグループ ID を取得する。
TIOCSPGRP      const pid_t *argp
tcsetpgrp(fd, *argp) と同じ。

この端末のフォアグラウンドプロセスのグループ ID を設定する。
TIOCGSID       pid_t *argp
指定された端末のセッション ID を取得する。
端末がマスタ疑似端末または制御端末でない場合は、 ENOTTY で失敗する。 奇妙だ。
 

排他モード

TIOCEXCL      void
端末を排他モードにする。
端末に対して、これ以降の open(2) 操作を禁止する。 (root 以外の場合、これ以降の open(2) は EBUSY で失敗する。)
TIOCNXCL       void
排他モードを無効にする。
 

ライン制御 (line discipline)

TIOCGETD      int *argp
端末のライン制御の情報を取得する。
TIOCSETD       const int *argp
端末のライン制御の情報を設定する。
 

疑似端末の ioctl

TIOCPKT       const int *argp
パケットモードを有効
(*argp が 0 以外の場合) または無効にする。 疑似端末のマスタ側にのみ適用できる (それ以外の場合は ENOTTY を返す)。 パケットモードでは、その後に実行される read(2) は、値が 0 以外の 1 つの制御バイトを含むパケットか、 値が 0 の 1 バイト ('\0') に疑似端末のスレーブ側で書き込まれた データが続くパケットを返す。 最初のバイトが TIOCPKT_DATA (0) でない場合、以下のビットの 1 つ以上を OR したものである:

TIOCPKT_FLUSHREAD   端末の読み込みキューがフラッシュ (flush) される。
TIOCPKT_FLUSHWRITE  端末の書き出しキューがフラッシュされる。
TIOCPKT_STOP        端末への出力が停止される。
TIOCPKT_START       端末への出力が再開される。
TIOCPKT_DOSTOP      t_stopc が `^S' で、かつ t_startc が `^Q' である。
TIOCPKT_NOSTOP      start 文字と stop 文字が `^S/^Q' でない。

このモードが使われている場合、 制御状態情報の存在がマスタ側から読み込めるかは、 例外的な条件で select(2) を使うことにより知ることができる。

このモードは rlogin(1) と rlogind(8) で使われ、リモートエコーのリモートログインと ローカルでの `^S/^Q' フロー制御のリモートログインを実装している。

BSD の ioctl である TIOCSTOP, TIOCSTART, TIOCUCNTL, TIOCREMOTE は、Linux では実装されていない。

 

モデム制御

TIOCMGET      int *argp
モデムビット列の状態を取得する。
TIOCMSET       const int *argp
モデムビット列の状態を設定する。
TIOCMBIC       const int *argp
指定されたモデムビット列をクリアする。
TIOCMBIS       const int *argp
指定されたモデムビット列を設定する。

これらの 4 つの ioctl で使われるビットは以下の通り:

TIOCM_LE        DSR (data set ready/line enable)
TIOCM_DTR       DTR (data terminal ready)
TIOCM_RTS       RTS (request to send)
TIOCM_ST        Secondary TXD (transmit)
TIOCM_SR        Secondary RXD (receive)
TIOCM_CTS       CTS (clear to send)
TIOCM_CAR       DCD (data carrier detect)
TIOCM_CD         TIOCM_CAR を参照。
TIOCM_RNG       RNG (ring)
TIOCM_RI         TIOCM_RNG を参照。
TIOCM_DSR       DSR (data set ready)
 

回線をローカルとしてマークする

TIOCGSOFTCAR  int *argp
("ソフトウェアキャリアフラグの取得")
termios 構造体の c_cflag フィールドの CLOCAL フラグの状態を取得する。
TIOCSSOFTCAR   const int *argp
("ソフトウェアキャリアフラグの設定")
*argp が 0 以外の場合、termios 構造体の CLOCAL フラグを設定する。 0 の場合はクリアする。

ラインの CLOCAL フラグがオフの場合、 ハードウェアキャリア検出 (hardware carrier detect, DCD) シグナルが重要であり、 O_NONBLOCK フラグが指定されない限り、対応する端末の open(2) は DCD が示されるまでブロックされる。 CLOCAL が設定されている場合、 ラインは常に DCD が示されているかのように動作する。 ソフトウェアキャリアフラグは、ローカルデバイスでは通常はオンになっており、 モデムのラインではオフになっている。  

Linux 固有の ioctl

TIOCLINUX ioctl については、 console_ioctl(4) を参照すること。  

カーネルデバッギング

#include <linux/tty.h>

TIOCTTYGSTRUCT      struct tty_struct *argp
fd に対応する tty_struct を取得する。
 

返り値

ioctl() システムコールは、成功した場合は 0 を返す。 エラーの場合は -1 を返し、 errno を適切に設定する。  

エラー

EINVAL
不正なコマンド引き数である。
ENOIOCTLCMD
不明なコマンドである。
ENOTTY
fd が不適切である。
EPERM
権限が不足している。
 

シリアルポートの DTR の状態をチェックする。

#include <termios.h>
#include <fcntl.h>
#include <sys/ioctl.h>

int
main(void)
{
    int fd, serial;

    fd = open("/dev/ttyS0", O_RDONLY);
    ioctl(fd, TIOCMGET, &serial);
    if (serial & TIOCM_DTR)
        puts("TIOCM_DTR が設定されていない。");
    else
        puts("TIOCM_DTR が設定されている。");
    close(fd);
}
 

関連項目

ioctl(2), termios(3), console_ioctl(4), pty(7)


 

Index

名前
書式
説明
端末属性の取得と設定
termios 構造体のロック
ウィンドウサイズの取得と設定
break の送信
ソフトウェアフロー制御
バッファのカウントと書き出し (flush)
入力の偽装
コンソール出力のリダイレクト
端末の制御
グループ ID とセッション ID の処理
排他モード
ライン制御 (line discipline)
疑似端末の ioctl
モデム制御
回線をローカルとしてマークする
Linux 固有の ioctl
カーネルデバッギング
返り値
エラー
関連項目

This document was created by man2html, using the manual pages.
Time: 04:32:09 GMT, November 19, 2007