- static int getch(void)
- {
- struct termios oldt,newt;
- int ch;
- if (!isatty(STDIN_FILENO)) {
- fprintf(stderr, "this problem should be run at a terminal\n");
- exit(1);
- }
- // save terminal setting
- if(tcgetattr(STDIN_FILENO, &oldt) < 0) {
- perror("save the terminal setting");
- exit(1);
- }
- // set terminal as need
- newt = oldt;
- newt.c_lflag &= ~( ICANON | ECHO );
- if(tcsetattr(STDIN_FILENO,TCSANOW, &newt) < 0) {
- perror("set terminal");
- exit(1);
- }
今天在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 ); 通过这条语句可以看出设置后的终端属性为显示标准输入的字符
以上就是我通过查找资料的理解过程,欢迎各位指正!!