如何在C/C+中编程实现SIG IGN或SIG DFL+;? 我想把信号处理机制封装成C++类,比如WNDPROC的消息调度到儿童窗口。
不幸的是,某些处理程序需要特殊操作,如SIG_IGN、SIG_DFL或SIG_ERR。例如,如何在C/C+中编程实现SIG IGN或SIG DFL+;? 我想把信号处理机制封装成C++类,比如WNDPROC的消息调度到儿童窗口。,c++,linux,signals,C++,Linux,Signals,不幸的是,某些处理程序需要特殊操作,如SIG_IGN、SIG_DFL或SIG_ERR。例如,nohup使用SIG\u IGN忽略SIGHUP。 对于信号主机,可能会发生许多情况 针对SIGSEGV执行的信号处理程序A: 这将执行printf(“SIGSEGV!\n”)仅限 针对SIGSEGV执行的信号处理程序B 这需要绕过流入SIG_-DFL的流,或者像处理SIG_-DFL一样处理它 在linux系统中,定义的信号处理程序只是一个伪引用,如#define SIG_DFL((signandler_
nohup
使用SIG\u IGN忽略SIGHUP。
对于信号主机
,可能会发生许多情况
printf(“SIGSEGV!\n”)代码>仅限
#define SIG_DFL((signandler_t)0)
。我已经知道了直接使用SIG_-IGN、SIG_-DFL或SIG_-ERR的机制。但是,信号处理程序是否必须在某个类中进行组织并作为一个系列执行
请看下面的代码,它在没有OOP概念的情况下更详细地表达了我的问题
void my_sigsegv_handler (int signo);
...
struct sigaction sa_sigsegv;
sa_sigsegv.sa_handler = my_sigsegv_handler;
sa_sigsegv.sa_flags = 0;
sigaction(SIGSEGV, &sa_sigsegv, 0);
...
void my_sigsegv_handler (int signo) {
... (handle SIGSEGV as my wish which must be executed) ...
// unfortunately, my code can not handle it correctly...
// so, I want to perform printing errors into stdin without
// returning back into the flow which has caused errors.
exit(-1);
}
当然,将SIG_IGN指定到SIGSEGV中并不是我想要的。
只是,这段代码是一个解释我想做的事情的例子
我真正想知道的问题是,在上述处理程序代码之后,如何实现可以像SIG_DFL、SIG_IGN或SIG_ERR那样工作的处理程序???不允许在信号处理程序中做很多事情,包括不允许调用库函数。所以
printf
将被排除在外。@Boperson是的,我很清楚你在说什么。确切地说,处理器内部有非常严格的要求。但我问题的重点不是这个。通过结合使用pthread和sigwait,将流转移到严格区域之外,可以克服这个问题。然而,我无法理解如何在自己的处理程序中实现SIG_-IGN或SIG_-DFL。这是我真正想要的。不允许您在信号处理程序中做很多事情,包括不允许调用库函数。所以printf
将被排除在外。@Boperson是的,我很清楚你在说什么。确切地说,处理器内部有非常严格的要求。但我问题的重点不是这个。通过结合使用pthread和sigwait,将流转移到严格区域之外,可以克服这个问题。然而,我无法理解如何在自己的处理程序中实现SIG_-IGN或SIG_-DFL。这是我真正想要的。
void my_sigsegv_handler (int signo);
...
struct sigaction sa_sigsegv;
sa_sigsegv.sa_handler = my_sigsegv_handler;
sa_sigsegv.sa_flags = 0;
sigaction(SIGSEGV, &sa_sigsegv, 0);
...
void my_sigsegv_handler (int signo) {
... (handle SIGSEGV as my wish which must be executed) ...
// unfortunately, my code can not handle it correctly...
// so, I want to perform printing errors into stdin without
// returning back into the flow which has caused errors.
exit(-1);
}