问题描述
调整终端大小时,
getch返回410。为什么getch会将调整大小解释为输入?什么是410?这是一个特殊的符号吗?
代码:
#include <curses.h>
int main() {
initscr(); cbreak(); noecho();
int x = getch();
printw("%d",x);
getch();
endwin();
return 0;
}
但是当我使用超时时,我得到ERR(即-1)。为什么在使用超时时调整大小会导致错误?
代码:
#include <curses.h>
int main() {
initscr(); cbreak(); noecho(); timeout(10000);
int x = getch();
printw("%d",x);
getch();
endwin();
return 0;
}
解决方法
/* curses.h */
#define KEY_RESIZE 0632 /* Terminal resize event */
410 = 0632(八进制)。
关于您的第二个问题,当我在计算机上进行测试时不会发生。您也许正在运行ncurses的旧版本?周围有错误。 https://lists.gnu.org/archive/html/bug-ncurses/2002-01/msg00003.html
,使用timeout
(在这种情况下为10秒)时,getch
将在超时到期时返回ERR
。在手册页中:
timeout
和wtimeout
例程将阻塞或非阻塞读取设置为 给定的窗口。如果 delay 为负,则使用分块读取(即, 无限期等待输入)。如果 delay 为零,则非阻塞 使用read(即,如果没有输入等待,则read返回ERR
)。如果延迟 为正,然后读取 delay 毫秒的块,并返回ERR
如果仍然没有输入。因此,这些例程提供相同的nodelay
的功能,以及能够 只能延迟毫秒(延迟为正)。
和
如果窗口指针为空或超时,则返回
ERR
在没有任何数据的情况下过期,或者如果执行被信号中断(errno将被设置为EINTR
)。
如果您有耐心(或测试缓慢),则会看到返回-1。如果让程序等待,会更容易:
#include <curses.h>
int main() {
initscr(); cbreak(); noecho(); timeout(10000);
for (;;) {
int x = getch();
move(0,0);
printw("%d",x);
getch();
clrtobot();
}
endwin();
return 0;
}
这是通常的情况。如果您看到的内容有所不同,那么相关信息(ncurses的版本和平台)应该是问题的一部分。