在 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
不是一个安全的功能。
进一步阅读:
- Apparent malloc from signal handler (and followup)
I need a list of Async-Signal-Safe Functions from glibc
我正在使用 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
不是一个安全的功能。
进一步阅读:
- Apparent malloc from signal handler (and followup)
I need a list of Async-Signal-Safe Functions from glibc