C言語(Linux環境)でキーボード入力をリアタイでやりたい!!!
タイトル通りです(学習が進むたびに随時追記)。
というわけで、
今日からスーパーハカー : [C]キーボードの入力を取得する - getch(),getchar() (livedoor.jp)
【C言語】kbhit・_kbhit関数について (hotnews8.net)
を見てみる。
kbhit関数!conio.h!!Windows!!!
無理ですね。
ということなので、
【C言語】Linuxでのkbhit関数(キーイベントの取得) (hotnews8.net)
を読んでみる。
termios, tcgetattr, STDIN_FILENO, c_lflag, ICANON, tcsetattr, etc...
ち、知識がなさすぎてわけわからん……。
ので、様々な文書を参考に脳みそを作っていこう。
疑問1:termiosって何さ?
参考文献:Linux のシリアル通信において termios 構造体で設定可能なパラメータをまとめる (C/C++) - siar (hatenablog.com)
termiosの姿が見えました。
システムコールを理解する | UNIX world (weblike.jp)
を読んだ。
疑問2:tcgetattrとは何ぞや
参考文献:if0604_60.pdf (cqpub.co.jp)、tcgetattr() - 端末の属性の取得 (ibm.com)
謎が謎を呼ぶ状態になってしまったのでここちょっと長いです。
私と同じく基礎知識0からダンジョン攻略する人間へ、1プロトン程度でも役立てば幸いです。(まあ、検索で引っかからなさそうな感じもしますな)
まず、参考文献1個目。
リスト 1 に示すように,押下した文字が表示されないように,処理の前後で端末属性を変え,非カノニカル・モードにするため,termios 構造体を tcgetattr,tcsetattr 関数で操作
まあ、端末属性って単語は一旦置いておいて、
なんにもわからん「非カノニカル・モード」をやっつけます。
Linuxで同期・カノニカルデータ受信 (fc2web.com)を見よ。
次に、参考文献2個目。
int tcgetattr(int fildes, struct termios *termptr);
なるほどね、わからん。
とりあえず、Operating Systems. Exercises. (u-aizu.ac.jp)によると、
fildesは「ファイルディスクリプタ」なるものだそうです。
→ファイルディスクリプタ(ファイル記述子)とは - IT用語辞典 e-Words (e-words.jp)
*termptr は参考文献2-2にも書かれていたように、メモリ位置を指すらしい。
5 アドレス演算子(&)と間接演算子(*) (nagoya-u.ac.jp)によると、
& は変数が割り当てられているメモリのアドレスを得る演算子
とのこと。
だから &oldt って書いてあったのか。
編集に使うURL先置き
tcsetattr() - 端末の属性の設定 (ibm.com)