在我的一个程序中,当试图访问无法获取内存页的mmap-ed内存位置时(因为底层物理内存用完)并且程序崩溃,我会点击“SIGBUS” SIGBUS。在linux中处理SIGBUS
我计划注册一个SIGBUG信号处理程序以避免崩溃。但是,我不想从SIGBUS处理程序退出()该程序。我试图看看是否有任何优雅地报告ENOMEM并继续与其他工作的计划。
我可以做以下吗?代码如下所示:
mem_p->head = MY_HEAD_MAGIC; /* this line could trigger SIGBUS */
if (sigbus_happened) {
sigbus_happened = FALSE;
do_something_else();
return ENOMEM;
}
和信号处理程序:
void signal_handler (int sig)
{
if (sig == SIGBUS)
sigbus_happened = TRUE;
}
将在上述工作并没有崩溃?
谢谢。
简答:不。只要确保你没有对mmapp()ed页面进行处理即可,并且不要依赖任何欺骗手段。真。 – wildplasser
@wildplasser如果你使用MAP_NORESERVE SIGBUS是可能的,当系统没有足够的内存+交换(尽管如果你使用所有的交换你有比SIGBUS更大的问题) – Eloff