使用信号处理程序的正确方法是什么?
我在这个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
}
答案 0 :(得分:3)
最后,如果处理程序设置为函数sighandler,则首先将处理程序重置为SIG_DFL,或者执行依赖于实现的信号阻塞,然后使用参数signum调用下一个sighandler。
重复调用signal
用于在(可能)重置为SIG_DFL
之后重新安装自定义处理程序。
答案 1 :(得分:1)
在您提供的示例中,在sig_funct中调用signal是无用的,因为您已经在main中设置了信号处理程序,并且没有在处理程序中更改它。
考虑你的第二个问题,不,它不会创建一个无休止的循环,因为signal()将信号SIGSEGV的处置设置为处理程序但不执行它。