A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
入力待ちなしでキーを読むにはO_NONBLOCKフラッグを
セットすればOKです。これにより、read()関数やscanf()
関数を呼び出しても、キー入力があるまでそこで
止まる(ブロックされる)ことが無くなります。
あるファイルにO_NONBLOCKをセットするには、
terra5さんが言うように、
open("/dev/tty", O_RDONLY|O_NONBLOCK);
でそのファイルをオープンします。
標準入力のように、既に開いてしまっているファイルに
対しては、
fcntl(0, F_SETFL, O_NONBLOCK);
です。
読み込みもterra5さんの通りです。
ただ、これだとリターンキーが押されるまで
入力なしとみなされます。
リターンキーを押さなくても1文字ずつ入力を
受けたい場合、もう一工夫要ります。
標準入力のターミナル属性を操作することでnon-canonical
モードにして、ターミナルのバッファリングを停止します。
詳しくは、tcgetattr(), tcsetattr(), termiosなどの
manページを見てください。
ただ、nabezo-さんの仰るようにスレッドにして、
そのスレッドを入力待ちの間ブロックしたほうが、
入力待ち以外の仕事が少ない場合は、
CPU負荷が減って良いことがあります。
(逆にそうしないとビジーウェイト状態になって、CPU
負荷が異様に上がります)
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <signal.h>
#include <errno.h>
static void post_proc(int);
static struct termios SavedTermAttr;
int
main(int argc, char **argv)
{
char c;
signal(SIGINT, &post_proc);
struct termios term_attr;
/* Terminal control */
/* ファイルディスクリプタ0(標準入力)
のターミナル属性を取得 */
if( tcgetattr(0, &term_attr) < 0 ){
fprintf(stderr, "Can't get terminal attributes.\n");
post_proc(-1);
}
/* 取得したターミナル属性を保存 */
SavedTermAttr = term_attr;
/* ICANON、ECHOフラッグをセット */
term_attr.c_lflag &= ~(ICANON|ECHO);
/* 入力文字列の最小読出バイト数を1に */
term_attr.c_cc[VMIN] = 1;
/* 入力待ち時間を0に */
term_attr.c_cc[VTIME] = 0;
/* 変更したターミナル属性をセット */
if( tcsetattr(0, TCSANOW, &term_attr) < 0 ){
fprintf(stderr, "Can't change terminal attributes.\n");
post_proc(-1);
}
/* NONBLOCKフラグのセット */
if( fcntl(0, F_SETFL, O_NONBLOCK) == -1 ){
fprintf(stderr, "Can't fcntl().\n");
post_proc(-1);
}
/* Main loop */
while(1){
while( read(0, &c, 1) != 1 )
if( errno != EAGAIN ){
fprintf(stderr, "EOF\n");
post_proc(0);
}
printf("%c\n", c);
}
}
void
post_proc(int sig)
{
/* 保存されたターミナル属性を復元 */
if( tcsetattr(0, TCSANOW, &SavedTermAttr) < 0 ){
fprintf(stderr, "Can't change terminal attribute.\n");
exit(-1);
}
if( sig < 0 )
exit(-1);
else
exit(0);
}
No.2
- 回答日時:
#「素人」からのコメントですが、ご了承ください。
#(cursesライブラリを使ったことがあります)
cursesライブラリに、getch()という関数があります。
キーボードからの入力待ちなどに使います。
「while文で計測させて、何かキーを押すと抜けだすような制御」
とあるので、スレッドを作成して、そのスレッドで計測させては
駄目ですか?
getch()が戻ってきて、入力されたキーをチェックして、
計測を終了させるためのキーだと判断したら、while()を
終了させてあげる条件(フラグなど)をセットするとか、、、
#「入力待ちなしでキーを読む」というのがちょっと理解できなかったので
#期待されている回答ではないかもしれませんね。
No.1
- 回答日時:
非同期モードにしてi/oすれば可能だろうと思います。
例えば,
int f=open("/dev/tty", O_RDONLY|O_NONBLOCK);
char c;
if ( read(f,&c,1) == 1 ) {
/* キー入力があった */
} else }
/* キー入力がなかったか、エラー */
}
みたいなので・・・。
コンパイルもしていないので、あとはマニュアルで(^^;
dos.hはMS-DOS用のですね。
あとは、cursesにそういう関数かマクロがあったような記憶が。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- 工学 1つのタクトスイッチで複数の並列回路を閉じ、アースにつなげることができるスイッチはありますか。 2 2022/08/06 10:38
- C言語・C++・C# C言語 3 2022/10/04 15:07
- システム CPUの問題について 2 2022/07/09 12:04
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
- 仕事術・業務効率化 効率的な勉強方法(分野問わず)を教えてください 1 2023/08/16 01:33
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- その他(プログラミング・Web制作) プログラムの起動、利用について、使用期間を設定する方法 3 2023/08/06 21:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
このQ&Aを見た人はこんなQ&Aも見ています
-
好きなおでんの具材ドラフト会議しましょう
肌寒くなってきて、温かい食べ物がおいしい季節になってきましたね。 みなさんはおでんの具材でひとつ選ぶなら何にしますか? 1番好きなおでんの具材を教えてください。
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
遅刻の「言い訳」選手権
よく遅刻してしまうんです…… 「電車が遅延してしまい遅れました」 「歯医者さんが長引いて、、、」 「病院が混んでいて」 などなどみなさんがこれまで使ってきた遅刻の言い訳がたくさんあるのではないでしょうか?
-
いけず言葉しりとり
はんなりと心にダメージを与える「いけず言葉」でしりとりをしましょう。 「あ」あら〜しゃれた服着てはりますな 遠くからでもわかりましたわ
-
【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
【お題】 ・このサンタクロースは偽物だと気付いた理由とは?
-
waitせずにキー入力があった場合のみ処理をさせたい(C言語)
C言語・C++・C#
-
C言語 1文字入力(Enterキーなし)
C言語・C++・C#
-
linux上でgetchを使いたい
C言語・C++・C#
-
-
4
ループを途中で抜けたいのですが。
C言語・C++・C#
-
5
Linuxプログラミングで、キーボードの値がほしい
C言語・C++・C#
-
6
入力を待たずにstdinの監視をしたい(C言語)
C言語・C++・C#
-
7
#include <Windows.h>というヘッダファイルについて
C言語・C++・C#
-
8
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
9
C言語で、文字とか入力されなくても実行を続けたい
C言語・C++・C#
-
10
INIファイルからのデータ読込みについて
C言語・C++・C#
-
11
矢印キーを押下してコンソール上で文字を移動させたい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
C言語について質問です。 0以下...
-
*をユーザーが入力した数字の数...
-
Excel VBAで、Application.Inpu...
-
scanfが2回使えない・・・?;
-
数字以外が入力されたらエラー...
-
VB.NETで16進数+16進数や16進...
-
cout関数を使っているのですが...
-
getchar()について 教えてくだ...
-
batプログラム上で文字列を入力...
-
コンソールアプリの入力時に改...
-
コンボボックスで日本語入力を...
-
C++のcinの動作
-
C言語scanf_sで何故か2回入力に...
-
プログラムの進行が一時ストッ...
-
C言語初心者です。ファイルの読...
-
プログラミングC言語について
-
漢字のソートについて
-
C言語 逆ピラミッドの作り方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
java初心者です。入力されたの...
-
Excel VBAで、Application.Inpu...
-
ワードで文字を入力する時の変...
-
WindowsでEOF
-
batプログラム上で文字列を入力...
-
getchar()について 教えてくだ...
-
cout関数を使っているのですが...
-
コマンドプロンプトからのEOFの...
-
"scanf"でエンターで改行させな...
-
VisualStudio2019のコードアナ...
-
C言語scanf_sで何故か2回入力に...
-
至急教えてください!プログラ...
-
scanf が無視されます
-
EDITコントロールで入力できる...
おすすめ情報