处理SIGWINCH

时间:2017-07-29 07:35:50

标签: c++ terminal signals xterm

为了好玩,我试图编写一个可以完成ncurses所做的一切的库,使用iostream并将转义序列直接发送到终端。

我试图处理SIGWINCH以在终端调整大小时告诉库。程序响应正常,直到我调整终端大小,然后它停止响应输入,甚至CTRL-C(虽然我没有处理SIGINT,并且终端处于" raw"模式使用termios )。

以下是我从代码中复制出来的一些代码段,以说明我是如何设置信号处理程序的。

void handle_sigwinch(int sig)                                   
{                                                                               
  if(sig == SIGWINCH)    
  {
    // set a flag here
  }
}
void setup_signals()                                            
{       
  struct sigaction new_sig_action;                                            
  new_sig_action.sa_handler = handle_sigwinch;                
  sigemptyset (&new_sig_action.sa_mask);                                      
  new_sig_action.sa_flags = 0;                                                
  sigaction (SIGWINCH, NULL, &old_sig_action_);                               
  if (old_sig_action_.sa_handler != SIG_IGN)                                  
  {                                                                           
    sigaction (SIGWINCH, &new_sig_action, NULL);                              
  }                                                                           
}

int main()
{
  setup_signals();
  int ch;
  // exit if ctrl-c is pressed
  while((ch == cin.get()) != 3)
  {
     if(ch > 0)
       cout << (char)ch;
  }
}

我根据https://www.gnu.org/software/libc/manual/html_node/Sigaction-Function-Example.html#Sigaction-Function-Example提供的示例为我设置了信号处理程序。

在处理SIGWINCH导致我的程序停止工作后,我有没有做过的事情?

编辑:我省略了使用cfmakeraw和tcsetattr设置终端的代码,在此之前我发送了一个转义序列,用于将xterm置于备用屏幕缓冲模式。

1 个答案:

答案 0 :(得分:0)

感谢nos的评论,我通过调试器发现程序运行正常,但cin.get()不再接收有效输入。所以我改变了我的谷歌搜索#34;程序挂起信号处理程序&#34; to&#34;输入流在信号处理程序&#34;之后断开并在StackOverflow上找到this回答,这让我意识到在调用信号处理程序后输入流处于错误状态。

我在输入之前放置了一个检查以忽略字符值-1(当我这样做时,我一定在考虑Arduino库read语句,其中-1表示没有输入是可用)。所以该程序基本上忽略了输入流上的错误。 (我编辑了我的问题代码以反映遗漏)。

我在循环中读取之前立即放置了cin.clear()语句,现在程序按预期工作。