danath 发表于 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
页: [1]
查看完整版本: 请教一个信号处理的问题