2

我有一个应用程序 A(某公司 X)。这个应用程序允许我通过编写自己的函数来扩展功能。

我告诉应用程序 A 在应用程序 A 的配置文件中调用我的用户函数(这是它知道应用程序 A 必须调用用户编写的函数的方式)。appl A 使用函数指针,我必须在调用我的用户编写的函数之前向 Application A 注册。

如果我的用户在生产中编写的函数出现错误或故障,Appl A 将停止运行。例如,如果我的用户编写的函数中有分段错误。

所以应用程序 A 将从共享的 DLL 文件中加载我的用户编写的函数。这意味着我的用户编写的函数将在应用程序 A 的进程地址空间中运行。

我希望处理某些信号,如分段错误、除以零和堆栈溢出,但应用程序 A 有自己为此编写的信号处理程序,

如何编写自己的信号处理程序来捕获用户编写的函数中的异常,以便我可以优雅地清理而不影响应用程序 A 的大部分内容?由于我的用户函数将在应用程序 A 的进程中调用,因此操作系统将调用在应用程序 A 中编写的信号处理程序,而不是我的用户函数。

我怎样才能改变这个?我希望操作系统调用在我的函数中编写的信号处理程序,但仅用于由我的函数引发的信号,这本质上是异步的。

注意:我没有应用程序 A 的源代码,我无法对其进行任何更改,因为它由不同的公司控制。

我将在 Linux、solaris 和可能的 Windows 平台上使用 C,并且仅使用 C。

4

3 回答 3

2

你没有指定你正在使用哪个平台,所以我会为 Linux 回答,它也应该对 Windows 有效。

当您设置信号处理程序时,您使用的系统调用会返回前一个处理程序。它这样做是为了在您不再对处理该信号感兴趣时将其返回。

信号MSDN 条目的Linux 手册页

由于您是加载到应用程序中的共享库,因此操作信号处理程序应该没有问题。只需确保覆盖您需要的最小值,以减少中断应用程序本身的机会(某些应用程序使用信号进行异步通知)。

于 2009-01-04T08:18:06.253 回答
1

最简洁的方法是在一个单独的进程中运行您的应用程序代码,该进程通过某种 IPC 机制与嵌入式共享 DLL 代码进行通信。您可以在流程中处理您想要的任何信号,而不会影响其他流程。通常,您提到的条件(段错误、除以零、堆栈溢出)表示程序中的错误并将导致终止。除了修复错误的根本原因之外,您无能为力“处理”这些问题。

于 2016-11-01T16:12:02.110 回答
-5

在 C++ 中,您可以通过将代码放入 try-catch 中来捕获这些:

try
{
   // here goes your code
}
catch ( ... )
{
   // handle segfaults
}
于 2009-01-04T07:53:19.237 回答