linux下的键盘检测

话说,仅仅是一个键盘检测就好麻烦。我还是懂的太少了。。。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <string.h>

#define key_ESC 27

void init_keyboard();

void close_keyboard();

int kbhit();

int readch(); /* 相关函数声明 */

static struct termios initial_settings, new_settings;

static int peek_character = -1;         /* 用于测试一个按键是否被按下 */

/* 检测键盘按键的函数 */

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);
}

/* 用来接收按下的按键,并peek_character = -1恢复状态 */

int readch()

{
    char ch;

    if ( peek_character != -1 )
    {
        ch = peek_character;

        peek_character = -1;

        return(ch);
    }

    read( 0, &ch, 1 );

    return(ch);
}

/* 配置终端函数 */

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 main(int argc, char const *argv[])
{
    int ch = 0;

    init_keyboard();

    printf( "You can put ESC to quit!\n" );
    while ( ch != 27 )
    {

        if ( kbhit() )
        {
            ch = readch();

            if ( ch != 27 )

                printf( "You put %c ! Only put ESC can quit! \n", ch );
        }
    }

    close_keyboard();

    return 0;
}

参考:

  1. http://blog.163.com/liang_w_yan/blog/static/210657088201332444016981/
时间: 2024-10-03 21:53:38

linux下的键盘检测的相关文章

【调试】Linux下超强内存检测工具Valgrind

[调试]Linux下超强内存检测工具Valgrind 内容简介 Valgrind是什么? Valgrind的使用 Valgrind详细教程 1. Valgrind是什么? Valgrind是一套Linux下,开放源代码(GPLV2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成. 内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具:而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务.

Linux下使用iotop检测磁盘io使用情况

介绍 Linux下的IO统计工具如iostat, nmon等大多数是只能统计到per设备的读写情况, 如果你想知道每个进程是如何使用IO的就比较麻烦. iotop 是一个用来监视磁盘 I/O 使用状况的 top 类工具.iotop 具有与 top 相似的 UI,其中包括 PID.用户.I/O.进程等相关信息. 实例 直接运行就好 iotop

linux下u盘检测程序

       获得U盘的插入或者拔取得信息的传统方法是在内核级运行hotplug程序,相关参数通过环境变量传递过来,再由hotplug通知其他关注hotplug的应用程序,但是效率比较低.      网上查找知道:    用户空间的程序与设备通信的方法,主要有以下几种方式, 1. 通过ioperm获取操作IO端口的权限,然后用inb/inw/ inl/ outb/outw/outl等函数,避开设备驱动程序,直接去操作IO端口.(没有用过) 2. 用ioctl函数去操作/dev目录下对应的设备,这

linux下内存泄露检测工具Valgrind

日前在linux开发一个分析实时路况的应用程序,在联合测试中发现程序存在内存泄露的情况. 这下着急了,马上就要上线了,还好发现了一款Valgrind工具,完美的解决了内存泄露的问题. 推荐大家可以使用看看. Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它的主要作者是获得过Google-O'Reilly开源大奖的Julian Seward,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等.Valgrind可以

linux下内存泄露检测工具Valgrind介绍

目前在linux开发一个分析实时路况的应用程序,在联合测试中发现程序存在内存泄露的情况. 这下着急了,马上就要上线了,还好发现了一款Valgrind工具,完美的解决了内存泄露的问题. 推荐大家可以使用看看. Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它的主要作者是获得过Google-O'Reilly开源大奖的Julian Seward,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等.Valgrind可以

Linux下修改键盘默认布局

有时候在安装Linux选择键盘到布局到时候,会选择错误,这个时候可以选择终端命令来进行重新选择 sudo dpkg-reconfigure keyboard-configuration 之后键盘文我选择的MacBook Pro,之后选择英语(美国)即可解决问题.

linux 下修改键盘映射

原因: 输入 键盘原本的 "\ |",结果映射到 "< >",而 < 与 > 对应的键名分别是 less 与 greater 查询: 首先查询键名为 less 的映射 $ xmodmap -pke | grep -i less 可以看到有两个映射,一个是正常的 59键 ",<",另一个是出错的 94键" less greater" keycode 59 = comma less comma les

java中在linux下利用jstack检测死锁

首先,编写一个死锁程序 1 package deadlock; 2 3 public class testJstack { 4 final static Object resource_1 = new Object(); 5 final static Object resource_2 = new Object(); 6 7 public static void main(String[] args) { 8 Thread t1 = new Thread("t1") { 9 publi

嵌入式linux下自动定时检测硬盘空间并删除旧文件脚本

#! /bin/sh while true; do i=`df -h | egrep '/mnt/yourpath'| awk '{print $5}' | cut -d "%" -f1 -` if [ "$i" -ge 90 ] then echo "disk nearly full" cd /mnt/yourpath for file1day in `ls -d */ | sort -n | cut -d "/" -f1