【问题标题】:Handle signals in ncurses在 ncurses 中处理信号
【发布时间】:2017-05-20 10:31:08
【问题描述】:

我正在使用 ncurses 用 C 语言编写程序。我正在尝试处理 CRTL C 信号。在我的代码中,这个信号被捕获和处理,但程序没有正确终止。会不会是我退出 ncurses 的方式?

//handle SIGINT signal
void handle_signal(int signal){

   if(signal == SIGINT){

      clear();
      mvprintw(3,3,"A SIGNAL WAS ENCOUNTERED");
      refresh();
      sleep(1/2);
      exit(0);

    } //close if statement 

}//close handle_signal() function

【问题讨论】:

  • sleep(1/2)?这些是两个整数,所以除法的结果也将是一个整数。所以这与调用sleep(0) 相同。这是你想要的吗?
  • 我这样做只是为了测试以查看打印的消息。它没有解决任何问题:(

标签: c signals ncurses sigint


【解决方案1】:

如果没有进一步研究:如果curses 函数实际上是信号安全的,我会感到非常惊讶。通常最好的做法是保持信号处理程序最小化,理想情况下只是设置一个标志。所以,你应该这样解决你的问题:

static volatile sig_atomic_t interrupted = 0;

在您的信号处理程序中:

    if (signal == SIGINT)
    {
        interrupted = 1;
    }

在你的主循环中的某个地方:

    if (interrupted)
    {
        clear();
        mvprintw(3,3,"A SIGNAL WAS ENCOUNTERED");
        refresh();
        sleep(1);
        endwin();
        exit(0);
    }

请注意,您的代码没有在任何地方调用endwin(),这是将终端恢复正常所必需的。

【讨论】:

    【解决方案2】:

    initscr manual page 中所述,ncurses 为SIGINT 安装处理程序

    处理程序尝试在退出时清理屏幕。虽然它 通常按预期工作,但有局限性:

    如果您在initscr(或newterm)之前设置您的处理程序,它将不会被调用。如果您在之后设置处理程序,则必须考虑在信号处理程序中可以安全调用哪些函数的各种限制。

    ncurses 对SIGINT 的处理考虑到它通常使用的一些函数并不安全,并且它在收到信号时使用不同的策略(这可能不是 100% 可靠,但改进)。

    您的信号处理程序没有考虑任何这些,例如 ncurses 可以调用 malloc 来处理需要的一些额外的输出缓冲,并且“不起作用”,因为 malloc 不是一个安全的函数使用.

    进一步阅读:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      相关资源
      最近更新 更多