跳轉到內容

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 以指示錯誤。

[編輯 | 編輯原始碼]
華夏公益教科書