TTY_IOCTL(4) | Linux Programmer's Manual | TTY_IOCTL(4) |
名前
tty_ioctl -端末とシリアルラインの ioctl (入出力制御)書式
#include <termios.h>説明
端末とシリアルポートについての ioctl(2) コールは、多くのコマンド引き数を受け付ける。多くがいろいろな型の 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) と同じ。
- TCSETSF const struct termios * argp
-
tcsetattr(fd, TCSAFLUSH, argp) と同じ。
以下の 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 のみ (より正確には、 CAP_SYS_ADMIN ケーパビリティを持つプロセス) がこれを実行できる。
ウィンドウサイズの取得と設定
ウィンドウサイズはカーネル内に保持されるが、カーネルによって使用されない (仮想コンソールの場合は例外であり、新しいフォントを読み込んだ場合など、仮想端末のサイズが変更された場合、カーネルはウィンドウサイズを更新する)。- 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) と同じ。
- TCSBRKP int arg
- いわゆる「POSIX 版」の TCSBRK である。これは 0 以外の arg を 1/10 秒単位の時間間隔として扱う。またドライバが break をサポートしていない場合は、何もしない。
- TIOCSBRK void
- break をオンにする。つまり 0 のビット列の送信を開始する。
- TIOCCBRK void
- break をオフにする。つまり 0 のビット列の送信を停止する。
ソフトウェアフロー制御
- TCXONC int arg
-
tcflow(fd, arg) と同じ。
バッファのカウントと書き出し (flush)
- FIONREAD int * argp
- 入力バッファにあるバイト数を取得する。
- TIOCINQ int * argp
- FIONREAD と同じ。
- TIOCOUTQ int * argp
- 出力バッファにあるバイト数を取得する。
- TCFLSH int arg
-
tcflush(fd, arg) と同じ。
入力の偽装
- TIOCSTI const char * argp
- 指定されたバイトを入力キューに挿入する。
コンソール出力のリダイレクト
- TIOCCONS void
- /dev/console または /dev/tty0 に送られる出力を、指定された端末リダイレクトする。指定された端末が疑似端末 (pseudoterminal) のマスタの場合、出力はスレーブに送られる。バージョン 2.6.10 より前の Linux では、出力がまだリダイレクトされていなければ、誰でもリダイレクトを行うことができる。バージョン 2.6.10 以降では、root ( CAP_SYS_ADMIN ケーパビリティを持つプロセス) だけがリダイレクトを行うことができる。出力がすでにリダイレクトされている場合は EBUSY が返されるが、 /dev/console か /dev/tty0 を指している fd に対してこの ioctl を使用することで、リダイレクトを止めることができる。
端末の制御
- TIOCSCTTY int arg
- 指定された端末を呼び出し元のプロセスの制御端末にする。呼び出し元のプロセスはセッションリーダでなければならず、かつ既に制御端末を持っていてはならない。この端末が既に他のセッショングループの制御端末である場合、 ioctl は EPERM で失敗する。ただし呼び出したユーザが root で (より正確には CAP_SYS_ADMIN ケーパビリティを持っていて)、かつ arg が 1 である場合を除く。この場合、端末は盗まれ (stolen)、この端末を制御端末としていた全てのプロセスは端末を失う。
- TIOCNOTTY void
- 指定された端末が呼び出し元のプロセスの制御端末である場合、この制御端末を放棄する。プロセスがセッションリーダの場合、フォアグラウンドプロセスグループに SIGHUP と SIGCONT を送り、カレントセッションの全てのプロセスは制御端末を失う。
グループ ID とセッション ID の処理
- TIOCGPGRP pid_t * argp
-
成功した場合、
*argp = tcgetpgrp(fd) と同じ。
- TIOCSPGRP const pid_t * argp
-
tcsetpgrp(fd, *argp) と同じ。
- TIOCGSID pid_t * argp
- 指定された端末のセッション ID を取得する。端末がマスタ疑似端末または制御端末でない場合は、 ENOTTY で失敗する。奇妙だ。
排他モード
- TIOCEXCL void
- 端末を排他モードにする。端末に対して、これ以降の open(2) 操作を禁止する。 (root 以外の場合、つまり CAP_SYS_ADMIN ケーパビリティを持たないプロセスの場合、これ以降の 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 開始文字と終了文字が ^S/ ^Q である。
TIOCPKT_NOSTOP 開始文字と終了文字が ^S/ ^Q でない。
モデム制御
- 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(2) システムコールは、成功した場合は 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)この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2008-10-29 | Linux |