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
-
指定された端末がカレントプロセスの制御端末である場合、
この制御端末を放棄する。
プロセスがセッションリーダの場合、
フォアグラウンドプロセスグループに
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 バイト ('\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