Chinaunix首页 | 论坛 | 博客
  • 博客访问: 477984
  • 博文数量: 115
  • 博客积分: 5016
  • 博客等级: 大校
  • 技术积分: 1401
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-21 16:03
文章分类

全部博文(115)

文章存档

2013年(1)

2010年(17)

2009年(76)

2008年(21)

我的朋友

分类: LINUX

2008-10-21 19:48:46

(本文转自dakai.cublog.cn
我们知道,在windows下有个键盘测试函数,int kbhit(void)。使用该函数需要包含头文件conio.h。执行时,kbhit测试是否有键盘按键按下,若有则返回非零值,否则返回零。
    在Unix/Linux下,并没有提供这个函数。在linux下开发控制台程序时,有时会遇到检测键盘是否有被按下的情况,这时就需要自己编写kbhit()实现的程序了。下面是kbhit在Unix/Linux下的一个实现。用到了一种终端操作库termios。
    下面是头文件kbhit.h:
    #ifndef KBHITh
    #define KBHITh

    void   init_keyboard(void);
    void   close_keyboard(void);
    int      kbhit(void);
    int     readch(void);

    #endif
    下面式源程序kbhit.c:
    #include "kbhit.h"
    #include
    #include    // for read()

    static struct termios initial_settings, new_settings;
    static int peek_character = -1;

    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()
    {
    unsigned 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;
    }

阅读(3247) | 评论(0) | 转发(0) |
0

上一篇:GNU make 指南

下一篇:kgdb的安装与调试探索

给主人留下些什么吧!~~