我有一个小型的基于ncurses的程序,可以执行基本的化学计算。其主要功能如下:
int main() {
initscr();
cbreak();
nonl();
noecho();
/* draws borderlines from position 0 to (COLS - 1)
for purely decorative purposes at the top and bottom
of the screen */
draw_GUI();
keypress_loop();
endwin();
};
keypress_loop()
功能等待用户按下某个键,然后在键是字母或数字的情况下在屏幕上打印该键的符号,如果键既不是字母也不是数字,则会发出蜂鸣声。如果用户按F2键,则功能返回,程序结束。
void keypress_loop()
{
int key;
while ((key = wgetch(stdscr)) != KEY_F(2))
process_key(key);
}
到目前为止,一切都按预期进行。但是,然后我为SIGWINCH添加了一个信号处理程序,以确保在调整终端仿真器窗口的大小之后可以正确重绘边界线。在initscr()
函数的main()
之前插入:
signal(SIGWINCH, handle_resizing);
handle_resizing
()看起来像这样:
static void
handle_resizing(int signo) {
endwin();
initscr();
cbreak();
nonl();
noecho();
draw_GUI();
}
此SIGWINCH处理函数按预期重画了边界线。但是问题在于,当用户在调整大小后按下某个键时,程序将忽略该键。并且只有在用户按下按键三下或更多次之后,程序才开始识别该按键,然后一切正常!调整大小后,如何使程序立即识别按键?
答案 0 :(得分:4)
handle_resizing
函数调用在信号处理程序中使用不安全的函数。 resizeterm
手册页上有一节对此进行了讨论。您的程序应使用getch
的{{3}}返回值。