Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19832770
  • 博文数量: 679
  • 博客积分: 10495
  • 博客等级: 上将
  • 技术积分: 9308
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-18 10:51
文章分类

全部博文(679)

文章存档

2012年(5)

2011年(38)

2010年(86)

2009年(145)

2008年(170)

2007年(165)

2006年(89)

分类: LINUX

2008-12-11 11:08:20

§5.6  检测击键动作

       DOS中的kbhit在没有实际读取的时候检测是否又按键。Unix中设计认为程序很少等待事件。如果需要移植dos程序,可以non-canonical input mode下实现。本节不做重点。

 

# cat kbhit.c

#include

#include

#include

#include

#include

#include

 

static struct termios initial_settings, new_settings;

static int peek_character = -1;

 

void init_keyboard();

void close_keyboard();

int kbhit();

int readch();

 

int main()

{

    int ch = 0;

 

    init_keyboard();

    while(ch != 'q') {

        printf("looping\n");

        sleep(1);

        if(kbhit()) {

            ch = readch();

            printf("you hit %c\n",ch);

        }

    }

    close_keyboard();

    exit(0);

}

 

void init_keyboard()

{

    tcgetattr(0,&initial_settings);

    new_settings = initial_settings;

    new_settings.c_lflag &= ~ICANON;

    new_settings.c_lflag &= ~ECHO;

    new_settings.c_lflag &= ~ISIG;

    new_settings.c_cc[VMIN] = 1;

    new_settings.c_cc[VTIME] = 0;

    tcsetattr(0, TCSANOW, &new_settings);

}

 

void close_keyboard()

{

    tcsetattr(0, TCSANOW, &initial_settings);

}

 

int kbhit()

{

    char ch;

    int nread;

 

    if(peek_character != -1)

        return 1;

    new_settings.c_cc[VMIN]=0;

    tcsetattr(0, TCSANOW, &new_settings);

    nread = read(0,&ch,1);

    new_settings.c_cc[VMIN]=1;

    tcsetattr(0, TCSANOW, &new_settings);

 

    if(nread == 1) {

        peek_character = ch;

        return 1;

    }

    return 0;

}

 

int readch()

{

    char ch;

 

    if(peek_character != -1) {

        ch = peek_character;

        peek_character = -1;

        return ch;

    }

    read(0,&ch,1);

    return ch;

}

 

运行结果:

$ ./kbhit

looping

looping

looping

you hit h

looping

looping

looping

you hit d

looping

you hit q

 

阅读(4829) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~