QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 928|回复: 0

请教一个信号处理的问题

[复制链接]
发表于 2005-3-25 17:35:36 | 显示全部楼层 |阅读模式
我看到一篇文章说可以在signal handler中抛出一个C++异常来确保进程收到信号时优雅地释放其占有的资源. 但是我在Mandrake 10.1上却无法实现这样的行为, 得到的结果是在SIGINT的handler中抛出异常会导致进程收到SIGABRT信号, 于是立即结束.

我分析了一下可能的原因 :

1. Mandrake 10.1的gcc 3.4.1有一个可疑的配置参数--disable-libunwind-exceptions, 于是我下载了gcc 3.4.3的源代码并禁止该参数, 但结果依旧.

2. c标准库的signal()实现并非直接注册传入的参数, 而是注册其内部的一个函数, 再由该函数调用用户的signal handler. 而试验表明, 若该函数编译时未支持EH, 则它调用的函数抛出的异常不能穿过它到达更高的调用层次. 所以我用int 0x80的方式注册handler, 还是同样的结果.

3. Understanding the Linux Kernel中说内核在分派信号时会在用户栈上构造一些额外的调用, 因此在handler执行时栈的状态如下:

低地址
^  | Signal Handler | --> 用户态
|   |    sigreturn()    | --> 内核态
|   |          ......         | --> 用户态被信号中断的指令地址
高地址

是不是因为这个sigreturn()导致了异常不能到达被中断的函数中呢? 请大家帮我分析一下.

另外附上我参考的一些资料.
http://www-900.ibm.com/developerworks/cn/linux/l-cppexcep.shtml

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 11:42 , Processed in 0.050238 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表