mprotect() - Unix,Linux 系统调用
Tutorials Point


  Unix 初学者指南
  Unix Shell 编程
  高级 Unix
  Unix 有用参考
  Unix 有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考     讨论论坛     关于TP  

mprotect() - Unix,Linux 系统调用


previous next AddThis Social Bookmark Button

广告

名称

mprotect - 控制允许访问内存区域

语法

#include <sys/mman.h> 

int mprotect(const void *addr, size_t len, int prot);

描述

函数mprotect() 指定了包含区间 [addr,addr+len-1] 的部分或全部的内存页面的所需保护。如果访问被给定的保护所禁止,则程序会收到SIGSEGV

prot 是以下值的按位或

标签描述
PROT_NONE 内存完全无法访问。
PROT_READ 内存可读。
PROT_WRITE 内存可写。
PROT_EXEC 内存可以包含执行代码。
新的保护将替换任何现有的保护。例如,如果内存之前被标记为PROT_READ,然后用prot PROT_WRITE调用mprotect(),它将不再可读。

返回值

成功时,mprotect() 返回零。出错时,返回 -1,并且errno 被相应地设置。

错误

标签描述
EACCES 内存无法获得指定的访问权限。例如,如果您使用mmap(2) 映射了一个您只有只读访问权限的文件,然后要求mprotect() 将其标记为PROT_WRITE,就会发生这种情况。
EFAULT 无法访问内存。
EINVAL addr 不是有效的指针,或者不是 PAGESIZE 的倍数。
ENOMEM 无法分配内部内核结构。或者:区间 [addr, addr+len] 中的地址对于进程的地址空间无效,或者指定了一个或多个未映射的页面。

示例

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/mman.h>

#include <limits.h> /* for PAGESIZE */ #ifndef PAGESIZE #define PAGESIZE 4096 #endif

int main(void) { char *p; char c;

/* Allocate a buffer; it will have the default protection of PROT_READ|PROT_WRITE. */ p = malloc(1024+PAGESIZE-1); if (!p) { perror("Couldn’t malloc(1024)"); exit(errno); }

/* Align to a multiple of PAGESIZE, assumed to be a power of two */ p = (char *)(((int) p + PAGESIZE-1) & ~(PAGESIZE-1));

c = p[666]; /* Read; ok */ p[666] = 42; /* Write; ok */

/* Mark the buffer read-only. */ if (mprotect(p, 1024, PROT_READ)) { perror("Couldn’t mprotect"); exit(errno); }

c = p[666]; /* Read; ok */ p[666] = 42; /* Write; program dies on SIGSEGV */

exit(0); }

符合标准

SVr4,POSIX.1-2001。POSIX 规定mprotect() 只能用于从mmap(2) 获得的内存区域。

备注

在 Linux 上,始终可以对进程地址空间中的任何地址(内核 vsyscall 区域除外)调用mprotect()。特别是,它可以用来将现有的代码映射更改为可写。

PROT_EXEC 是否具有与PROT_READ不同的效果取决于体系结构和内核版本。

参见



previous next Printer Friendly

广告


  

广告



广告