Memory Map Linux 儲存對映IO

2021-07-15 05:21:16 字數 1799 閱讀 6001

本文主要總結自unix環境高階程式設計以及redhat6.5系統man函式

#include 

void *mmap(void *addr,//指定對映區的起始位址。通常設定為0,由系統選擇該對映區起始位址

size_t len, //對映的位元組數

int prot, //對對映儲存區的保護要求

int flag, //

int filedes, //被對映檔案的描述符

off_t off) //要對映位元組在檔案中的起始偏移量

prot

說明prot_read

對映區可讀

prot_write

對映區可寫

prot_exec

對映區可執行

prot_none

對映區不可訪問

prot引數可以是上述4中許可權的任意組合的按位或,並且對指定對映儲存區的的保護要求不能超過檔案open模式訪問許可權(如果檔案是唯讀開啟的,那麼對對映儲存區就不能指定prot_write)。

* flag引數詳細說明

off和addr的值(如果指定了map_fixed)通常應當是系統虛存頁長度的倍數。虛存頁長可用帶引數_scpagesize或_scpage_size的sysconf函式得到。因為off和addr常常指定為0,所以這種要求一般並不重要。

#include 

int mprotect(void *addr, //必須是系統頁長度的整數倍

size_t len,

int prot); //和mmap中的prot引數一樣

//返回值:若成功則返回0,出錯返回-1

#include 

int msync(void *addr, //必須與頁邊界對齊

size_t len,

int flags);

//返回值:若成功則返回0,若出錯則返回-1

#include 

int munmap(caddr_t addr, size_t len);

//返回值:若成功則返回0,若出錯則返回-1

用儲存對映io複製乙個檔案

#include "apue.h"

#include

#include

int main(int argc, char *argv)

程式說明

1. 程式首先開啟兩個檔案,然後呼叫fstat得到輸入檔案的長度,在為輸入檔案呼叫mmap的設定輸出檔案長度時都需要使用輸入檔案長度。呼叫lseek,然後寫乙個自己以設定輸出檔案的長度。如果不設定輸出檔案的長度,則對輸出檔案呼叫mmap也可以,但是對相關儲存區的第一次引用會纏上sigbus。也可以使用ftruncate函式來設定輸出檔案的長度,但是並非所有作業系統都支援該函式擴充檔案長度。

2. 然後對每個檔案呼叫mmap將檔案對映到儲存區上,最後呼叫memcpy將輸入緩衝區的內容複製到輸出緩衝區。在從輸入緩衝區(src)取資料位元組時,核心自動讀輸入檔案;在將資料存入輸出緩衝區(dst)時,核心自動將資料寫到輸出檔案中。

3. 特別的:資料被寫被寫入檔案的確切時間依賴於系統的業管理演算法。某些系統設定了守護進場,在系統執行期間,它」慢條斯理「地將髒頁寫到磁碟上。如果想要確保資料安全的寫到檔案中,則需要在程序終止前以ms_sync標誌呼叫msync

等保03 等保測評

差分整改 重點 等級測評 等保專案交付存在的問題 等級保護工作角色分工 等級保護整體流程介紹 各個階段產出的文件 定級備案過程及工作內容 依據定級指南確定目標系統的安全保護等級,同時也是對安全保護等級確定過程的說明。1.目標業務系統描述 系統的基本功能 系統的責任部門 系統的網路結構及部署情況 採取...

sp(SharedPreferences)儲存物件

其實主要是利用物件輸出流 objectoutputstream 將物件轉換為二進位制資料,然後將二進位制資料轉換為字串,再利用sp儲存字串即可。核心 儲存物件 針對複雜型別儲存 物件 注意 要儲存的物件必須序列化 param key param object public void setobjec...

上海鎮保城保四金比例

quote 本文 鎮保和城保的區別 a.繳費基數不同 如果是城保,那麼就應該按第乙個月的全部稅前實際工資來算 並非試用期工資總額 當然這是相對畢業生而言的,如果是已經工作過的人則按照去年你的月平均工資來算,但 請注意很多公司並不是按照法律規定的繳費基數給的,通常會給乙個固定的相對較低的基 數 如20...