在linux中,mprotect()函式可以用來修改一段指定記憶體區域的保護屬性。
函式原型如下:
#include #include int mprotect(const void *start, size_t len, int prot);
mprotect()函式把自start開始的、長度為len的記憶體區的保護屬性修改為prot指定的值。
prot可以取以下幾個值,並且可以用「|」將幾個屬性合起來使用:
1)prot_read:表示記憶體段內的內容可寫;
2)prot_write:表示記憶體段內的內容可讀;
3)prot_exec:表示記憶體段中的內容可執行;
4)prot_none:表示記憶體段中的內容根本沒法訪問。
需要指出的是,指定的記憶體區間必須包含整個記憶體頁(4k)。區間開始的位址start必須是乙個記憶體頁的起始位址,並且區間長度len必須是頁大小的整數倍。
如果執行成功,則返回0;如果執行失敗,則返回-1,並且設定errno變數,說明具體因為什麼原因造成呼叫失敗。錯誤的原因主要有以下幾個:
1)eacces
該記憶體不能設定為相應許可權。這是可能發生的,比如,如果你 mmap(2) 對映乙個檔案為唯讀的,接著使用 mprotect() 標誌為 prot_write。2)einval
start 不是乙個有效的指標,指向的不是某個記憶體頁的開頭。3)enomem
核心內部的結構體無法分配。4)enomem
程序的位址空間在區間 [start, start+len] 範圍內是無效,或者有乙個或多個記憶體頁沒有對映。如果呼叫程序記憶體訪問行為侵犯了這些設定的保護屬性,核心會為該程序產生 sigse** (segmentation fault,段錯誤)訊號,並且終止該程序。
linux程式設計之mprotect
mmap 的第三個引數指定對記憶體區域的保護,由標記讀 寫 執行許可權的 prot read prot write 和 prot exec 按位與操作獲得,或者是限制沒有訪問許可權的 prot none。如果程式嘗試在不允許這些許可權的本地記憶體上操作,它將被 sigsegv 訊號 segmenta...
MATLAB中fopen fprintf函式的用法
matlab中fopen函式在指定檔案開啟的例項如下 1 fopen 開啟檔案,賦予檔案代號。語法1 fid fopen filename,permission 用指定的方式開啟檔案 fid n n是正整數 表示檔案開啟成功,檔案代號是n.fid 1 表示檔案開啟不成功。fid在此次檔案關閉前總是有...
postgresql中COALESCE 函式技巧
場景 存在乙個使用者白名單表,提供了此使用者的使用者名稱和地區資訊,判斷此使用者是否在此白名單表中。如 姓名 白名單地區 張三 中國,美國 則可使用如下語句 select id,user,area list from t white user where user and coalesce area...