基于ncurses的程序拦截SIGWINCH后无法识别按键

After intercepting SIGWINCH in a ncurses-based program, key presses are not recognized

我有一个基于 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 函数 returns 并且程序结束。

void  keypress_loop() 
{
   int key;
   while ((key = wgetch(stdscr)) != KEY_F(2))
      process_key(key); 
}

目前一切正常。但随后我为 SIGWINCH 添加了一个信号处理程序,以确保在调整终端仿真器 window 的大小后正确重绘边界线。在 main() 函数的 initscr() 之前,我插入:

signal(SIGWINCH, handle_resizing);

handle_resizing() 看起来像这样:

static void
handle_resizing(int signo) {
      endwin();
      initscr();   
      cbreak();   
      nonl();   
      noecho();
      draw_GUI();
}

此 SIGWINCH 处理函数按预期重绘边界线。但问题是,当用户在调整大小后按下一个键时,程序会忽略这个键。只有在用户按下一个键三次或更多次后,程序才会开始识别该键,然后一切正常!如何让程序在调整大小后立即识别按键?

handle_resizing 函数调用了在信号处理程序中使用不安全的函数。来自 getch.

resizeterm manual page has a section discussing this. Your program should use the KEY_RESIZE return 值