Linux下getch的模拟实现

发表于:2007-06-09来源:作者:点击数: 标签:
linux下默认是没有提供getch这个函数的,我们这里使用termios来模拟实现一个getch()函数,其基本原理为将终端设定为raw(或不缓冲的)模式。 int getch(void) { struct termios tm, tm_old; int fd = S TD IN_FILENO, c; if(tcgetattr(fd, tm) 0) return -1;

linux下默认是没有提供getch这个函数的,我们这里使用termios来模拟实现一个getch()函数,其基本原理为将终端设定为raw(或不缓冲的)模式。

 int getch(void) 
{
struct termios tm, tm_old;
int fd = STDIN_FILENO, c;

if(tcgetattr(fd, &tm) < 0)
return -1;

tm_old = tm;

cfmakeraw(&tm);

if(tcsetattr(fd, TCSANOW, &tm) < 0)
return -1;

c = fgetc(stdin);

if(tcsetattr(fd, TCSANOW, &tm_old) < 0)
return -1;

return c;
}

这里的getch()实际相当于turbo c中的kbhit(), 其中关键为cfmakeraw对终端的相关控制

,man page 说明cfmakeraw()实际上做了:


cfmakeraw sets the terminal attributes as follows:
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;

 


原文转自:http://www.ltesting.net