トップ 一覧 ping 検索 ヘルプ RSS ログイン

C termios構造体の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!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文字



----
この本からの覚書。
{{amazon 4797327014}}