tty_ioctl -
端末とシリアルラインの
ioctl (入出力制御)
#include <termios.h>
int ioctl(int fd, int cmd, ...);
端末とシリアルポートについての
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)
と同じ。
排出 (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 のみ
(より正確には、
CAP_SYS_ADMIN
ケーパビリティを持つプロセス)
がこれを実行できる。
ウィンドウサイズの取得と設定¶
ウィンドウサイズはカーネル内に保持されるが、
カーネルによって使用されない
(仮想コンソールの場合は例外であり、新しいフォントを読み込んだ場合など、
仮想端末のサイズが変更された場合、カーネルはウィンドウサイズを更新する)。
以下の定数と構造体は
<sys/ioctl.h>
で定義されている。
- 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
に送られる出力を、指定された端末リダイレクトする。
指定された端末が疑似端末
(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) と同じ。
この端末上のフォアグラウンドプロセスのプロセスグループ
ID を取得する。
- TIOCSPGRP const pid_t *argp
- tcsetpgrp(fd, *argp)
と同じ。
この端末のフォアグラウンドプロセスのグループ
ID を設定する。
- 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 でない。
このモードが使われている場合、
制御状態情報の存在がマスタ側から読み込めるかは、
例外的な条件で 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(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.41 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。