在C中调用信号时如何执行语句
如果调用(^C)信号,我将尝试释放一点内存。我没有成功地使用“if”语句。我可能不知道到底发生了什么,但我真的需要一些帮助在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,以安装信号处理
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等以释放以前的缓冲区,并为您执行循环。。看看