2009-01-04 83 views
2

我有一个应用程序A(由某公司X)。这个应用程序允许我通过允许我编写自己的函数来扩展功能。为共享库或DLL编写信号处理程序?

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

如果我的用户在生产中编写的函数存在缺陷或错误,则Appl A将停止运行。例如,如果我的用户书写函数中存在分段错误。

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

我想用零来处理某些信号像分割故障,分裂和堆栈溢出,但应用程序的一个都有自己的信号处理程序这份书面,

我怎么能写我自己的信号处理赶上例外我的用户编写的函数,以便我可以正常清理而不影响应用程序A的大部分?由于我的用户功能将在应用程序A的过程中被调用,操作系统将调用用应用程序A编写的信号处理程序,而不是我的用户功能。

我该如何改变这种情况?我希望OS调用在我的函数中编写的信号处理函数,但仅限于由我的函数引发的信号,这本质上是异步的。

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

我将在Linux,solaris和windows平台上使用C和C语言。

在C++

回答

-2

,你可以把你的代码在一个try-catch捕捉这些:

try 
{ 
    // here goes your code 
} 
catch (...) 
{ 
    // handle segfaults 
} 
+0

您无法使用异常处理程序捕捉信号。你只能捕捉异常。 – codemaker 2016-11-01 16:06:56

2

不指定你正在使用的平台,所以我会回答Linux和它应该也适用于Windows。

当您设置您的信号处理程序时,您使用的系统调用会返回以前的处理程序。它是这样做的,以便您可以在您不再有兴趣处理该信号时返回它。

Linux man page for signal
MSDN entry on signal

因为你是一个共享库加载到应用程序,你应该没有问题,操纵信号处理程序。只需确保覆盖您所需的最低限度,以降低破坏应用程序本身的可能性(某些应用程序使用异步通知信号)。

1

执行此操作的最简单方法是将您的应用程序代码运行在通过某种IPC机制与嵌入式共享DLL代码进行通信的单独进程中。你可以在你的过程中处理任何你想要的信号而不影响其他过程。通常情况下,您提到的条件(seg fault,除以零,堆栈溢出)表明程序中存在错误并将导致终止。除了解决错误的根本原因之外,你无法“处理”这些东西。