在接下来的main()函数中我们定义了一个函数指针p,使其指向了 func()函数,接下来我们使用了一句 signal_call(1,p)();代码,实现了func函数调用,那么这到底是怎么实现的呢?那么我们来分析下,前面的signal_call(1,p)返回的是一个函数指针,在代码中我们发现其实返回的就是p,所以signal_call(1,p)();就可以变形为p(),看到这种形式我们这就可以很清楚的看出,它调用的就是我们代码中的func()函数了。现在读者明白了signal()函数的实现方法,接下来我们来看看一段使用signal捕捉除数为0时候的异常代码。
- #include <stdio.h>
- #include <signal.h>
- #include <setjmp.h>
- #include <stdlib.h>
- #include <float.h>
- #include <string.h>
-
- jmp_buf buf;
- int err;
-
- void handler( int num )
- {
- err = num;
- printf( "发生浮点计算异常\n");
- longjmp( buf, 1);
- }
- int main( void )
- {
- double a, b;
- char str[20];
- int ret;
- _control87( 0, _MCW_EM );
- if( signal( SIGFPE, handler ) == SIG_ERR )
- {
- printf("绑定失败\n" );
- abort();
- }
- ret = setjmp( buf );
- if(0 == ret )
- {
- printf("请输入被除数:");
- scanf("%lf",&a);
- printf("请输入除数:");
- scanf("%lf",&b);
- printf( "a / b = %4.3g\n", a/b);
- printf("发生异常时候不会被执行的语句\n");
- }
-
- return 0;
- }
|
没有发生异常时候的运行结果:
- 请输入被除数:123
- 请输入除数:3
- a / b = 41
- 发生异常时候不会被执行的语句
- Press any key to continue
|
发生异常时候的运行结果:
- 请输入被除数:12
- 请输入除数:0
- 发生浮点计算异常
- Press any key to continue
|