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过都不给力,搜索出来的要么都是问这个问题的没人回复,要不就是某些云游人士,抛下一两个函数的名字就闪人了,于是我一次次的当小白。。。。都是眼泪啊!!