tty_ioctl

Autres langues

Langue: ja

Version: 2002-12-29 (mandriva - 01/05/08)

Section: 4 (Pilotes et protocoles réseau)

名前

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)、 この端末を制御端末としていた全てのプロセスは端末を失う。
TIOCNOTTYvoid
指定された端末がカレントプロセスの制御端末である場合、 この制御端末を放棄する。 プロセスがセッションリーダの場合、 フォアグラウンドプロセスグループに SIGHUP と SIGCONT を送り、 カレントセッションの全てのプロセスは制御端末を失う。

グループ 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 バイト ('' ') に疑似端末のスレーブ側で書き込まれた データが続くパケットを返す。 最初のバイトが 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 を適切に設定する。

エラー

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

シリアルポートの 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)