how to get keyboard key with non blocking in terminal

/**************************************************************************
 *        how to get keyboard key with non blocking in terminal
 * 声明:
 *      如何在终端下以非堵塞的方式获取按键的键值,这个想法最初是因为
 *  在单线程下实现多任务,同时不因键盘输入而堵塞,核心内容来自网络,
 *  但已经忘了出处。
 *
 *                                    2015-7-5 晴 深圳 南山平山村 曾剑锋
 *************************************************************************/

                    \\\\\\-*- 目录 -*-/////
                    |  一、cat kbhit.h
                    |  二、cat kbhit.c
                    \\\\\\\\\\\\///////////

一、cat kbhit.h
    #ifndef __KBHIT_H__
        #define __KBHIT_H__

        #include <stdio.h>
        #include <termios.h>
        /**
         * 初始化键盘操作
         */
        void init_keyboard(void);
        /**
         * 关闭键盘操作
         */
        void close_keyboard(void);
        /**
         * 判断是否有按键按下,如果有案件按下返回1,没有按键按下
         * 则返回0
         */
        int kbhit(void);
        /**
         * 用于在有案件按下之后,读取字符
         */
        int readch(void);

    #endif // __KBHIT_H__

二、cat kbhit.c
    #include "kbhit.h"

    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;
    }
时间: 2024-10-10 09:39:11

how to get keyboard key with non blocking in terminal的相关文章

keyboard键盘demo

main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" andr

SSH key introduction

Preface At the first time, we take the connection with GitLab remote server. You need to type username and password as your individual credentials to login the server, since the connection between the client(your computer) and remote server(Git sever

和我一起开发Android应用(三)——“悦词-i背单词”词典功能实现

接上一讲.本节我们把词典功能基本实现,首先上一个效果图,我发现大家比较关心界面方面的东西,我之前写的一个关于QQ界面的项目就很受欢迎,当然我现在能写出远比那个好看的界面.但是我想一个应用最核心的东西不完全在界面,一个好的创意,一个好的后台服务才是成功的关键,这也是我不断学习的方向. 另外我发现在百度搜“悦词背单词91”搜索结果全是我在博客园的博文了...所以我把这个项目在91应用市场的下载地址粘上来吧,十分欢迎大家试用一下,有什么改进的意见请写在下面的评论里!地址:http://apk.91.c

图形对象的创建(常用图形对象的创建方法及特殊属性)

1.图形窗口对象 MATLAB的一切图形图像的输出都是在图形窗口中完成的. 一.创建 建立图形窗口对象使用figure函数,其调用格式为:句柄变量=figure(属性名1,属性值1,属性名2,属性值2,...) MATLAB通过对属性一的操作来改变图形窗口的形式.也可以使用figure函数按MATLAB默认的属性值建立图形窗口,格式为:figure  或  句柄变量 =figure MATLAB通过figure函数建立窗口之后,还可以调用figure函数来显示该窗口,并将其设定为当前窗口,调用格

Java模拟按键

JDK自带了Robot类,此类用于为测试自动化.自运行演示程序和其他需要控制鼠标和键盘的应用程序生成本机系统输入事件.Robot 的主要目的是便于 Java 平台实现自动测试. 详情可查看jdk1.6中文手册Robot类 例子:打开win7的任务管理器,快捷键是ctrl+shift+esc import java.io.*; import java.awt.*; import java.util.*; import java.awt.event.*; /** *@author:HaxtraZ *

install_server

#!/bin/bash read -p "请输入你ISO镜像位置:" file read -p "请输入你PXELINUX位置:" pxe read -p "请输入你想安装服务器版本{server5.9|server6.4|servercentos6.4}:" vers echo ${file:?"this not exis"} echo ${vers:?"this not exis"} echo ${px

Android自定义键盘之汉字键盘

实现软键盘主要用到了系统的两个类:Keyboard和KeyboardView. Keyboard类源码的介绍是: Listener for virtual keyboard events.即用于监听虚拟键盘. KeyboardView类源码的介绍是: A view that renders a virtual {@link Keyboard}. It handles rendering of keys and detecting key presses and touch movements.即

wxPython 键盘事件列表

wx.KeyEvent    Home       Trees       Index       Help    wxPython 2.8.9.2 Package wx :: Class KeyEvent [frames | no frames] Type KeyEvent object --+ | Object --+ | Event --+ | KeyEvent This event class contains information about keypress and charact

C#钩子类 几乎捕获键盘鼠标所有事件

using System; using System.Text; using System.Runtime.InteropServices; using System.Reflection; using System.Windows.Forms; namespace MouseKeyboardLibrary { /// <summary> /// Abstract base class for Mouse and Keyboard hooks /// </summary> publ