C++ signal()覆盖其他信号处理程序

C++ signal()覆盖其他信号处理程序,c++,dll,sigint,C++,Dll,Sigint,signal()函数是否覆盖进程可能设置的其他信号调用?也就是说,如果一个进程设置了一个SIGINT处理程序,并且DLL调用signal(SIGINT,xxx)来处理它自己的终止代码,那么原始的SIGINT处理程序是否会被禁用?这不是对您的问题的“字面”回答,而是一个建议:您不应该在DLL中这样做 对于使用DLL的应用程序来说,这是意外的,而且通常是恼人的。DLL(通常)应该是“被动的”,只提供应用程序调用的函数 因此,应该从DLL中提供一个公共函数,应用程序需要调用该函数,例如MyDllCle

signal()
函数是否覆盖进程可能设置的其他信号调用?也就是说,如果一个进程设置了一个
SIGINT
处理程序,并且DLL调用
signal(SIGINT,xxx)
来处理它自己的终止代码,那么原始的
SIGINT
处理程序是否会被禁用?

这不是对您的问题的“字面”回答,而是一个建议:您不应该在DLL中这样做

对于使用DLL的应用程序来说,这是意外的,而且通常是恼人的。DLL(通常)应该是“被动的”,只提供应用程序调用的函数

因此,应该从DLL中提供一个公共函数,应用程序需要调用该函数,例如
MyDllCleanup()
。然后让应用程序决定如何调用该函数(通过信号处理程序或其他方法)。顺便说一句,初始化也是如此:不是依赖于
DllMain
(或者
/
在UNIX上使用
libdl
),而是为应用程序提供显式的调用函数。

signal()
调用:

  • 安装指定为新信号处理程序的处理程序,然后
  • 告诉你老处理程序是什么
  • 将调用新的处理程序而不是旧的处理程序。如果要将它们链接起来,需要执行以下操作:

        typedef void (*Handler)(int signum);
    
        static Handler old_int_handler = SIG_IGN;
    
        static void int_handler(int signum)    /* New signal handler */
        {
            /* ...do your signal handling... */
            if (old_int_handler != SIG_IGN && old_int_handler != SIG_DFL)
                (*old_int_handler)(signum);
        }
    
        static void set_int_handler(void)  /* Install new handler */
        {
            Handler old = signal(SIGINT, SIG_IGN);
            if (old != SIG_IGN)
            {
                old_int_handler = old;
                signal(SIGINT, int_handler);
            }
        }
    
        static void rst_int_handler(void)    /* Restore original handler */
        {
            Handler old = signal(SIGINT, SIG_IGN);
            if (old == int_handler)
            {
                signal(SIGINT, old_int_handler);
                old_int_handler = SIG_IGN;
            }
        }
    
        void another_function()
        {
            /* ... */
            set_int_handler();
            /* ... */
            rst_int_handler();
            /* ... */
        }
    
    如果中断被忽略,这会使它们被忽略。如果中断由用户定义的中断处理程序处理,那么这将调用信号处理代码和原始信号处理代码


    请注意,关于不在DLL(共享库)中处理信号的from也是相关和有效的。上面的描述假设您决定忽略该建议。

    我不相信DLL和信号在同一个操作系统上,伙计。@DeadMG:您错了,Windows确实支持
    SIGINT
    ,@DeadMG:SIGINT不是,其他的都是。因为标准C(C89)需要
    signal()
    ,所以MSVC必须支持它。语义可能是有限的,但必须得到支持;然而,DLL正在被注入。嗯,你是否将DLL注入到“任意”进程中?或者您是否知道您的目标进程内部工作。因为否则你也会危及它们的稳定性。一般来说,信号和线程不能很好地混合。此外,是的,我喜欢;我知道何时会引发和未引发
    sigint