免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lsupper
打印 上一主题 下一主题

最近在弄C++方面,突然想到C的话,出现异常情况,如何善后? [复制链接]

论坛徽章:
0
51 [报告]
发表于 2010-11-15 14:56 |只看该作者
回复 49# l2y3n2


    是的...出现问题了...要解决...开始的时候进误区了...

论坛徽章:
0
52 [报告]
发表于 2010-11-15 14:59 |只看该作者
回复 49# l2y3n2


    是的,程序异常退出的时候,这种时候找到异常点,解决问题才重要...

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:11数据库技术版块每日发帖之星
日期:2015-08-30 06:20:00
53 [报告]
发表于 2010-11-15 16:19 |只看该作者
诶,总是有人被无良奸书害死。

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
54 [报告]
发表于 2010-11-15 23:24 |只看该作者
本帖最后由 nketc 于 2010-11-15 23:36 编辑

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <signal.h>

  4. static void
  5. signal_handler(int num)
  6. {
  7.   printf("signum=%d\n", num);
  8.   exit(-num);
  9. }

  10. int main(int argc, char *argv[])
  11. {
  12.   int a, b;
  13.   struct sigaction action;
  14.   int signum = SIGFPE;

  15.   action.sa_sigaction = signal_handler;
  16.   action.sa_flags = 0;

  17.   sigemptyset(&action.sa_mask);
  18.   sigaction(signum, &action, NULL);

  19.   a = 5;
  20.   b = argc - 1;

  21.   a = a/b;

  22.   return 0;
  23. }
复制代码

  1. thinkpad@laptop:~/workspace$ gcc -o sigtest signals.c
  2. thinkpad@laptop:~/workspace$ ./sigtest
  3. signum=8
  4. thinkpad@laptop:~/workspace$
复制代码
signum换成别的你可以处理如下异常情况:
  1. /* Signals.  */
  2. #define        SIGHUP                1        /* Hangup (POSIX).  */
  3. #define        SIGINT                2        /* Interrupt (ANSI).  */
  4. #define        SIGQUIT                3        /* Quit (POSIX).  */
  5. #define        SIGILL                4        /* Illegal instruction (ANSI).  */
  6. #define        SIGTRAP                5        /* Trace trap (POSIX).  */
  7. #define        SIGABRT                6        /* Abort (ANSI).  */
  8. #define        SIGIOT                6        /* IOT trap (4.2 BSD).  */
  9. #define        SIGBUS                7        /* BUS error (4.2 BSD).  */
  10. #define        SIGFPE                8        /* Floating-point exception (ANSI).  */
  11. #define        SIGKILL                9        /* Kill, unblockable (POSIX).  */
  12. #define        SIGUSR1                10        /* User-defined signal 1 (POSIX).  */
  13. #define        SIGSEGV                11        /* Segmentation violation (ANSI).  */
  14. #define        SIGUSR2                12        /* User-defined signal 2 (POSIX).  */
  15. #define        SIGPIPE                13        /* Broken pipe (POSIX).  */
  16. #define        SIGALRM                14        /* Alarm clock (POSIX).  */
  17. #define        SIGTERM                15        /* Termination (ANSI).  */
  18. #define        SIGSTKFLT        16        /* Stack fault.  */
  19. #define        SIGCLD                SIGCHLD        /* Same as SIGCHLD (System V).  */
  20. #define        SIGCHLD                17        /* Child status has changed (POSIX).  */
  21. #define        SIGCONT                18        /* Continue (POSIX).  */
  22. #define        SIGSTOP                19        /* Stop, unblockable (POSIX).  */
  23. #define        SIGTSTP                20        /* Keyboard stop (POSIX).  */
  24. #define        SIGTTIN                21        /* Background read from tty (POSIX).  */
  25. #define        SIGTTOU                22        /* Background write to tty (POSIX).  */
  26. #define        SIGURG                23        /* Urgent condition on socket (4.2 BSD).  */
  27. #define        SIGXCPU                24        /* CPU limit exceeded (4.2 BSD).  */
  28. #define        SIGXFSZ                25        /* File size limit exceeded (4.2 BSD).  */
  29. #define        SIGVTALRM        26        /* Virtual alarm clock (4.2 BSD).  */
  30. #define        SIGPROF                27        /* Profiling alarm clock (4.2 BSD).  */
  31. #define        SIGWINCH        28        /* Window size change (4.3 BSD, Sun).  */
  32. #define        SIGPOLL                SIGIO        /* Pollable event occurred (System V).  */
  33. #define        SIGIO                29        /* I/O now possible (4.2 BSD).  */
  34. #define        SIGPWR                30        /* Power failure restart (System V).  */
  35. #define SIGSYS                31        /* Bad system call.  */
复制代码
signum也可以或上多个标志。sa_flags也有丰富的选择。程序异常时尽可能的释放资源吧。如果想回退可以考虑 setjmp/longjmp。

论坛徽章:
0
55 [报告]
发表于 2010-11-16 09:04 |只看该作者
回复 54# nketc


    3q...

论坛徽章:
0
56 [报告]
发表于 2010-11-16 13:15 |只看该作者
至于系统错误,在C++看来应该跟你用的系统库函数相关吧,mfc用C++,qt也用C++,对系统错误的处理也不相同,只有看是能不能catch到了。

论坛徽章:
0
57 [报告]
发表于 2010-11-16 16:47 |只看该作者
回复 56# lipuxe


    嗯》。。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
58 [报告]
发表于 2010-11-17 10:48 |只看该作者
最近我的工作基本转到了C++,在做项目的时候发现为了资源能够保证得到释放,会采用智能指针、try-catch等来 ...
lsupper 发表于 2010-11-12 18:57


捕获浮点异常信号。

论坛徽章:
0
59 [报告]
发表于 2010-11-17 12:38 |只看该作者

论坛徽章:
0
60 [报告]
发表于 2010-11-18 14:22 |只看该作者
学习中
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP