【问题标题】:How to restore the normal terminal when Ctrl+C is pressed?Ctrl+C按下时如何恢复正常终端?
【发布时间】:2021-11-02 17:54:46
【问题描述】:

我创建了一个数字时钟程序。我用这个cmd

printf("\033[?25l");
            // Hiding the cursor

但是当我用 Ctrl+C 停止程序时 终端光标仍然隐藏。 我该如何解决这个问题 并在Ctrl+C后恢复光标?

【问题讨论】:

  • 编写一个信号处理程序以在输入 ctrl-c 时取消隐藏光标。请注意,仅应在信号处理程序中调用async safe functions,而printf 不是其中之一。所以你需要要么使用write,要么设置一个变量,让主程序执行printf
  • 另一种方法是不隐藏光标,而是将其定位在不太明显的地方,例如在框架的右下角。
  • 这能回答你的问题吗? Catch Ctrl-C in C
  • 您还应该在按下Ctrl-Z 时取消隐藏它(即同时捕捉SIGTSTP)并在SIGCONT 上隐藏它。并且还处理SIGTERM,类似于SIGINT。可以使用printf("\033[...") 来了解事情的运作方式,但一般来说,最好使用curses,这将为您完成所有这些工作,并注意为您的终端使用正确的转义

标签: c terminal


【解决方案1】:
        static volatile int continueRunning = 1;// 
        void intHandler(int dummy) {
             printf("\033c");// clear the console
             printf("\e[?25h");//To re-enable the cursor
                 continueRunning = 0;
        }
    
    
    
    int main(int argc, char **argv) // you can use like this int main(int argc, char *argv[]) { /* ... */ }
    {
        signal(SIGINT, intHandler);
      
        
            while (continueRunning) {
/// to continuue your code

【讨论】:

  • 严格来说,不允许在信号处理器中调用printf
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多