C termios構造体
ナビゲーションに移動
検索に移動
C termios構造体
termios構造体
- 端末interfaceを制御するには、termios型の構造体に値を設定し、関数呼び出しを使う。
- 構造体と関数呼び出しは、termios.hで定義されている。
- termios.hで定義されている関数呼び出しを使うprogramでは、適切な関数libraryとlinkする必要がある。
- 通常使用するのは、curses library。例えば、-lcursesや-lncursesのように指定する。
- 端末を制御するときに操作する値は、次のような様々なmodeにgroup化できる。
- 入力
- 出力
- 制御
- local
- 特殊制御文字
一般にtermios構造体は、次のように宣言されている
#include <termios.h> struct termios { tcflag_t c_iflag; tcflag_t c_oflag; tcflag_t c_cflag; tcflag_t c_lflag; cc_t c_cc[NCCS]; };
- termios構造体の各memberには、上に示した5つのparameterの種類に対応する名前がついている。
- tcgetattr関数を呼び出すと、端末に対応するtermios構造体を初期化することができる。
#include <termios.h> int tcgetattr(int fd, struct termios, *termios_p);
- tcgetattr関数は、端末interface変数の現在の値をtermios_pで示される構造体に書き込む。
- 端末interface変数の値を変更したあと、tcsetattr関数を呼び出すと、端末interfaceを設定しなおすことができる。
#include <termios.h> int tcsetattr(int fd, int actions, const struct termios, *termios_p);
- tcsetattr関数のparameterには、変更の適用方法として、次の3つのうちのいずれかを指定する。
actions paramter | 説明 |
---|---|
TCSANOW | 値を直ちに変更 |
TCSADRAIN | 現在の出力が完了した後に値を変更 |
TCSAFLUSH | 現在の出力が完了した後に値を変更するが、現在利用可能な入力のうち、readの呼び出しで返されていないものはすべて破棄する |
※programの中で端末の設定を変更する場合には、programを終了するときに起動前の端末の値を復元する。
入力mode
- 入力modeは、入力(serial portまたはkeybordから端末driverが受け取った文字)をどのように処理してからprogramに渡すかを制御
- 具体的には、termios構造体のmember c_iflagでflagを設定する。
- flagはいずれもmacroとして定義されており、これをbit単位の論理和で指定する。
この指定方法は、入力modeだけでなく、すべての端末modeに適用される。
c_iflagで使用できるmacro | 説明 |
---|---|
BRKINT | 回線上でbreakを検出したときに割り込みを生成 |
IGNBRK | 回線上のbreakを無視 |
ICRNL | 受信したcarriage returnを開業に変換 |
IGNCR | 受信したcarriage returnを無視 |
INLCR | 受信した開業をcarriage returnに変換 |
IGNPAR | parity errorの文字を無視 |
INPCK | 受信した文字に対してparity checkを行う |
PARMRK | parity errorをmarkする |
ISTRIP | すべての入力文字の8bit目を落とす |
IXOFF | 入力に対するsoftware flow制御を有効にする |
IXON | 出力に対するsoftware flow制御を有効にする |
出力mode
- 出力modeは、出力文字をどのように処理するか、programから送信された文字をどのように処理してからserial portまたは画面に転送するかを制御
- 出力modeのflagの多くは、入力modeのflagに対応している。
- 出力modeを指定するには、termios構造体のmember c_oflagでflagを設定する
c_oflagで使用できるmacro | 説明 |
---|---|
OPOST | 出力処理を有効にする |
ONLCR | 出力される改行をcarriage returnとline feedのpairに変換する |
OCRNL | 出力されるcarriage returnを改行に変換する |
ONOCR | 0カラム目ではcarriage returnを出力しない |
ONLRET | 改行がcarriage returnも行う |
OFILL | 遅延に対して埋め込み文字を送信する |
OFDEL | 埋め込み文字としてNULLではなくDELを使う |
NLDLY | 改行遅延を選択 |
CRDLY | carriage return遅延を選択 |
TABDLY | tab遅延を選択 |
BSDLY | back space遅延を選択 |
VTDLY | 垂直tab遅延を選択 |
FFDLY | form feed 遅延を選択 |
制御mode
- 端末hardware特性を制御
- 制御modeを指定するには、termios構造体member c_cflagでflagを指定
c_cflagで指定できるmacro | 説明 |
---|---|
CLOCAL | modem stetus line を無視する |
CREAD | 文字の受信を可能にする |
CS5 | 送受信文字に5bitを使う |
CS6 | 送受信文字に6bitを使う |
CS7 | 送受信文字に7bitを使う |
CS8 | 送受信文字に8bitを使う |
CSTOPB | 1文字ごとに、1つではなく2つの stop bitを使う |
HUPCL | close時にmodemをhung upする |
PARENB | parityの生成と検出を有効にする |
PARODD | 偶数parityではなく、奇数parityを使う |
local mode
- local modeは、端末のさまざまな特性を制御する。
- local modeを指定するには、termios構造体member c_lflagでflagを設定する。
c_lflagで使用できるmacro | 説明 |
---|---|
ECHO | 入力文字のlocal echoを有効に |
ECHOE | ERASEの受信時に、BackSpace、Space、BackSpaceの組み合わせを実行する |
ECHOK | KILL文字で行の抹消を実行する |
ECHONL | 改行文字をechoする |
ICANON | canonical入力処理を有効にする |
IEXTEN | 実装に依存する特殊機能を有効にする |
ISIG | signalを有効にする |
NOFLSH | queueのflushを無効にする |
TOSTOP | 書き込みの試みに対してbackground processにsignalを送信する |
- これらのflagのうち、最も重要なのがECHOとICANON。
- ECHO flagを使うと、入力された文字がechoされないようにすることができる
- ICANON flagは、受信文字を処理する2つのmodeを切り替えるときに利用
- ICANON flagが設定されている場合、回線はcanonical modeになる
- flag が設定されていない場合、non canonical modeになる
特殊制御文字
- 特殊制御文字は、userが入力したときに特別な方法で処理される、Ctrl-Cなどの文字の集合
- termios 構造体の配列 c_ccには、特殊制御文字がsupportする各機能に割り当てられた文字が収められている
- 各文字の位置(配列の添え字)はmacroにより定義されているが、各文字が制御文字でなければならないわけではない
- 配列c_ccは、端末がcanonical modeに設定されているかどうかに応じて2つの異なる利用法がある
- 異なる2つのmodeでの配列の添え字は部分的に重複しているため、modeの値を混在させないようにする必要がある。
canonical modeでの配列の添え字 | 説明 |
---|---|
VEOF | EOF文字 |
VEOL | EOL文字 |
VERASE | ERASE文字 |
VINTR | INTR文字 |
VKILL | KILL文字 |
VQUIT | QUIT文字 |
VSUSP | SUSP文字 |
VSTART | START文字 |
VSTOP | STOP文字 |
この本からの覚書。
© 2006 矢木浩人