搬 Linux C 記憶體對映方式讀寫檔案

2021-09-23 15:29:34 字數 2243 閱讀 6227

5181人閱讀

2014-03-01 15:12:08

記憶體對映就是將磁碟上的檔案對映到系統記憶體中,對記憶體的修改可以同步到對磁碟檔案的修改。可以對大資料檔案處理,並且可以提高檔案的讀寫速度。

#include#include#include#include#include#define numreconds 100

typedef struct

recond;

int main(void)

fclose(fp);

//使用傳統方式修改檔案內容

fp = fopen("recond.dat","r+");

//獲得要修改檔案的位置

fseek(fp,43*sizeof(recond),seek_set);

fread(&recond,sizeof(recond),1,fp);

recond.inum = 143;

sprintf(recond.sname,"recond-%d",recond.inum);

fwrite(&recond,sizeof(recond),1,fp);

fclose(fp);

//使用記憶體對映的方式開啟檔案,修改檔案記憶體

//注意這裡是open開啟不是fopen!!!!

f = open("recond.dat",o_rdwr);

//獲得磁碟檔案的記憶體對映

//將修改同步到磁碟中

//關閉記憶體對映

close(f);

exit(0);

}

void *mmap(void *start, size_t length, int prot, int flags,

int fd, off_t offset);

引數說明:

length:對映區的長度。//長度單位是 以位元組為單位,不足一記憶體頁按一記憶體頁處理

prot:期望的記憶體保護標誌,不能與檔案的開啟模式衝突。是以下的某個值,可以通過or運算合理地組合在一起

prot_exec //頁內容可以被執行

prot_read //頁內容可以被讀取

prot_write //頁可以被寫入    

prot_none //頁不可訪問

flags:指定對映物件的型別,對映選項和對映頁是否可以共享。它的值可以是乙個或者多個以下位的組合體

map_fixed //使用指定的對映起始位址,如果由start和len引數指定的記憶體區重疊於現存    對映空間,重疊部分將會被丟棄。如果指定的起始位址不可用,操作將會失敗。並且起始地 址必須落在頁的邊界上。

map_shared //與其它所有對映這個物件的程序共享對映空間。對共享區的寫入,相當於輸出到檔案。直到msync()或者munmap()被呼叫,檔案實際上不會被更新。

map_private //建立乙個寫入時拷貝的私有對映。記憶體區域的寫入不會影響到原檔案。這個標誌和以上標誌是互斥的,只能使用其中乙個。

map_denywrite //這個標誌被忽略。

map_executable //同上

fd:有效的檔案描述詞。一般是由open()函式返回,其值也可以設定為-1,此時需要指定flags引數中的map_anon,表明進行的是匿名對映。

offset:被對映物件內容的起點。

int msync ( void * addr, size_t len, int flags)

程序在對映空間的對共享內容的改變並不直接寫回到磁碟檔案中,往往在呼叫munmap()後才執行該操作。

可以通過呼叫msync()函式來實現磁碟檔案內容與共享記憶體區中的內容一致,即同步操作.

len:對映空間的大小;

flags:重新整理的引數設定,可以取值ms_async/ ms_sync/ ms_invalidate

其中:取值為ms_async(非同步)時,呼叫會立即返回,不等到更新的完成;

取值為ms_sync(同步)時,呼叫會等到更新完成之後返回;

取ms_invalidate(通知使用該共享區域的程序,資料已經改變)時,在共享內容更改之後,使得檔案的其他對映失效,從而使得共享該檔案的其他程序去重新獲取最新值;

int munmap(void *start,size_t length);

函式說明 munmap()用來取消引數start所指的對映記憶體起始位址,引數length則是欲取消的記憶體大小。

Python記憶體對映檔案讀寫方式

我就廢話不多說了,還是直接看 吧!import os import time import mmap filename test.txt 如果不存在,建立。if not os.path.exists filename open filename,w print os.path.isdir filen...

LINUX 記憶體對映方式

記憶體對映結構 1 32位位址線定址4g的記憶體空間,其中0 3g為使用者程式所獨有,3g 4g為核心占有。2 struct page 整個物理內存在初始化時,每個4kb頁面生成乙個對應的struct page結構,這個page結構就獨一無二的代表這個物理記憶體頁面,並存放在mem map全域性陣列...

檔案讀寫,共享記憶體和mmap記憶體對映

1傳統的檔案讀寫,需要將磁碟上的資料copy到檔案緩衝區 為了避免對磁碟的反覆讀寫 都在核心空間,然後找到檔案的inode,先去檔案緩衝區中找有沒有這個檔案,如果沒有的話,到磁碟再到檔案緩衝區。2.共享記憶體是兩個程序同時開闢出一塊虛擬位址空間,對映到同一塊物理記憶體上 3.記憶體對映是虛擬位址上直...