关于getch()函数的理解

来源:互联网 发布:php数据表统计插件 编辑:程序博客网 时间:2024/06/05 19:55

  1. static int getch(void)  
  2. {  
  3.     struct termios oldt,newt;  
  4.     int ch;  
  5.   
  6.     if (!isatty(STDIN_FILENO)) {  
  7.         fprintf(stderr, "this problem should be run at a terminal\n");  
  8.         exit(1);  
  9.     }  
  10.     // save terminal setting  
  11.     if(tcgetattr(STDIN_FILENO, &oldt) < 0) {  
  12.         perror("save the terminal setting");  
  13.         exit(1);  
  14.     }  
  15.   
  16.     // set terminal as need  
  17.     newt = oldt;  
  18.     newt.c_lflag &= ~( ICANON | ECHO );  
  19.     if(tcsetattr(STDIN_FILENO,TCSANOW, &newt) < 0) {  
  20.         perror("set terminal");  
  21.         exit(1);  
  22.     }  

今天在linux ARM平台看下有关PWM的代码时,发现了getch()函数,下面对于该函数,谈谈自己的理解:

1,首先该函数不是c 库中的函数,一般由程序员自己编写

2.该函数的功能是在终端上等待输入一个字符,但不显示在屏幕上

3.为什么该函数会有这样的功能,就必须分析它所调用的几个函数

       a. int isatty(int desc); 它的作用是: 检查设备类型 , 判断文件描述词是否是为终端机

      b.int tcgetattr(int fd, struct termios *termios_p);它的作用是:用于获取与终端相关的参数。参数fd为终端的文件描述符,返回的结果保存在termios 结构体中,该结构体一般包括如下的成员:

tcflag_t c_iflag;
tcflag_t c_oflag;
tcflag_t c_cflag;
tcflag_t c_lflag;
cc_t c_cc[NCCS];
在本函数中我们用到了它的c_lflag参数,c_lflag:本地模式标志,控制终端编辑功能
c.int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);它的作用是:用于设置终端参数。
函数在成功的时候返回0,失败的时候返回-1,并设置errno的值。参数fd为打开的终端文件描述符,参数optional_actions用于控制修改起作用的时间,而结构体termios_p中保存了要修改的参数。optional_actions可以取如下的值。
TCSANOW:不等数据传输完毕就立即改变属性。
TCSADRAIN:等待所有数据传输结束才改变属性。
TCSAFLUSH:清空输入输出缓冲区才改变属性。
在了解了以上函数的功能后,再来看getch()函数:
首先 判断标准输入是否是终端,接着读取该终端的参数,其次设置终端的参数,newt.c_lflag &= ~( ICANON | ECHO );  通过这条语句可以看出设置后的终端属性为显示标准输入的字符

以上就是我通过查找资料的理解过程,欢迎各位指正!!


0 0
原创粉丝点击