跳转到内容

C 编程/POSIX 参考/sys/mman.h/mprotect

来自 Wikibooks,开放的书籍,开放的世界

在类似 Unix 的操作系统中,mprotect() 是一个 POSIX 系统调用,用于控制内存保护。它设置内存映射的保护。mprotect 函数更改由 prot 指定的访问保护。
在 'mprotect' 这个词中,'m' 代表内存,'protect' 代表保护,所以 mprotect 基本上代表内存保护。mprotect() 是一种保护类型的函数。它的工作原理基于 prot。Prot 只是一个参数。mprotect 提供了对 prot 指定的访问保护。Prot 是决定允许哪种访问类型的参数。访问可以是只读、写入、执行,甚至是一些组合。但是,参数 prot 的参数强制设置为 PROT_READ 或者 PROT_READ、PROT_EXEC 和 PROT_WRITE 中的一个或多个。对未由 prot 指定的访问也允许;但 PROT_WRITE 和 PROT_NONE 的情况有所不同。当未设置 PROT_WRITE 时,不允许写入成功。此外,当单独设置 PROT_NONE 而没有其他设置时,不允许访问。

以下 prot 的值可以实现:- PROT_NONE、PROT_READ、PROT_WRITE,以及 PROT_READ 和 PROT_WRITE 的按位或组合

如果 mprotect 失败,并且错误不是 EINVAL,则表示保护范围(addr,addr + len)发生了更改。

头文件

[编辑 | 编辑源代码]

要使用 mprotect 函数,需要包含 'sys/mman.h' 头文件。

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

addr : 将开始保护的内存范围的起始地址。
len  : 受保护的地址范围的长度,以字节为单位。
prot : 保护标志,可以是 PROT_NONE 或者 PROT_READ、PROT_WRITE 和 PROT_EXEC 的按位或组合。

每个保护标志都有特殊的含义

  • PROT_NONE  : 内存无法以任何方式访问。
  • PROT_READ  : 可以读取内存中的数据。
  • PROT_WRITE : 可以通过写入修改数据。
  • PROT_EXEC  : 可以执行内存中的数据。

以下是由于以下原因导致 mprotect() 函数失败的常见错误:-

  • EACCES
  • EAGAIN
  • EINVAL
  • ENOMEM
  • ENOMEM
  • ENOTSUP

返回值

[编辑 | 编辑源代码]

成功完成时,mprotect() 返回 0。否则,返回 -1 并设置 errno 以指示错误。

[编辑 | 编辑源代码]
华夏公益教科书