正确使用信号处理程序的方法

时间:2012-01-24 09:19:37

标签: c linux signals signal-handling

使用信号处理程序的正确方法是什么?

我在这个question中看到了下面的代码,并且想知道为什么还需要将signal(SIGSEGV,sig_func);放在sig_func中?当进程收到SIGSEGV信号时,这不会创建无限循环吗?

void sig_func(int sig)
{
  write(1, "Caught signal 11\n", 17);
  signal(SIGSEGV,sig_func);
}

int main()
{


 signal(SIGSEGV,sig_func); //Install the signal handler

 //Do work here
}

2 个答案:

答案 0 :(得分:3)

signal manual说:

  

最后,如果处理程序设置为函数sighandler,则首先将处理程序重置为SIG_DFL,或者执行依赖于实现的信号阻塞,然后使用参数signum调用下一个sighandler。

重复调用signal用于在(可能)重置为SIG_DFL之后重新安装自定义处理程序。

答案 1 :(得分:1)

在您提供的示例中,在sig_funct中调用signal是无用的,因为您已经在main中设置了信号处理程序,并且没有在处理程序中更改它。

考虑你的第二个问题,不,它不会创建一个无休止的循环,因为signal()将信号SIGSEGV的处置设置为处理程序但不执行它。