| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

C termios構造体

提供: MyMemoWiki
ナビゲーションに移動 検索に移動

C termios構造体

Programming C |

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文字



この本からの覚書。