提出記憶體對映i/o概念的根本原因是為了解決讀寫檔案的效率問題。如果乙個程式需要大量的磁碟io時,記憶體對映io往往能夠使程式執行的速度有很大地提高,記憶體對映i/o也可以算作是一種空間換時間的機制。
linux使用mmap函式建立乙個磁碟檔案到記憶體的對映,函式原型為:
#include
void
mmap
(void
*addr,size_t len,
int prot,
int flag,
int filedes,off_t off)
;
引數說明:
應用例項:
功能說明:該對映區中讀取檔案的內容,下面例項演示了建立乙個記憶體對映,並從該對映區中讀取檔案的內容, 將讀入的內容輸出到螢幕上。
#include
#include
#include
#include
#include
#include
intmain
(void
) fd =
open
("test.txt"
, o_rdonly)
;/* 以唯讀方式開啟檔案 */
if(fd ==-1
)/* 建立乙個記憶體對映,起始位址由系統為使用者選擇,並作為返回值返回
* 建立的對映區的大小為開啟的檔案的大小
* 訪問許可權為唯讀,屬性為不會寫到磁碟,防止對其進行寫的誤操作
*/ buf =
(char*)
mmap
(null
, statbuf.st_size, prot_read, map_private, fd,0)
;if(buf == map_failed)
i =0;
while
(i < statbuf.st_size)
printf
("\n");
if(munmap
(buf, statbuf.st_size)==-
1)close
(fd)
;/* 關閉檔案 */
return0;
}
munmap函式原型:
#include
intmunmap
(caddr_t addr,size_t len)
;
引數說明:
問題描述:同使用read和write函式讀寫一樣,使用記憶體對映的方法同樣無法保證修改的內容及時寫到磁碟上,每次將修改過的記憶體頁面寫回磁碟依賴於系統內部的記憶體換頁機制,因此,如果需要將修改的內容及時回寫,需要呼叫特殊的系統呼叫才可以。
linux使用msync函式將修改過的記憶體頁面寫回到磁碟檔案,函式原型為:
#include
intmsync
(void
*addr,size_t len,
int flags)
;
引數說明:
linux使用mprotect函式更改乙個對映區的許可權:
#include
intmprotect
(void
*addr,size_t len,
int prot)
;
引數說明: IO操作 檔案IO
一 系統呼叫 系統呼叫實際上是作業系統 核心 提供的供使用者使用的介面函式。二 標準io函式和檔案io函式的關係 標準io是c庫內定義的函式,是凌駕於系統之上的,適用於任何的作業系統 檔案io是由linux系統提供的,只能在linux系統中使用,而不可以在其它作業系統中使用。標準io函式可以呼叫檔案...
IO 五 操作檔案AccessFileDemo
public class accessfiledemo 讀取 public static void read throws exception 追加 public static void readwithwrite throws exception 實現向指定位置 插入資料 param filena...
Linux操作檔案
語法 mkdir options dirname p 遞迴建立資料夾 mmode 新建資料夾,並設定資料夾的檔案訪問模式為mode 使用 p選項遞迴的建立wenjian test資料夾。linux下新建檔案的方式有非常多,比如 使用vi新建檔案 使用cp命令拷貝乙個檔案 可是最經常使用的還是使用to...