Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 导致程序中的segfault不';不要被信号处理器抓住_C++_Signals_Rtems - Fatal编程技术网

C++ 导致程序中的segfault不';不要被信号处理器抓住

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

首先,我要指出这里的操作系统是RTEMS,它是一个开源RTOS,源代码可以在这里找到:

我有一个非常简单的程序,它使用文档中的sigaction调用为SIGSEGV设置信号处理程序(我相信它是受支持的):

我的程序基本上可以归结为:

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,你为什么说你可以打电话给他们?例如,请参见。