该函数是否会signal()
覆盖进程可能设置的其他信号调用?即,如果一个SIGINT
处理程序已由一个进程设置,并且一个 DLL 调用signal(SIGINT,xxx)
来处理它自己的终止代码,那么原始SIGINT
处理程序会被禁用吗?
问问题
3966 次
2 回答
10
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();
/* ... */
}
如果中断被忽略,这会使它们被忽略。如果中断由用户定义的中断处理程序处理,那么这将调用您的信号处理代码和原始信号处理代码。
请注意,Christian.K关于不在DLL(共享库)中处理信号的建议也是相关且有效的。上面的描述假设您决定忽略该建议。
于 2012-05-22T12:18:45.003 回答
2
这不是对您问题的“字面”答案,而是建议:您不应该在 DLL 中执行此操作。
对于使用 DLL 的应用程序来说,这是出乎意料的并且经常令人讨厌。DLL 应该(通常)是“被动的”并且只提供应用程序调用的函数。
因此,宁愿从您的 DLL 中提供一个公共函数,应用程序需要调用它,例如MyDllCleanup()
. 然后让应用程序决定它如何调用该函数(通过信号处理程序或其他)。顺便说一句,初始化也是如此:而不是依赖DllMain
(或_init
/_fini
在libdl
UNIX 上)提供显式函数供应用程序调用。
于 2012-05-22T12:17:09.093 回答