如果要调用(^ C)信号,我正在尝试释放一些内存。我没有成功使用'if'语句。我可能对实际发生的情况一无所知,但我确实可以在此方面提供一些帮助。
while ((line = readline(prompt))) {
if (signal(SIGINT, sigintHandler) == SIG_IGN){
free(line); //Trying to execute statement
continue;
}
答案 0 :(得分:1)
您在循环之前调用signal
一次来安装信号处理程序。信号处理程序本身将在收到信号后执行。
volatile sig_atomic_t interrupt_flag_set = 0;
void sigintHandler( int sig )
{
interrupt_flag_set = 1;
}
/**
* Save the original interrupt handler in case you need to
* restore it later.
*/
void (*oldhandler)(int) = signal( SIGINT, sigintHandler );
...
while( (line = readline( prompt )) )
{
if ( interrupt_flag_set )
{
// process interrupt
}
else
{
// process line normally
}
}
...
/**
* restore the original interrupt handler.
*/
signal( SIGINT, oldhandler );
如果您打算让信号处理程序捕获来自操作环境的信号(即,用户按下Ctrl-C或定时器到期或类似的操作),那么信号处理程序只需要设置一个标志即可。用接收到的信号值调用abort
,_Exit
,quick_exit
或signal
以外的库函数会导致不确定的行为。
根据我的经验,我可以告诉您,从信号处理程序中调用printf
是 bad juju。我开发了一个定期写入Access数据库的程序。有一个信号处理程序被假定为将消息写入标准输出,但在触发该信号处理程序时,该信号处理程序结束了对.mdb文件的写入,从而使数据库无法修复。