#include <iostream>
#include <sys/mman.h>
#include <unistd.h>
void signal_handler(int signal) {
using namespace std;
cout << "WE GET SIGNAL!" << endl;
exit(0);
}
int main() {
using namespace std;
int over_9000 = 9001;
signal(SIGSEGV, signal_handler);
int* mem_location = (int*)mmap(nullptr, getpagesize(),
PROT_READ, MAP_ANON | MAP_PRIVATE, -1, 0);
int value = *((int*)0x20); // This sends sig segv as expected
*(mem_location) = over_9000; // This sends something else?
}
在上面的程序中,試圖讀取0x20
發送SIGSEGV
如預期 - 其中信號處理程序捕獲。但是當我用映射頁面嘗試同樣的事情時,它不會發送SIGSEGV
?它會發送其他內容並退出代碼爲138
的應用程序。爲什麼沒有映射的頁面發送sigsegv?
調試器說,它是一個EXEC_BAD_ACCESS
如預期的,但似乎並沒有發送可捕獲的信號。我究竟做錯了什麼?
另外:(奧斯克斯小牛隊如果這有所作爲)。
假設正確的標題等,它在這裏產生一個SIGSEGV。也許你會生成一個自包含的測試用例,人們可以採取這些測試用例,編譯並重現。 – PlasmaHH
已更新的答案。而且還沒有在我身邊工作。 – sircodesalot
爲什麼有人會投票關閉這個?它顯示了試圖提出一個好問題的嘗試。如果需要更多信息,請詢問! –