[Programming C]
- 端末interfaceを制御するには、termios型の構造体に値を設定し、関数呼び出しを使う。
- 構造体と関数呼び出しは、termios.hで定義されている。
- termios.hで定義されている関数呼び出しを使うprogramでは、適切な関数libraryとlinkする必要がある。
- 通常使用するのは、curses library。例えば、-lcursesや-lncursesのように指定する。
- 端末を制御するときに操作する値は、次のような様々なmodeにgroup化できる。
一般に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は、入力(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は、出力文字をどのように処理するか、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 遅延を選択 |
- 端末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を指定するには、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文字 |
この本からの覚書。
YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto
Copyright© 矢木 浩人 All Rights Reserved.