我想了解爲什麼調用寫入內存保護區域時不會觸發sigsegv
。請看例子:在受保護的內存區域寫入()不會觸發sigsegv,但標準訪問確實
void *map_addr;
unsigned long addr;
map_addr = (void *)mmap(NULL, 0x4000, PROT_READ_WRITE, MAP_PRIVATE, fd, 0);
mprotect(map_addr, 0x4000, PROT_NONE);
addr = (unsigned long)map_addr;
// case 1:
*(volatile int*)(addr); // sigsegv sent
// case 2:
write(STDOUT_FILENO, map_addr, size); // sigsegv NOT sent
而是發送sigsegv
的,在這種情況下寫返回-1
並設置errno=EFAULT
。爲什麼寫有這種行爲?我會想象寫會嘗試從地址讀取,這會產生sigsegv故障,但顯然不是這種情況。
請提供標準的引用它需要通過訪問未定義行爲SIGSEGV。你有沒有檢查機器碼?它執行了嗎?調試器說什麼? – Olaf
@Olaf Case 1按預期執行並輸入SIGSEGV的處理程序。如果我運行情況2,我不輸入處理程序,並且寫入只是返回-1,指定errno中的'EFAULT',所以在情況2下沒有崩潰。 至於參考,我只是假設和I/O on保護內存生成sigsegv –
@Olaf什麼標準? linux標準? – melpomene