linux下C编程 实现即时按键检测
来源:互联网 发布:node pm2 使用 编辑:程序博客网 时间:2024/06/07 01:58
首先说实现方法,然后在慢慢解释,因为我也很喜欢做伸手党,拿来能用就行,其他的都不重要。
在linux下要想用C语言编程实现实时的检测键盘按键输入,只需要在你需要实现的地方加上如下语句(注意:本人还没来得及检查是否有副作用,所以ctrl+c前请谨慎):
struct termios save, raw;
tcgetattr(0, &save);
cfmakeraw(&raw);
tcsetattr(0, 0, &raw);
好,然后慢慢的说这些东西的作用下面具体说明一下作用:
函数:tcgetattr
原型:int tcgetattr(int fd, struct termios *termios_p);
说明:tcgetattr函数用于获取与终端相关的参数。参数fd为终端的文件描述符,返回的结果保存在termios结构体中;
函数:cfmakeraw
原型:int cfmakeraw(struct termios *termios_p);
说明:官方man的解释是:
cfmakeraw 设置终端属性如下:
termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP |INLCR|IGNCR|ICRNL|IXON);
termios_p->c_oflag &= ~OPOST;
termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
termios_p->c_cflag &= ~(CSIZE|PARENB);
termios_p->c_cflag |= CS8;
PS:好吧我承认我理解能力不好,这个解析看的我很蛋疼,我的理解就是,这个函数会提取终端的一些属性,然后存到termios_p结构体里面;
函数:tcsetattr
原型:int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);
说明:tcsetattr函数用于设置终端参数。函数在成功的时候返回0,失败的时候返回-1,并设置errno的值。参数fd为打开的终端文件描述符,参数optional_actions用于控制修改起作用的时间,而结构体termios_p中保存了要修改的参数。
注:本人只是把函数的大概作用讲了一下,具体的函数用法,请自己详查;
注2:以上三个函数都在头文件“#include<termios.h>”中;
以上是大致的用法,具体的一些细节我会多用几次之后有些心得了再写,以免误人;
说下想实现这个功能的初衷,我在做一个类似shell命令解析的的东西,然后就用到了一个叫做历史记录查询的东西,这个东西需要检测上下键来即时的做出相应动作;
然后我就发现getchar之类的字符获取函数都是要等到回车之后才有反映,查了才知道,键盘是行缓冲文件,我的第一反应就是把标准输入修改成无缓冲不就行了嘛,然后我试了setbuf、setvbuf两个函数,结果必须失望。然后百度、google得到了几种方法,大致有,用read(1);getch()——这个函数在win平台下是可以的,但是linux我测试的是不行,我用的linux是redhat以及deepin;还有一个很神奇的函数——bioskey,话说这个感觉这个函数真的挺好的,可以是TC下用的,已经消失很多年的东西了。。。。
还有几种有待考证的办法,在国外论坛看到的,都是说梦话搬甩两个函数单词就跑路了,不过我从原理上分析感觉也许可能,有待以后考证,大致如下:
ioctl();
fcntl();
select();
curses函数库;
后记:
这个问题困扰了我很久很久了,我是自己学这个的,身边的朋友也没有懂这个的,遇到这个问题的时候,百度过、google过都不给力,搜索出来的要么都是问这个问题的没人回复,要不就是某些云游人士,抛下一两个函数的名字就闪人了,于是我一次次的当小白。。。。都是眼泪啊!!
- linux下C编程 实现即时按键检测
- Linux下使用C语言进行检测按键的输入
- 在linux下面实现检测按键----实现Linux 下的kbhit函数
- 关于Linux下按键的检测
- Linux下如何用C编程实现检测网卡与网线的连接状态
- Linux下如何用C编程实现检测网卡与网线的连接状态
- [C/C++]_[Linux,Windows,MacOSX控制台即时响应按键消息]
- 用c/c++实现linux下检测网络接口状态
- 用c/c++实现linux下检测网络接口状态
- 用c/c++实现linux下检测网络接口状态 .
- 用c/c++实现linux下检测网络接口状态
- Linux下用c实现通过ping检测连接
- 用c/c++实现linux下检测网络接口状态
- 用c/c++实现linux下检测网络接口状态
- c#实现多个按键同时按下检测
- 按键的编程—中断检测按键
- 检测按键(Linux中kbhit()函数的实现)
- linux下模拟按键kbhit(),检测按键终止while(1)死循环
- Android命令行签名另附jdk1.7签名无法安装的解决办法
- Android实现指定区域截屏的实现
- Mysql、SqlServer和Oracle 添加修改删除字段sql
- HDU 3255 Farming
- Android简单的广告控件View
- linux下C编程 实现即时按键检测
- excel 冻结行 在拖动的时候有的行固定有的行隐藏 (中英文版)
- 一句话 之 tool -- Dfsrdiag DFS 复制诊断工具
- win7怎样安装IIS?
- 字符数组与指向字符串的指针的区别
- 使用 Visual Studio 2005 Team System 进行单元测试并生成用于 Unit Test Framework 的源代码(详解)
- PHP + MYSQL 批量修改数据库 表名
- Android应用开发之电子相册
- VC单选按钮控件Radio Button用法