如果在C中调用了信号,如何执行语句

时间:2018-10-05 16:52:09

标签: c signals

如果要调用(^ C)信号,我正在尝试释放一些内存。我没有成功使用'if'语句。我可能对实际发生的情况一无所知,但我确实可以在此方面提供一些帮助。

while ((line = readline(prompt))) {

    if (signal(SIGINT, sigintHandler) == SIG_IGN){

        free(line); //Trying to execute statement
        continue;
    } 

1 个答案:

答案 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_Exitquick_exitsignal以外的库函数会导致不确定的行为。

根据我的经验,我可以告诉您,从信号处理程序中调用printf bad juju。我开发了一个定期写入Access数据库的程序。有一个信号处理程序被假定为将消息写入标准输出,但在触发该信号处理程序时,该信号处理程序结束了对.mdb文件的写入,从而使数据库无法修复。