Provided by: manpages-ja_0.5.0.0.20161015+dfsg-1_all ![bug](/img/bug.png)
![bug](/img/bug.png)
名前
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 構造体のロック状態を設定する。 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 以降では、 CAP_SYS_ADMIN ケーパビリティを持つプロセスだけがリダイレクトを行うことが できる。 出力がすでにリダイレクトされている場合は EBUSY が返されるが、 /dev/console か /dev/tty0 を指している fd に対してこの ioctl を使用することで、リダイレクトを止めることができる。 端末の制御 TIOCSCTTY int arg 指定された端末を呼び出し元のプロセスの制御端末にする。 呼び出し元のプロセスはセッションリーダでな ければならず、 かつ既に制御端末を持っていてはならない。 この場合 arg には 0 を指定すべきである。 この端末が既に他のセッショングループの制御端末である場合、 ioctl は EPERM で失敗する。ただし呼び出 したユーザーが 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) 操作を禁止する。 (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.79 の一部 である。プロジェクトの説明とバグ報告 に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。