名前
tty ioctl - 端末とシリアルラインの ioctl (入出力制御)
書式
#include <termios.h>
int ioctl(int fd, int cmd, ...);
説明
端末とシリアルポートについての ioctl() コールは、多くのコマンド引き数を受け付ける。 多くがいろいろな型の 3 番目の引き数を必要とする。 ここでは argp または arg と呼ぶ。
ioctl を使用すると移植性のないプログラムになる。 可能な場合は、 termios(3) に記述されている POSIX インタフェースを使うこと。
端末属性の取得と設定
TCGETS struct termios * | |
tcgetattr(fd, argp) と同じ。 現在のシリアルポートの設定を取得する。 | |
TCSETS const struct termios * | |
tcsetattr(fd, TCSANOW, argp) と同じ。 現在のシリアルポートの設定を変更する。 | |
TCSETSW const struct termios * | |
tcsetattr(fd, TCSADRAIN, argp) と同じ。 排出 (drain) を行うための出力バッファの使用を許可し、 現在のシリアルポートの設定を変更する。 | |
TCSETSF const struct termios * | |
tcsetattr(fd, TCSAFLUSH, argp) と同じ。 排出 (drain) を行うための出力バッファの使用を許可し、 処理していない入力を破棄して、 現在のシリアルポートの設定を変更する。 | |
以下の 4 つの ioctl は TCGETS, TCSETS, TCSETSW, TCSETSF と似ている。 ただし、 struct termios * の代わりに struct termio * を取る。 | |
TCGETA struct termio *
TCSETA const struct termio * TCSETAW const struct termio * TCSETAF const struct termio * | |
termios 構造体のロック
端末の termios 構造体はロックすることが可能である。 このロック自体は termios 構造体であり、 0 でないビットまたはフィールドはロックされた値を示す。
TIOCGLCKTRMIOS struct termios * | |
端末の termios 構造体のロック状態を取得する。 | |
TIOCSLCKTRMIOS const struct termios * | |
端末の termios 構造体のロック状態を設定する。 root のみがこれを実行できる。 | |
ウィンドウサイズの取得と設定
ウィンドウサイズはカーネル内に保持されるが、 カーネルによって使用されない (仮想コンソールの場合は例外であり、新しいフォントを読み込んだ場合など、 仮想端末のサイズが変更された場合、カーネルはウィンドウサイズを更新する)。
TIOCGWINSZ struct winsize * | |
ウィンドウサイズを取得する。 | |
TIOCSWINSZ const struct winsize * | |
ウィンドウサイズを設定する。 | |
struct winsize { unsigned short ws_row; unsigned short ws_col; unsigned short ws_xpixel; /* 未使用 */ unsigned short ws_ypixel; /* 未使用 */ };
ウィンドウサイズが変更された場合、 フォアグラウンドプロセスグループに SIGWINCH シグナルが送られる。
break の送信
TCSBRK int | |
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 | |
いわゆる「POSIX 版」の TCSBRK である。 これは 0 以外の arg を 1/10 秒単位の時間間隔として扱う。 またドライバが break をサポートしていない場合は、何もしない。 | |
TIOCSBRK void | |
break をオンにする。 つまり 0 のビット列の送信を開始する。 | |
TIOCCBRK void | |
break をオフにする。 つまり 0 のビット列の送信を停止する。 | |
ソフトウェアフロー制御
TCXONC int | |
tcflow(fd, arg) と同じ。 tcflow(3) の引き数 TCOOFF, TCOON, TCIOFF, TCION を参照すること。 | |
バッファのカウントと書き出し (flush)
FIONREAD int * | |
入力バッファにあるバイト数を取得する。 | |
TIOCINQ int * | |
FIONREAD と同じ。 | |
TIOCOUTQ int * | |
出力バッファにあるバイト数を取得する。 | |
TCFLSH int | |
tcflush(fd, arg) と同じ。 tcflush(3) の引き数 TCIFLUSH, TCOFLUSH, TCIOFLUSH を参照すること。 | |
入力の偽装
TIOCSTI const char * | |
指定されたバイトを入力キューに挿入する。 | |
コンソール出力のリダイレクト
TIOCCONS void | |
/dev/console または /dev/tty0 に送られる出力を、指定された端末 (tty) にリダイレクトする。 指定された端末が疑似端末 (pty) のマスタの場合、出力はスレーブに送られる。 出力がまだリダイレクトされていなければ、 誰でもリダイレクトを行うことができる。 既にリダイレクトされている場合は EBUSY が返されるが、 root は、 /dev/console または /dev/tty0 を指す fd に対してこの ioctl を使用することにより、リダイレクトを止めることができる。 | |
端末の制御
TIOCSCTTY int | |
指定された端末をカレントプロセスの制御端末にする。 カレントプロセスはセッションリーダでなければならず、 かつ既に制御端末を持っていてはならない。 この端末が既に他のセッショングループの制御端末である場合、 ioctl は EPERM で失敗する。 ただし呼び出したユーザが root で、 かつ arg が 1 である場合を除く。 この場合、端末は盗まれ (stolen)、 この端末を制御端末としていた全てのプロセスは端末を失う。 | |
TIOCNOTTYvoid | |
指定された端末がカレントプロセスの制御端末である場合、 この制御端末を放棄する。 プロセスがセッションリーダの場合、 フォアグラウンドプロセスグループに SIGHUP と SIGCONT を送り、 カレントセッションの全てのプロセスは制御端末を失う。 | |
グループ ID とセッション ID の処理
TIOCGPGRP pid_t * | |
成功した場合、 *argp = tcgetpgrp(fd) と同じ。 この端末上のフォアグラウンドプロセスのプロセスグループ ID を取得する。 | |
TIOCSPGRP const pid_t * | |
tcsetpgrp(fd, *argp) と同じ。 この端末のフォアグラウンドプロセスのグループ ID を設定する。 | |
TIOCGSID pid_t * | |
指定された端末のセッション ID を取得する。 端末がマスタ疑似端末または制御端末でない場合は、ENOTTY で失敗する。 奇妙だ。 | |
排他モード
TIOCEXCL void | |
端末を排他モードにする。 端末に対して、これ以降の open(2) 操作を禁止する。 (root 以外の場合、これ以降の open(2) は EBUSY で失敗する。) | |
TIOCNXCL void | |
排他モードを無効にする。 | |
ライン制御 (line discipline)
TIOCGETD int * | |
端末のライン制御の情報を取得する。 | |
TIOCSETD const int * | |
端末のライン制御の情報を設定する。 | |
疑似端末の ioctl
TIOCPKT const int * | |
パケットモードを有効
(*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 * | |
モデムビット列の状態を取得する。 | |
TIOCMSET const int * | |
モデムビット列の状態を設定する。 | |
TIOCMBIC const int * | |
指定されたモデムビット列をクリアする。 | |
TIOCMBIS const int * | |
指定されたモデムビット列を設定する。 | |
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 * | |
("ソフトウェアキャリアフラグの取得") termios 構造体の c_cflag フィールドの CLOCAL フラグの状態を取得する。 | |
TIOCSSOFTCAR const int * | |
("ソフトウェアキャリアフラグの設定") *argp が 0 以外の場合、termios 構造体の CLOCAL フラグを設定する。 0 の場合はクリアする。 | |
Linux 固有の ioctl
TIOCLINUX ioctl については、 console_ioctl(4) を参照すること。
カーネルデバッギング
#include <linux/tty.h>
TIOCTTYGSTRUCT struct tty_struct * | |
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)