端末 I/O の仕組みを理解しようとしています。
端末が次のように非正規モードに設定されている場合 (エラー処理がありません):
struct termios term_original, term_current;
tcgetattr(STDIN_FILENO, &term_original);
term_current = term_original;
term_current.c_lflag &= ~(ICANON | ISIG | IEXTEN | ECHO);
term_current.c_iflag &= ~(BRKINT | ICRNL | IGNBRK | IGNCR | INLCR | INPCK | ISTRIP | IXON | PARMRK);
term_current.c_oflag &= ~(OPOST);
term_current.c_cc[VMIN] = 1;
term_current.c_cc[VTIME] = 0;
tcsetattr(STDIN_FILENO, TCSADRAIN, &term_current);
単純な読み取りループは、ボタンを押すたびに生成されたデータを次のように読み取ることができます。
char c;
while (read(0, &c, 1) != -1) { PRINT_CHAR(c); }
今、
- キーボードで Esc を押すと、0x1b が生成されます。
- F1 を押すと、0x1b 0x4f 0x50 が生成されます。
- F5 を押すと、0x1b 0x5b 0x31 0x35 0x7e が生成されます。
この入力を読み取って処理するという点では、あるボタンを押したときの出力がどこで終わり、次のボタンが始まるかをどのように判断するのでしょうか? 私は識別可能なパターンを見つけることができませんでした.Escが単一バイトを生成するという事実は、ほとんどのマルチバイト生成ボタン押下の出力の最初のバイトと同じであることを示唆しているようです. ボタンの境界がどこにあるかを判断するための他のメカニズムはありますか?