我想使用libev来监听终端中的键盘(击键)事件。我的想法是使用(n)curses getch()并设置notimeout()(非阻塞)告诉getch()不要等待下一个按键。
我可以观看getch使用的文件描述符吗?
答案 0 :(得分:3)
如果你使用initscr()
,你要求的文件描述符是fileno(stdin)
,因为initscr子例程相当于:
newterm(getenv("TERM"), stdout, stdin); return stdscr;
如果您使用newterm(type, outfile, infile)
,则文件描述符为fileno(infile)
。
答案 1 :(得分:2)
Curses,所有终端功能实际上都是通过普通的标准输入和输出文件描述符与实际终端进行通信。
它的作用是使用特殊ioctl
调用更改标志或直接发送由终端程序解析的特殊控制代码。
这意味着getch
函数只是从标准输入中读取其输入,如果您想要文件描述符是STDIN_FILENO
(来自<unistd.h>
头文件)。
答案 2 :(得分:0)
这是类似于getch的功能。我现在在Windows上,所以无法重新测试它。如果你想要
它只是听而不显示字符变化如下:newt.c_lflag &= ~(ICANON);
int getch(void)
{
struct termios oldt, newt;
int ch;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON|ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return ch;
}