【问题标题】:Writing Signal handlers for Shared libraries or DLL?为共享库或 DLL 编写信号处理程序?
【发布时间】:2009-01-04 07:35:00
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: signal-handling


    【解决方案1】:

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

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

    Linux man page for signal
    MSDN entry on signal

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 您无法使用异常处理程序捕获信号。你只能捕获异常。
        • 是的,你可以用三个点,如果你用 /EH 编译:msdn.microsoft.com/en-us/library/1deeycx5(v=vs.80).aspx
        • 有趣,我没有意识到这一点。虽然这是特定于 Windows 的,并且原始海报指定他们使用 C。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-19
        • 1970-01-01
        • 2023-03-17
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 2017-08-02
        相关资源
        最近更新 更多