在我的一個程序中,當試圖訪問無法獲取內存頁的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