原理就是从/dev/tty文件读取。
/dev/tty存放你终端的信息。
C++写法
class _nonblocking_input {
public:
_nonblocking_input() {
tty_ = open("/dev/tty", O_RDONLY);
if (tty_ == -1) {
printf("%s\n", strerror(errno));
exit(0);
}
tcgetattr(tty_, &old_attr_);
new_attr_ = old_attr_;
new_attr_.c_lflag &= ~(ICANON | ECHO);
tcsetattr(tty_, TCSANOW, &new_attr_);
}
~_nonblocking_input() {
tcsetattr(tty_, TCSANOW, &old_attr_);
close(tty_);
}
char operator()() {
if (read(tty_, &inputc_, 1) != 1) {
printf("Something wrong when reading '/dev/tty'!\n");
}
return inputc_;
}
private:
int tty_;
char inputc_;
termios old_attr_;
termios new_attr_;
};
C写法,有坑,每读取一个字符都会打开一次该文件,超过一定数量会不被linux允许。
此代码来自网络。可以将tty声明为静态,或者每次打开后都关闭该文件
inline char nonblocking_input(void)
{
char input_ch;
struct termios newt, oldt;
int tty = open("/dev/tty", O_RDONLY); //Open control terminal
tcgetattr(tty, &oldt); //Get terminal properties
newt = oldt;
//Set characters are not buffered(~ICANON) and do not echo(~ECHO).
//You can also choose only one of them.
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr(tty, TCSANOW, &newt);
read(tty, &input_ch, 1);
tcsetattr(tty, TCSANOW, &oldt); //Restore terminal properties
return input_ch;
}