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

标签 c signals ncurses window-resize

我有一个基于 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 添加了一个信号处理程序,以确保在调整终端仿真器窗口的大小后正确重绘边界线。在 main() 函数中的 initscr() 之前,我插入:

signal(SIGWINCH, handle_resizing);

handle_resizing() 看起来像这样:

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

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

最佳答案

handle_resizing 函数调用在信号处理程序中使用不安全的函数。 resizeterm手册页有一节讨论这个。你的程序应该使用 KEY_RESIZEgetch 返回值。

关于c - 基于ncurses的程序拦截SIGWINCH后无法识别按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52893429/

相关文章:

c - 简单的指针算术题

c - 将字符串数组添加到c中的字符指针

python - 无限循环和用户输入作为终止

c++ - 如何向 KDevelop 中以 Debug模式启动的程序发送信号

linux - Python 诅咒接口(interface)

c - 8051未连接引脚

Python信号计数器

c - ncurses printw() 不会在窗口中打印任何内容

c++ - 无法从 'int' 转换为 'int *'

c - C while 循环和轮询中的电源效率