C言語関係掲示板

過去ログ

No.602. if(キーボードの入力があれば) break;

[戻る] [ホームページ]
No.5763

キーボード割り込み
投稿者---Gen(2003/04/12 12:47:51)


はじめまして、Genといいます。
今、solaris 8 でGCC を用いてc言語のプログラムを組んでいます。
そこで、ご質問がひとつあります。

while(1){
.
.
.
if(キーボードの入力があれば) break;
}

のようなプログラムを組みたいのですが、
どのように、キーボード割り込みを行えばよいのでしょうか?
feof(stdin)を用いると、キーボード入力がなければ終了と
いうのは作れるのですが、それの否定では、うまくいきませんでした。
ご教授お願いいたします。


No.5765

Re:キーボード割り込み
投稿者---かずま(2003/04/13 03:01:27)


> if(キーボードの入力があれば) break;

Solaris では試していませんが、次のプログラムはどうでしょうか。
#include <termios.h>
#include <unistd.h>

int main(void)
{
    int n;  char c;  struct termios t1, t2;

    tcgetattr(0, &t1);
    t2 = t1;
    t1.c_lflag &= ~(ICANON | ECHO);
    t1.c_cc[VMIN] = t1.c_cc[VTIME] = 0;
    tcsetattr(0, TCSANOW, &t1);

    while (1) {
        //...
        n = read(0, &c, 1);
        if (n == 1) break;
        //...
    }
    tcsetattr(0, TCSANOW, &t2);
    return 0;
}

> feof(stdin)を用いると、キーボード入力がなければ終了と
> いうのは作れるのですが、それの否定では、うまくいきませんでした。

これはどうものですか。作ったものを見せてください。

No.5767

Re:キーボード割り込み
投稿者---かずま(2003/04/13 11:58:48)


> これはどうものですか。作ったものを見せてください。

 これはどういうものですか。作ったものを見せてください。

と書いたつもりだったのですが。

プログラムが実行を開始したとき、普通、キーボード入力がない状態から
始まるはずですから、「キーボード入力がなければ終了」というのは
すぐに終了するということではないのですか。feof(stdin) を用いると
作れたというのが理解できません。

No.5782

Re:キーボード割り込み
投稿者---Gen(2003/04/14 10:52:50)


かずまさん。返信ありがとうございます。

>プログラムが実行を開始したとき、普通、キーボード入力がない状態から
>始まるはずですから、「キーボード入力がなければ終了」というのは
>すぐに終了するということではないのですか。
おっしゃるとおりです。すぐに終了するので、ただ単純にfeof(!stdin)
とすればうまくいくかと思ったのですが、うまくいきませんでした。
以下のようにすることで、一応は出来たのですが、

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int mykbhit(){
fd_set rfds;
struct timeval tv;
int retval;

FD_ZERO(&rfds);
FD_SET(0, &rfds);

tv.tv_sec = 0;
tv.tv_usec = 0;

retval = select(1, &rfds, NULL, NULL, &tv);

if(retval){
return 1;
}else{
return 0;
}
}

リターンキーを入力しなければ、
キー入力と認めてくれないみたいで、リターンキーを押さなくても、
キー入力と認めさすには、どうすればよいのでしょうか?