受保护的内存区域上的write()不会触发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错误,但显然不是这种情况.

解决方法:

write是系统调用,因此内存访问发生在内核中,而不是在您的进程中.内核首先检查传递的地址是否对调用进程有效,如果不是,则只返回EFAULT.

(不过我不知道为什么它会以这种方式工作.)

上一篇:实现原理讲解!Android面试中常问的MMAP到底是啥东东?使用指南


下一篇:WCF 已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性