C++ 导致程序中的segfault不';不要被信号处理器抓住
首先,我要指出这里的操作系统是RTEMS,它是一个开源RTOS,源代码可以在这里找到: 我有一个非常简单的程序,它使用文档中的sigaction调用为SIGSEGV设置信号处理程序(我相信它是受支持的): 我的程序基本上可以归结为:C++ 导致程序中的segfault不';不要被信号处理器抓住,c++,signals,rtems,C++,Signals,Rtems,首先,我要指出这里的操作系统是RTEMS,它是一个开源RTOS,源代码可以在这里找到: 我有一个非常简单的程序,它使用文档中的sigaction调用为SIGSEGV设置信号处理程序(我相信它是受支持的): 我的程序基本上可以归结为: void HandleAndPrintSignal() { printf("I am in the segfault signal handler AND I WILL HANDLE YOUR SIG!!!!\n"); exit(1); } v
void HandleAndPrintSignal()
{
printf("I am in the segfault signal handler AND I WILL HANDLE YOUR SIG!!!!\n");
exit(1);
}
void *POSIX_Init(void *args)
{
printf("BENS BIG NOTE: Initializing Signal Handler\n");
struct sigaction sa;
sa.sa_handler = HandleAndPrintSignal;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_SIGINFO;
if (sigaction (SIGSEGV, &sa, 0)) {
printf("A ERROR OCCURED WITH THIS!");
exit(1);
}
int *p = NULL;
*(p--) = 5; // Causes segfault
}
但是,问题是,当我在程序中导致segfault时,不会调用信号处理程序,而是在
vectors\u init.c
(RTEMS源代码)中调用内核进程来打印堆栈跟踪。要在rtems程序中获得SIGSEGV信号,我需要做什么特殊的事情吗?因此,对这一点的解释是rtems并不像我想象的那样处理信号
有些POSIX信号在硬件级别上确实是例外。例如,SIGSEGV
、SIGBUS
和SIGFPE
。发生这种情况时可能发生的确切语义由POSIX定义,但神奇之处在于架构和特定于BSP的处理程序。由于一般规则是在嵌入式系统中避免这些故障,因此默认操作通常类似于内核堆栈跟踪或其他特定于BSP的代码
一些BSP支持在异常处理程序中安装一个附加项,该附加项将硬件故障传播到软件信号中,但这主要用于在Ada等语言中获取映射到特定于语言的异常处理程序的SIGFPE
一般来说,POSIX信号在嵌入式系统中很少使用,那些源自硬件异常的信号被设计出来并被认为是不可恢复的故障,并且可以使用仅软件的信号
总而言之:为了获得所需的行为,我需要安装映射硬件异常->POSIX信号的代码。RTEMS完全支持POSIX信号处理吗?@JoachimPileborg(据我所知):在第3.3.1.1节中,它指定实现的信号和SIGSEGV。我认为您不会从信号处理程序调用
printf
或exit
。@davidschwartz您可以调用它们,但它们不是异步的,因此这不是一个好的做法。我会在信号处理器工作的时候再处理。@Ben,你为什么说你可以打电话给他们?例如,请参见。