3 键盘输入
键盘输入函数PC_GetKey在windows环境下,由于有库函数kbhit返回最近所敲的按键.就很容易实现。而在linux环境下我们需要构造自己的kbhit,在参考文献2中John.Wiley.Sons先生提供了一种现成的实现方法(这个方法会阻塞read函数.在本文中并不适用),这里我们使用了另外的一种实现方法,下面介绍给出其实现代码.
int kbhit(void){
struct timeval tv;
fd_set readFd;
struct termios newKbdMode;
if(!inited){
newKbdMode.c_lflag&=~(ICANON | ECHO);
newKbdMode.c_cc[VTIME]=0;
newKbdMode.c_cc[VMIN]=1;
tcsetattr(0,TCSANOW,&newKbdMode);
atexit(rekbd);
inited=1;
}
tv.tv_sec=0;
tv.tv_usec=0;
FD_ZERO(&readFd);
FD_SET(STDIN_FILENO,&readFd);
select(1,&readFd,NULL,NULL,&tv);
if(FD-ISSET(STDIN-FILENO,&readFd))
return 1;
else
return 0;
}
3.1 控制台的初始化
首先,这里使用了全局变量inited,它是一个初始化与否的标记.因为函数kbhit将被多次调用,而初始化只需要做一次.这样.当发现inited置1以后,就不会去做重复性的初始化工作了。如果inited为0,就需要对控制台(键盘)做初始化工作,这里定义了内核结构体termios类型的变量newKbdMode,我们需要对这个结构体的两个成员c_lflag和c_cc进行初始化,代码中对c_lflag的设置表示终端为不回显的非标准模式。c_cc[VTIME]=0,c_cc[VMIN]=1表示读函数会等待.直到出现1个键盘输入为止。(关于这个结构体的详细分析,可参阅参考文献2的第5章)。然后再调用tcsetattr把设置的值写入。最后,函数atexit将在3.3节详叙。
3 键盘输入
键盘输入函数PC_GetKey在windows环境下,由于有库函数kbhit返回最近所敲的按键.就很容易实现。而在linux环境下我们需要构造自己的kbhit,在参考文献2中John.Wiley.Sons先生提供了一种现成的实现方法(这个方法会阻塞read函数.在本文中并不适用),这里我们使用了另外的一种实现方法,下面介绍给出其实现代码.
int kbhit(void){
struct timeval tv;
fd_set readFd;
struct termios newKbdMode;
if(!inited){
newKbdMode.c_lflag&=~(ICANON | ECHO);
newKbdMode.c_cc[VTIME]=0;
newKbdMode.c_cc[VMIN]=1;
tcsetattr(0,TCSANOW,&newKbdMode);
atexit(rekbd);
inited=1;
}
tv.tv_sec=0;
tv.tv_usec=0;
FD_ZERO(&readFd);
FD_SET(STDIN_FILENO,&readFd);
select(1,&readFd,NULL,NULL,&tv);
if(FD-ISSET(STDIN-FILENO,&readFd))
return 1;
else
return 0;
}
3.1 控制台的初始化
首先,这里使用了全局变量inited,它是一个初始化与否的标记.因为函数kbhit将被多次调用,而初始化只需要做一次.这样.当发现inited置1以后,就不会去做重复性的初始化工作了。如果inited为0,就需要对控制台(键盘)做初始化工作,这里定义了内核结构体termios类型的变量newKbdMode,我们需要对这个结构体的两个成员c_lflag和c_cc进行初始化,代码中对c_lflag的设置表示终端为不回显的非标准模式。c_cc[VTIME]=0,c_cc[VMIN]=1表示读函数会等待.直到出现1个键盘输入为止。(关于这个结构体的详细分析,可参阅参考文献2的第5章)。然后再调用tcsetattr把设置的值写入。最后,函数atexit将在3.3节详叙。
举报