当前位置: 技术问答>linux和unix
这里放一个signal函数怎么解释(附源码)
来源: 互联网 发布时间:2015-10-24
本文导语: 在Unix编程环境里面看到的代码,截取部分如下: jmp_buf begin; main() { int fpecatch(); init(); setjmp(begin); signal(SIGFPE, fpecatch); ....... } int fpecatch() { ..... /* do something */ longjmp(begin); ...
在Unix编程环境里面看到的代码,截取部分如下:
jmp_buf begin;
main()
{
int fpecatch();
init();
setjmp(begin);
signal(SIGFPE, fpecatch);
.......
}
int fpecatch()
{
..... /* do something */
longjmp(begin);
}
没看明白这个signal函数,什么时候它开始捕获信号呢??
求教了
jmp_buf begin;
main()
{
int fpecatch();
init();
setjmp(begin);
signal(SIGFPE, fpecatch);
.......
}
int fpecatch()
{
..... /* do something */
longjmp(begin);
}
没看明白这个signal函数,什么时候它开始捕获信号呢??
求教了
|
signal(SIGFPE, fpecatch);只是一个设置函数.
它所做的是如果捕捉到SIGFPE,用fpecatch指向的函数处理.
而什么时候它开始捕获信号呢??
其实信号的捕捉是由linux操作系统来保证的.
当我们的代码中人为的或是程序隐含的bug造成一个信号的产生,或者在程序的外部针对当前
的程序进程号pid向其发出一个信号.操作系统能准确的捕捉,然后根据代码中的设置,针对我们
关心的信号,使用指定的函数处理信号.通常作为出错处理的一部分.
所以signal(SIGFPE, fpecatch)作为一个设置函数一般只是在初始化的时候做的.
它所做的是如果捕捉到SIGFPE,用fpecatch指向的函数处理.
而什么时候它开始捕获信号呢??
其实信号的捕捉是由linux操作系统来保证的.
当我们的代码中人为的或是程序隐含的bug造成一个信号的产生,或者在程序的外部针对当前
的程序进程号pid向其发出一个信号.操作系统能准确的捕捉,然后根据代码中的设置,针对我们
关心的信号,使用指定的函数处理信号.通常作为出错处理的一部分.
所以signal(SIGFPE, fpecatch)作为一个设置函数一般只是在初始化的时候做的.
|
只要这个进程还在,就可以接受SIGFPE(floating-point error)de 信号,如果有这个信号,执行fpecatch()这个函数
|
信号是由Linux捕获的,由Linux调用你注册的函数。
信号处理和你的程序执行是异步的,也就是说在你的程序执行中任何一点都有可能。
甚至是a=b+c*d-e;这样一条语句执行了一半的时候。
linux会在每次从核心态切换到用户态时,检查但前进程是否有信号,如果有,就调用注册的信号处理函数。而核心态和用户态的切换是非常频繁的。例如时钟中断这种高频的中断。
信号处理和你的程序执行是异步的,也就是说在你的程序执行中任何一点都有可能。
甚至是a=b+c*d-e;这样一条语句执行了一半的时候。
linux会在每次从核心态切换到用户态时,检查但前进程是否有信号,如果有,就调用注册的信号处理函数。而核心态和用户态的切换是非常频繁的。例如时钟中断这种高频的中断。