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

廣告


  

廣告



廣告
© . All rights reserved.