linux下kbhit()使用

        最近写一段程序,因为刚学linux学习网络编程,编个聊天软件(有一个功能就是可以选择让对方显示自己的输入过程),因为打算在输入字符前面加上昵称,因此我计划是通过判断键盘输入来确定是否要输入信息,在网上找了关于这方面的内容,其中最多的就是各种kbhit()函数在linux中实现,最开始是做的是这样做的:

       首先,在网上找到了kbhit()函数的实现:

int kbhit(void)  
{  
struct termios oldt, newt;  
int ch;  
int oldf;  
tcgetattr(STDIN_FILENO, &oldt);  
newt = oldt;  
newt.c_lflag &= ~(ICANON | ECHO);  
tcsetattr(STDIN_FILENO, TCSANOW, &newt);  
oldf = fcntl(STDIN_FILENO, F_GETFL, 0);  
fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); 
ch = getchar();  
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);  
fcntl(STDIN_FILENO, F_SETFL, oldf);  
if(ch != EOF)  
{  
ungetc(ch, stdin);  
return 1;  
}  
return 0;  

因为上述函数肯定在输入时肯定会在屏幕上显示出来,为了不让其显示,在ch = getchar();  前面加上一句system('stty -echo");并用一个全局变量c将ch字符保存起来,

然后在程序中调用大概流程是:

while(1)

{

       if(kbhit())

      {

           cout<

          .......

       }

}

但是这个程序不对,因为在输入过程中还是会在屏幕上显示,而且不知道为什么以后c的值保持不变,而且kbhit()返回值都是1,即使我不按键的时候都是,这个把我纠结半天,然后网上寻求答案,可能是经验问题,没有找到,最后阴差阳错,在不让对方显示自己的输入过程时用到gets()函数就可以了,所以在这个程序中将  cout<

改为getc(stdin);然后就好了,后来上网查找原因,感觉应该和gets()/getc()输入机制有关,因为编程经验和对系统机制知识不足,具体原因我也不是很清楚,所以写这篇文章是希望像我这样的初学者能够很好的解决一些问题,同时也希望大神们知道答案的请私信我,告诉我答案,我会非常感谢的!

      最后祝大家愉快!

你可能感兴趣的:(linux)