3

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

我从这个问题中看到了下面的代码,想知道为什么还需要放入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
}
4

2 回答 2

3

信号手册说:

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

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

于 2012-01-24T09:24:17.390 回答
1

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

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

于 2012-01-24T09:47:44.437 回答