在Linux系统中,获取键盘输入通常涉及到使用终端I/O函数,这些函数允许程序从标准输入(通常是键盘)读取数据。以下是一些基本的概念和方法:
read()
:这个系统调用可以从文件描述符中读取数据,对于标准输入(文件描述符0),它可以用来读取键盘输入。termios
:这是一个用于控制终端I/O接口的库,可以用来设置终端为规范模式或非规范模式,以及改变其他终端属性。以下是一个简单的C语言示例,展示如何使用read()
函数获取键盘输入:
#include <unistd.h> // 包含read()函数
#include <stdio.h>
int main() {
char buffer[128];
ssize_t bytesRead;
printf("Press ESC to quit.
");
while (1) {
bytesRead = read(STDIN_FILENO, buffer, sizeof(buffer) - 1);
if (bytesRead < 0) {
perror("read");
break;
} else if (bytesRead == 0) {
// EOF (end-of-file) condition
break;
}
buffer[bytesRead] = '\0'; // 确保字符串以null结尾
printf("You entered: %s", buffer);
// 检查是否按下了ESC键 (ASCII码为27)
if (buffer[0] == 27) {
break;
}
}
return 0;
}
termios
库可以改变终端的输入模式。以下是一个使用termios
库将终端设置为非规范模式的示例:
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
void set_noncanonical_mode() {
struct termios ttystate;
// 获取当前终端属性
tcgetattr(STDIN_FILENO, &ttystate);
// 关闭规范模式和回显
ttystate.c_lflag &= ~(ICANON | ECHO);
// 设置新的终端属性
tcsetattr(STDIN_FILENO, TCSANOW, &ttystate);
}
void restore_canonical_mode() {
struct termios ttystate;
// 获取当前终端属性
tcgetattr(STDIN_FILENO, &ttystate);
// 打开规范模式和回显
ttystate.c_lflag |= (ICANON | ECHO);
// 设置新的终端属性
tcsetattr(STDIN_FILENO, TCSANOW, &ttystate);
}
int main() {
set_noncanonical_mode();
printf("Press 'q' to quit.
");
while (1) {
char ch;
read(STDIN_FILENO, &ch, 1);
printf("Key pressed: %c
", ch);
if (ch == 'q') {
break;
}
}
restore_canonical_mode();
return 0;
}
在这个示例中,程序会将终端设置为非规范模式,这样就可以实时读取每个按键,而不需要等待回车键。按下'q'键可以退出程序,并恢复终端的规范模式。
领取专属 10元无门槛券
手把手带您无忧上云