在 ncurses 中处理信号

Handle signals in ncurses

我正在使用 C 编写程序 ncurses.I 我正在尝试处理 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

无需进一步研究:如果 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(),这是将终端恢复正常所必需的。

initscr manual page 中所述,ncurses 为 SIGINT

安装了一个处理程序

The handler attempts to cleanup the screen on exit. Although it usually works as expected, there are limitations:

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

ncurses 对 SIGINT 的处理考虑到了这样一个事实,即它通常使用的一些功能是不安全的,并且它在收到信号(可能不是 100 % 可靠,但有所改进)。

您的信号处理程序不考虑任何这些,例如 ncurses 可以调用 malloc 来处理一些需要的额外输出缓冲,并且 "not work",因为 malloc不是一个安全的功能。

进一步阅读: