- ベストアンサー
Linuxプログラミングでキーボードの値を取得する方法
- Linuxのgccでのプログラミングで、キーボードのどのキーが押されたのかを変数に代入したり取得したりする方法はありますか?
- 永久ループを使いながら、キーボードの入力を監視し、押されたキーに応じて特定の処理を行うプログラムを作ることは可能ですか?
- ご教授いただけると幸いです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
できますが、かなり面倒です。 termiosやncursesなんかを調べて見るといいかも。
その他の回答 (5)
- notnot
- ベストアンサー率47% (4900/10358)
簡単にはこんな感じで。 #include <stdio.h> main(){ int c; system("stty -icanon -echo"); while(1){ c = getchar(); if(c < ' ') break; /* 制御文字がキーインされたら終了 */ printf("%c key is pushed\r\n",c); } system("stty icanon echo"); }
お礼
回答頂きありがとうございます。 実際にこの方法をやってみました。これだとエンターキーを入れる必要がないのが確かに便利なことがわかりました。ただ、何もキーが入力されないとgetchar()でペンディング状態になるのと、IO入力のようなON/OFFの使い方はできないということも実感したのですが、ちょっとしたトグル入力などはなかなか使えるような気がしました。 いまこのような感じでコードを使わせてもらってます。 http://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/1971/trunk/20140411/test_getchar.c
基本的には割り込みプロセスなので http://sourceforge.jp/projects/linux-kernel-docs/wiki/2.3%E3%80%80ハードウェア割り込み処理 此れを改造すれば実現可能と考えます。 割り込みが発生した時にフラグを立てメインプロセスからサブプロセスにジャンプしています。 尚その際には16進データをASCIIに変換するテーブルを参照して表示しました。
お礼
回答頂きありがとうございます。 いつかはハードウェア割り込み処理とか、カーネルとかハード制御に関わるプログラミングとかカーネルビルドも見ていきたいと思っています。いろいろと険しそうな感じはしていますががんばりたいと思います。
- wormhole
- ベストアンサー率28% (1626/5665)
>このgetchar()関数ですが、何か文字を入力してからエンターキーが押されないと、cの変数に値が代入されないようですが、例えば1文字入れたら、自動的にエンターキーを入力するようにすることはできないでしょうか? 自動でエンターキーを入力するような事はできません(私が知らないだけという可能性はあります)。 また、#3の方もおっしゃっていますがgetchar()は標準入力からの入力なので、その入力がキーボードとは限りません。 >また、数秒たったら、自動的にcに値を代入して、次のステップに自動的に進むようにするようなことはできないのでしょうか? どういう事をやりたいのかよくわかりません。 「自動的に」とはどういう事ですか? コードを書かなくてもプログラム側で勝手に判断してやって欲しいという事ですか? >このような関数が使えれば、エンターキーを押さなくても定期的なキーの値の取得ができると言うことなのでしょうか? 引用されてたヶ所は、何らかのキーが入力されていなくてもgetch()を呼び出してから100ミリ秒後にはタイムアウトして値を返すための設定ですけど(getch()はncursesが提供している関数)。 もしそれをncursesを使わずに行いたいということであれば先にもあげたtermiosを調べてみてください。 >これはどのようなエラーなのか教えて頂けませんでしょうか? メッセージに書かれていますけど? 英文読む気がない。 辞書を引きたくない。 英文読んでもわからないと諦めてる。 読んでみたが何の事かわからない。 その他。 どれでしょう? もし最初の3つのどれかなら英文読む努力くらいはしてください。 curses.h と書く所を curses .h と書いてしまってるのが原因ではあるんでしょうが。
お礼
回答頂きありがとうございます。まだcursesやってないのですが、とりあえずという感じで擬似的なIO入力で逃げるようなことやってみました。
- Tacosan
- ベストアンサー率23% (3656/15482)
標準入力はリダイレクトされている可能性があるから使えないんですよ>#1.
お礼
回答頂きありがとうございます。リダイレクトという言葉がアルのですね。普通の使い方ではないですね。
- maiko0318
- ベストアンサー率21% (1483/6969)
http://web-ext.u-aizu.ac.jp/~jpshin/global/sccp_sods/exercise/ex03.htm #include<stdio.h> main(){ int c; /* キーボードから受け取った文字を入れておく変数 */ c = getchar(); /* キーボードから1文字だけ受け取る */ printf("c = %c \n", c); /* [%c]を使って文字を表示 */ printf("c = %d \n", c); /* [%d]を使って、文字を数値として表示できる */ } こういうのが載っていました。
お礼
回答頂きありがとうございます。 このgetchar()関数ですが、何か文字を入力してからエンターキーが押されないと、cの変数に値が代入されないようですが、例えば1文字入れたら、自動的にエンターキーを入力するようにすることはできないでしょうか? また、数秒たったら、自動的にcに値を代入して、次のステップに自動的に進むようにするようなことはできないのでしょうか? すみませんが、どうぞよろしくお願い致します。
お礼
回答頂きありがとうございます。 #1の方に教えて頂いたプログラムをやってみたのですが、 このgetchar()関数ですが、何か文字を入力してからエンターキーが押されないと、cの変数に値が代入されないようですが、例えば1文字入れたら、自動的にエンターキーを入力するようにすることはできないでしょうか? また、数秒たったら、自動的にcに値を代入して、次のステップに自動的に進むようにするようなことはできないのでしょうか? 今回教えて頂いたncursesというのでがありますが、 http://taichino.com/programming/1925 こちらのサイトに載っている // キー入力する場合は以下 keypad(stdscr, true); wtimeout(stdscr, 100); // 100ミリ秒でgetchがタイムアウト このような関数が使えれば、エンターキーを押さなくても定期的なキーの値の取得ができると言うことなのでしょうか? すみませんが、どうぞよろしくお願い致します。
補足
お世話になっております。 現在、Ubuntu Linuxのgccを使っており、curuses.hを試しているのですが、次のようなエラーが出てきます。 root@ubuntu:~/20140411# gcc -o test_getchar test_getchar.c test_getchar.c:3:21: fatal error: curses .h: No such file or directory #include <curses .h> ^ compilation terminated. これはどのようなエラーなのか教えて頂けませんでしょうか? curses.hというのが使えないと言うことでしょうか? どうぞ、ご教示頂きますようお願い致します。