著者:IronLavender
オリジナル:https://blog.csdn.net/wumenglu1018/article/details/53098794/
termios構造体は、POSIX仕様で定義されている標準インターフェースです。これは、System Vのtermioインターフェースに似ています。termiosタイプのデータ構造体に値を設定し、関数呼び出しの小さなセットを使用することで、ターミナルインターフェースを制御できます。
ターミナルに影響を与えるように調整できる値は、さまざまなモードに応じて次のグループに分けられます:
1.入力モード
2.出力モード
3.制御モード
4.ローカルモード
5.特別な制御モード
termios構造タイプには、いくつかのフラグセットと制御文字の配列が含まれています。すべてのUnixバージョンには、次の構造が含まれています。
struct termios
{{
tcflag_tc_iflag; //入力モードフラグ
tcflag_tc_oflag; //出力モードフラグ
tcflag_tc_cflag; //制御モードフラグ
tcflag_tc_lflag; //ローカルモードフラグ
cc_tc_cc [NCCS]; //制御文字
speed_tc_isspeed; //ボーレートを入力します
speed_tc_ospedd; //出力ボーレート
}
(1)c_iflag:端末入力モードを制御する入力モードフラグ。具体的なパラメータは次のとおりです。
キー値
説明する
IGNBRK
BREAKキー入力を無視する
BRKINT
IGNBRKが設定されている場合、BREAKキーの入力は無視され、BRKINTが設定されている場合、SIGINT割り込みが生成されます。
IGNPAR
パリティエラーを無視する
PARMRK
パリティエラーを特定する
INPCK
入力パリティを許可する
ISTRIP
文字の8番目のビットを削除します
inlcr
入力したNL(改行)をCR(キャリッジリターン)に変換します
IGNCR
入力されたキャリッジリターンを無視します
ICRNL
入力したキャリッジリターンを改行に変換します(IGNCRが設定されていない場合)
IUCLC
入力大文字を小文字に変換する(非POSIX)
IXON
入力が許可されている場合のXON / XOFFフローを制御します
IXANY
任意の文字を入力すると、停止した出力が再開されます
IXOFF
入力が許可されている場合のXON / XOFFフローを制御します
IMAXBEL
入力キューがいっぱいになると、呼び出し音が鳴り始めます。Linuxはこのパラメーターを使用しますが、パラメーターは常に設定されていると見なします。
(2)c_oflag:端末出力モードを制御する出力モードフラグ。具体的なパラメータは次のとおりです。
キー値
説明する
OPOST
処理後の出力
OLCUC
入力小文字を大文字に変換する(非POSIX)
ONLCR
入力NL(ラインフィード)をCR(キャリッジリターン)とNL(ラインフィード)に変換します
OCRNL
入力したCR(キャリッジリターン)をNL(ラインフィード)に変換します
ONOCR
キャリッジリターンは最初の行に出力されません
のみ
キャリッジリターンを出力しない
OFILL
端末出力を遅らせるためにパディング文字を送信する
または一部
塗りつぶし文字としてASCIIコードDELを使用します。このパラメーターが設定されていない場合、塗りつぶし文字はNUL( '\ 0')(非POSIX)になります。
NLDLY
改行出力遅延。NL0(遅延なし)またはNL1(遅延0.1秒)の場合があります。
CRDLY
キャリッジリターン遅延。値の範囲は、CR0、CR1、CR2、およびCR3です。
TABDLY
水平タブ出力遅延。値の範囲は、TAB0、TAB1、TAB2、およびTAB3です。
BSDLY
スペース出力遅延、BS0またはBS1にすることができます
VTDLY
垂直タブ出力遅延、VT0またはVT1にすることができます
FFDLY
ページフィードの遅延。FF0またはFF1にすることができます
(3)c_lflag:ローカルモードフラグ、制御端末編集機能、具体的なパラメータは以下のとおりです。
キー値
説明する
自体
INTR、QUIT、SUSP、またはDSUSPを入力すると、対応する信号が生成されます。
ICANON
標準入力モードを使用する
XCASE
ICANONとXCASEが同時に設定されている場合、端末は大文字のみを使用します。XCASEのみが設定されている場合、文字がエスケープ文字を使用しない限り、入力文字は小文字に変換されます(POSIXではなく、Linuxはこのパラメーターをサポートしていません)。
エコー
入力文字を表示する
エコー
ICANONが同時に設定されている場合、ERASEは入力された文字を削除し、WERASEは入力された単語を削除します
ECHOK
ICANONが同時に設定されている場合、KILLは現在の行を削除します
ECHONL
ICANONを同時に設定すると、ECHOが設定されていなくても、改行が表示されます。
ECHOPRT
ECHOとICANONを同時に設定すると、印刷された文字(POSIX以外)が削除されます
止まる
SIGTTOU信号をバックグラウンド出力に送信します
(4)c_cflag:端末ハードウェア制御情報を指定する制御モードフラグ。具体的なパラメータは次のとおりです。
キー値
説明する
CBAUD
ボーレート(4 + 1ビット)(非POSIX)
CBAUDEX
追加のボーレート(1ビット)(非POSIX)
CSIZE
文字長、値の範囲はCS5、CS6、CS7またはCS8です
CSTOPB
2つのストップビットを設定します
クレッド
受信機を使用する
PARENB
パリティを使用する
完了
入力にパリティを使用し、出力に偶数パリティを使用する
HUPCL
デバイスの電源を切るとハングする
CLOCAL
モデム回線のステータスを無視する
CRTSCTS
RTS / CTSフロー制御を使用する
(5)c_cc [NCCS]:制御文字。入力ターミネータなどの特殊文字を端末ドライバに保存するために使用されます。
IEXITENがローカルモードフラグc_lflagに設定されている場合にのみ、POSIXで定義されていない制御文字をLinuxで使用できます。各制御文字は、制御文字に対応しない2つの制御文字VMINとVTIMEを除いて、キーの組み合わせ(^ C、^ Hなど)に対応します。これらの2つの制御文字は、元のモードでのみ有効です。
大きい
説明する
c_cc [冬]
デフォルトの対応する制御文字は^ Cです。これは、入力キューと出力キューのデータをクリアし、ttyデバイスのフォアグラウンドプロセスグループ内の各プログラムにSIGINTシグナルを送信するために使用されます。SIGINTのハンドラーを定義しないプロセス信号はすぐに終了します。
c_cc [VQUIT]
デフォルトの対応する制御シンボルは^ /です。これは、入力キューと出力キューのデータをクリアし、ttyデバイスのフォアグラウンドプロセスグループ内の各プログラムにSIGQUIT信号を送信するために使用されます。SIGQUITのハンドラーを定義しないプロセス信号はすぐに終了します。
c_cc [参照]
デフォルトの対応する制御文字は^ Hまたは^?で、標準モードで行の前の文字を削除するために使用されますが、この文字は元のモードでは効果がありません。
c_cc [VKILL]
デフォルトの対応する制御文字は^ Uです。標準モードでは、文字の行全体が削除されます。この文字は、元のモードでは効果がありません。
c_cc [VEOF]
デフォルトの対応する制御文字は^ Dです。標準モードでは、read()を使用して0を返し、ファイルの終わりを示します。
c_cc [エントリ]
デフォルトの対応する制御文字は^ Sです。この機能は、ttyデバイスを使用して、VSTART制御文字が受信されるまで出力を一時停止します。または、デバイスにIXANYがある場合は、文字を受信した後に出力を開始します。
c_cc [VSTART]
デフォルトの対応する制御文字は^ Qで、中断されたttyデバイスの出力を再開するために使用されます。
c_cc [VSUSP]
デフォルトの対応する制御文字は^ Zであるため、現在のフォアグラウンドプロセスはSIGTSTP信号を受信します。
c_cc [VEOL]およびc_cc [VEOL2]
標準モードでは、これら2つの添え字は、行末に改行文字( '/ n')を追加して行末をマークします。これにより、バッファー内のデータが送信され、新しい行が開始されます。VEOL2はPOSIXでは定義されていません。
c_cc [VREPRINT]
デフォルトの対応する制御文字は^ Rです。標準モードでは、ローカルモードフラグECHOが設定されている場合、VERPRINTに対応する制御文字と改行がローカルに表示するために使用され、現在のバッファ内の文字が再印刷されます。VERPRINTはPOSIXで定義されていません。
c_cc [VWERASE]
デフォルトの対応する制御文字は^ Wです。標準モードでは、バッファーの最後にあるすべてのスペース文字を削除してから、隣接する非スペース文字を削除します。これにより、行の前の単語が削除されます。VWERASEはPOSIXで定義されていません。
c_cc [VLNEXT]
デフォルトの対応する制御文字は^ Vです。これにより、次の文字がそのままバッファーに入ることができます。^ V文字をバッファに入れる場合は、^ Vを2回押す必要があります。VLNEXTはPOSIXで定義されていません。
構造関連機能
(1)tcgetattr()
l原型:int tcgetattr(int fd、structtermois&termios_p);
l関数:ターミナルメディア(fd)の初期値を取得し、その値をtemios_pに割り当てます。関数はバックグラウンドプロセスから呼び出すことができますが、ターミナル属性は後のフォアグラウンドプロセスによって変更される場合があります。
(2)tcsetattr()
l原型:inttcsetattr(int fd、int action、const struct termios * termios_p);
l機能:端末に関連するパラメーターを設定し(基礎となるサポートが必要であるが満たすことができない場合を除く)、termios_pによって参照されるtermios構造を使用します。
options_actions (tcsetattr関数の2番目のパラメーター)は、変更がいつ有効になるかを指定します 。TCSANOW:変更はすぐに発生します
TCSADRAIN:変更はfdに書き込まれたすべての出力が送信された後に有効になります。この関数は、出力に影響を与えるパラメーターを変更するときに使用する必要があります。(現在の出力が完了したら値を変更します)
TCSAFLUSH:変更は、fdによって参照されるオブジェクトのすべての出力が送信された後に有効になり、受け入れられたが未読の入力はすべて変更前に破棄されます(TCSADRAINと同じですが、破棄)すべての現在の値)。
(3)
端末が非同期シリアルデータ送信を使用する場合、tcsendbreak()は一定期間連続0値ビットストリームを送信します。継続時間が0の場合、送信は0.25秒以上で、0.5秒を超えることはありません。期間がゼロ以外の場合、送信される時間の長さは実装によって定義されます。
端末が非同期シリアルデータ送信を使用していない場合、tcsendbreak()は何もしません。
(4)tcdrain()は
、fdによって参照されるすべてのオブジェクトの出力が送信されるまで待機します。
(5)tcflush()
は、queue_selectorの値に応じて、参照されるオブジェクトに書き込まれるがまだ送信されていないデータ、または受信されたが読み取られていないデータを破棄します。
TCIFLUSH:受信データを更新するが読み取らない
TCOFLUSH:書き込みデータを更新するが送信しない
TCIOFLUSH:受信データを更新するが同時に読み取らない、書き込みデータを更新するが送信しない
(6)tcflow()
は、アクションの値に応じて、fdによって参照されるオブジェクトでのデータ送信または受信を一時停止します。
TCOOFF:出力サスペンド
TCOONを:再起動懸濁出力
TCIOFFを:システムにデータを送信した端末装置を停止するストップキャラクタを送信
TCION:システムへの端末装置の送信データを作成する開始文字送信
デフォルトの設定をするとき、開口A端末デバイス入力と出力は中断されません。
(7)ボーレート関数
は、termios構造の入力および出力ボーレートの値を取得および設定するために使用されます。tcsetattr()関数が正常に呼び出されるまで、新しい値はすぐには有効になりません。
速度をB0に設定して、モデムを「ハングアップ」させます。B38400に対応する実際のビットレートは、setserial(8)で調整できます。入力および出力ボーレートは、termios構造に格納されます。
次のようにcfmakerawは、端末の属性を設定します。
termios_p->のc_iflag&=〜(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
termios_p-> c_oflag&=〜OPOST;
termios_p-> c_lflag&=〜( ECHO | ECHONL | ICANON | ISIG | IEXTEN);
termios_p-> c_cflag&=〜(CSIZE | PARENB);
termios_p-> c_cflag | = CS8;
l cfgetospeed()は、termios_pが指すtermios構造体に格納されている出力ボーレートを返します。
l cfsetospeed()は、termios_pが指すtermios構造体に格納されている出力ボーレートをspeedに設定します。値は次の定数のいずれかである必要があります
。B0B50B75B110 B134 B150 B200 B300 B600 B1200 B1800 B2400 B4800 B9600 B19200 B38400 B57600 B115200 B230400これらの
中で:ゼロ値B0は接続を中断するために使用されます。B0が指定されている場合、接続があると見なされなくなります。通常、これにより接続が切断されます。CBAUDEXは、POSIX.1で定義されている速度(57600以降)よりも速い速度を示すマスクです。したがって、B57600&CBAUDEXはゼロ以外です。
l cfgetispeed()は、termios構造に格納されている入力ボーレートを返します。
l cfsetispeed()は、termios構造に格納されている入力ボーレートをspeedに設定します。入力ボーレートが0に設定されている場合、実際の入力ボーレートは出力ボーレートと等しくなります。
RETURNVALUE戻り値
cfgetispeed()は、termios構造に格納されている入力ボーレートを返します。
cfgetospeed()は、termios構造に格納されている出力ボーレートを返します。
他の関数は0(成功)または-1(失敗)を返し、errnoはエラーを示すように設定されます。
注:必要な変更を行うことができる場合、tcsetattr()は成功を返します。したがって、複数の変更が行われた場合は、この関数の後にtcgetattr()を再度呼び出して、すべての変更が正常に実装されているかどうかを確認する必要があります。
例:
1.ターミナルエコーをオフにします。キーボードで入力した文字はターミナルウィンドウに表示されません。
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>
int main(void)
{{
struct termios ts、ots;
char passbuf [1024];
tcgetattr(STDIN_FILENO、&ts); // STDIN_FILENOの値は1で、標準入力のファイル記述子を表します。
ots = ts;
ts.c_lflag&= 〜ECHO; / *ターミナルエコー機能をオフにします* /
ts.c_lflag | = ECHONL;
tcsetattr(STDIN_FILENO、TCSAFLUSH、&ts); / *新しい端末設定を適用します* /
fgets(passbuf、1024、stdin); / *入力文字は端末に表示されません* /
printf( "入力文字=%s / n"、passbuf);
tcsetattr(STDIN_FILENO、TCSANOW、&ots); / *古い端末デバイスを復元します* /
}
2.すべての文字を読む
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <termios.h>
char * menu [] = {
「a-新しいレコードを追加する」、
「d-レコードの削除」、
「q-やめる」、
ヌル、
};
int getchoice(char * greet、char * choices []、FILE * in、FILE * out);
int main()
{{
int choice = 0;
ファイル*入力;
FILE *出力;
struct termios initial_settings、new_settings;
if(!isatty(fileno(stdout))){
fprintf(stderr、 "あなたは端末ではありません、OK。\ n");
}
input = fopen( "/ dev / tty"、 "r");
output = fopen( "/ dev / tty"、 "w");
if(!input ||!output){
fprintf(stderr、 "/ dev / ttyを開くことができません\ n");
exit(1);
}
tcgetattr(fileno(input)、&initial_settings);
new_settings = initial_settings;
new_settings.c_lflag&= 〜ICANON;
new_settings.c_lflag&= 〜ECHO;
new_settings.c_cc [VMIN] = 1;
new_settings.c_cc [VTIME] = 0;
new_settings.c_lflag&= 〜ISIG;
if(tcsetattr(fileno(input)、TCSANOW、&new_settings)!= 0){
fprintf(stderr、 "属性を設定できませんでした\ n");
}
行う {
choice = getchoice( "アクションを選択してください"、menu、input、output);
printf( "選択しました:%c \ n"、choice);
} while(choice!= 'q');
tcsetattr(fileno(input)、TCSANOW、&initial_settings);
exit(0);
}
int getchoice(char * greet、char * choices []、FILE * in、FILE * out)
{{
選択されたint = 0;
選択されたint;
char **オプション;
行う {
fprintf(out、 "Choice:%s \ n"、greet);
オプション=選択肢;
while(* option){
fprintf(out、 "%s \ n"、* option);
option ++;
}
行う {
選択済み= fgetc(in);
} while(selected == '\ n' || selected == '\ r');
オプション=選択肢;
while(* option){
if(selected == * option [0]){
選択= 1;
ブレーク;
}
option ++;
}
if(!chosen){
fprintf(out、 "間違った選択、もう一度選択\ n");
}
} while(!chosen);
選択したものを返します。
}