!!!C termios構造体 [Programming C] !!termios構造体 *端末interfaceを制御するには、termios型の構造体に値を設定し、関数呼び出しを使う。 *構造体と関数呼び出しは、termios.hで定義されている。 *termios.hで定義されている関数呼び出しを使うprogramでは、適切な関数libraryとlinkする必要がある。 *通常使用するのは、curses library。例えば、-lcursesや-lncursesのように指定する。 *端末を制御するときに操作する値は、次のような様々なmodeにgroup化できる。 **入力 **出力 **制御 **local **特殊制御文字 一般にtermios構造体は、次のように宣言されている #include 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 int tcgetattr(int fd, struct termios, *termios_p); *tcgetattr関数は、端末interface変数の現在の値をtermios_pで示される構造体に書き込む。 *端末interface変数の値を変更したあと、tcsetattr関数を呼び出すと、端末interfaceを設定しなおすことができる。 #include 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}}