代码之家  ›  专栏  ›  技术社区  ›  R. A.

处理SIGWINCH后程序挂起

  •  0
  • R. A.  · 技术社区  · 7 年前

    CTRL-C (尽管我没有处理SIGINT,并且使用termios将终端设置为“raw”模式)。

    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 回复  |  直到 7 年前
        1
  •  0
  •   R. A.    7 年前

    多亏了nos的评论,我通过调试器发现程序运行正常,但是 cin.get() 不再接收有效输入。所以我把我的谷歌搜索从“信号处理程序后程序挂起”改为“信号处理程序后输入流中断”,并找到了 this 回答StackOverflow,这让我意识到在调用信号处理程序后,输入流处于错误状态。

    我在输入之前设置了一个复选框,以忽略字符值-1(我一定是想到了Arduino库) read

    我放置了一个 cin.clear()