Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中调用信号时如何执行语句_C_Signals - Fatal编程技术网

在C中调用信号时如何执行语句

在C中调用信号时如何执行语句,c,signals,C,Signals,如果调用(^C)信号,我将尝试释放一点内存。我没有成功地使用“if”语句。我可能不知道到底发生了什么,但我真的需要一些帮助 while ((line = readline(prompt))) { if (signal(SIGINT, sigintHandler) == SIG_IGN){ free(line); //Trying to execute statement continue; } 在循环之前调用一次signal,以安装信号处理

如果调用(^C)信号,我将尝试释放一点内存。我没有成功地使用“if”语句。我可能不知道到底发生了什么,但我真的需要一些帮助

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

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

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

在循环之前调用一次
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或计时器即将过期或类似情况),那么您的信号处理程序只需设置一个标志即可。使用接收到的信号值调用库函数而不是
中止
退出
快速退出
、或
信号
,会导致未定义的行为


根据个人经验,我可以告诉你,从信号处理器调用
printf
是不好的juju。我编写了一个定期写入Access数据库的程序。有一个信号处理程序本应将消息写入标准输出,但当被触发时,它结束了对.mdb文件的写入,导致数据库无法修复

您似乎希望返回值
signal
告诉您信号是否已发生。事实并非如此。相反,在循环之前设置一个信号处理函数,并在该函数中设置一个全局变量的值以指示它已被调用。然后,在循环内部,检查该变量的值。(警告:这是一个复杂的主题,此处不可能涵盖所有细节。)readline library已处理SIGINT等以释放以前的缓冲区,并为您执行循环。。看看