我正在处理与Readline: Get a new prompt on SIGINT类似的问题, 但是对于这个问题给出的答案并不能完全满足给出的问题。
我正在使用GNU readline的常规(非回调)版本,并且正在编写一个信号处理程序来处理C中的SIGINT。处理程序应该清除当前的readline缓冲区并在新行上显示一个干净的提示符。
我目前主要担心的是,如果我在signalHandler函数中调用的函数可以安全使用,我就无法确认。我在readline信号处理方面看到的唯一例子是使用回调备用接口的readline文档。
另一种选择是在我上面链接的问题中使用siglongjmp。该解决方案的问题在于它没有提供在信号调用之后释放存储器分配的行缓冲器的方法。引发中断信号将再次调用readline(),但不会释放先前调用readline分配的行。 Free()不是信号安全功能。
是否有人使用常规接口而不是回调接口在C中使用readline库编写信号安全SIGINT处理程序?
我当前信号处理程序的示例:
void signalHandler(int sig) {
if (inReadline==1)
{
rl_reset_line_state(); // Resets the display state to a clean state
rl_cleanup_after_signal(); // Resets the terminal to the state before readline() was called
rl_replace_line("",0); // Clears the current prompt
rl_crlf(); // Moves the cursor to the next line
rl_redisplay(); // Redisplays the prompt
}
}