这table列出了所有POSIX保证是异步信号安全的,这样的功能可以从信号处理函数中调用。
通过使用“写”命令从该表中,下面的比较“丑陋”的解决方案希望将这样的伎俩:
#include <csignal>
#ifdef _WINDOWS_
#define _exit _Exit
#else
#include <unistd.h>
#endif
#define PRINT_SIGNAL(X) case X: \
write (STDERR_FILENO, #X ")\n" , sizeof(#X ")\n")-1); \
break;
void catchSignal (int reason) {
char s[] = "Caught signal: (";
write (STDERR_FILENO, s, sizeof(s) - 1);
switch (reason)
{
// These are the handlers that we catch
PRINT_SIGNAL(SIGUSR1);
PRINT_SIGNAL(SIGHUP);
PRINT_SIGNAL(SIGINT);
PRINT_SIGNAL(SIGQUIT);
PRINT_SIGNAL(SIGABRT);
PRINT_SIGNAL(SIGILL);
PRINT_SIGNAL(SIGFPE);
PRINT_SIGNAL(SIGBUS);
PRINT_SIGNAL(SIGSEGV);
PRINT_SIGNAL(SIGTERM);
}
_Exit (1); // 'exit' is not async-signal-safe
}
编辑:大厦的窗户。
尝试构建这个窗口后,看起来'STDERR_FILENO'没有被定义。然而从文档看,它的值看起来是'2'。
#include <io.h>
#define STDIO_FILENO 2
编辑:“退出”不应从信号处理程序或者叫!
正如所指出的fizzer,调用_Exit在上述用于信号如HUP和TERM大锤的方法。理想情况下,当捕获这些信号时,可以使用“volatile sig_atomic_t”类型的标志通知主程序它应该退出。
以下我发现在我的搜索中很有用。
- Introduction To Unix Signals Programming
- Extending Traditional Signals
很好的回答,从中学到了一些新东西,太糟糕了原来的海报没有回来投票/选择一个答案:) – 2008-09-22 00:46:54
感谢您的评论。顺便说一句 - 这*是OP的答案,即。我。我仍然不能100%确定这是正确的,因此我不会将它标记为已回答。 – 2008-09-22 07:49:20