我有一个应用程序A(由一些公司X)。这个应用程序允许我通过允许我编写自己的函数来扩展功能。
我告诉应用程序A在应用程序A的配置文件中调用我的用户函数(这就是它知道Appl A必须调用用户编写的函数的方式)。 appl A使用函数指针,在调用用户编写的函数之前,我必须在应用程序A中注册。
如果我的用户编写的功能在生产中存在错误或错误,则Appl A将停止运行。例如,如果我的用户编写函数中存在分段错误。
因此,应用程序A将从共享的DLL文件加载我的用户编写的函数。这意味着我的用户编写函数将在Application A'Process address space。
中运行我希望处理某些信号,如分段故障,除以零和堆栈溢出,但应用程序A有自己的信号处理程序为此编写,
如何编写自己的信号处理程序来捕获用户编写的函数中的异常,以便我可以优雅地清理而不影响应用程序A的大部分?由于我的用户功能将在应用程序A的过程中调用,因此操作系统将调用应用程序A中编写的信号处理程序,而不是我的用户函数。
我该怎么改变?我希望操作系统调用我的函数编写的信号处理程序,但仅限于我的函数引发的信号,这本质上是异步的。
注意:我没有应用程序A的源代码,我无法对其进行任何更改,因为它是由另一家公司控制的。
我将使用C,而Linux,solaris和Windows平台上只能使用C语言。
答案 0 :(得分:2)
你没有指定你正在使用哪个平台,所以我会回答Linux,它也适用于Windows。
设置信号处理程序时,您使用的系统调用将返回上一个处理程序。这样做是为了在您不再对处理该信号感兴趣时可以返回它。
Linux man page for signal
MSDN entry on signal
由于您是加载到应用程序中的共享库,因此操作信号处理程序时应该没有问题。只需确保覆盖所需的最小值,以减少破坏应用程序本身的可能性(某些应用程序使用信号进行异步通知)。
答案 1 :(得分:1)
最简洁的方法是在一个单独的进程中运行您的应用程序代码,该进程通过某种IPC机制与嵌入式共享DLL代码进行通信。您可以在不影响其他过程的情况下处理过程中需要的任何信号。通常,您提到的条件(seg fault,除以零,堆栈溢出)表示程序中的错误并将导致终止。你无法做很多事情来处理"除了修复bug的根本原因之外,还有其他内容。
答案 2 :(得分:-2)
在C ++中,您可以通过将代码放在try-catch中来捕获这些:
try
{
// here goes your code
}
catch ( ... )
{
// handle segfaults
}