使用mmap將檔案對映到虛擬位址空間進行操作

2021-10-02 13:05:52 字數 3731 閱讀 6710

**獲取檔案的元資料

linux od命令用於輸出檔案內容。

void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);

flags:

fd:-1

offset:0

返回值:

int munmap(void *addr, size_t length);

返回值:

#include

#include

#include

#include

#include

#include

intmain

(int argc,

char

*ar**)

//建立對映

void

*p=mmap

(null,6

,\ prot_read|prot_write,

map_shared,fd,0)

;if(p==map_failed)

printf

("success...\n");

//關閉檔案

close

(fd)

;//對記憶體的操作

int*q=

(int

*)p;

q[0]=

0x30313233

;//解除對映

檔案的元資料就是檔案的屬性,使用

ls -l [檔名]

#檢視

#include 

#include

#include

int stat(const char *path, struct stat *buf)

;功能:獲取檔案的狀態資訊

引數:path:指定了檔案的名字

buf:將檔案的狀態資訊儲存到buf指定的空間裡。

返回值:

-1 錯誤 errno被設定

0 成功

struct stat

;

#include 

#include

struct passwd *getpwuid(uid_t uid)

;功能:獲取使用者的資訊

引數:uid:指定使用者的uid

返回值:

返回乙個指向struct passwd結構體的指標

null 找不到這個使用者的資訊或錯誤產生 如果是產生錯誤,errno被設定

/etc/passwd檔案的內容

這個檔案裡存放的是系統的所有使用者的資訊。

struct passwd 

;

getgrnam(3)

getgrgid(3)

#include

#include

struct group *getgrgid(gid_t gid)

;功能:獲取一條組資訊

引數:gid:指定的組id

返回值:

返回乙個指向struct group結構體的指標

null 找不到這個組的資訊或錯誤產生 如果是產生錯誤,errno被設定.

struct group

;

ctime(3)

#include

char *ctime(const time_t *timep)

;功能:將長整型的時間轉換為字串格式

引數:timep:長整型的時間

返回值:

null 錯誤

字串

#include

#include

#include

#include

#include

#include

#include

intmain

(int argc,

char

*ar**)

printf

("size:%ld\n"

,sbuf.st_size)

;printf

("hard links:%d\n"

,\ sbuf.st_nlink)

;printf

("inode number:%lu\n"

,\ sbuf.st_ino)

;//printf("uid:%d\n",sbuf.st_uid);

p=getpwuid

(sbuf.st_uid);if

(p==

null

)printf

("username:%s\n"

,p->pw_name)

;//printf("gid:%d\n",sbuf.st_gid);

struct group *q=\

getgrgid

(sbuf.st_gid)

;printf

("group name:%s\n"

,q->gr_name)

;char

*st=

ctime

(&sbuf.st_atime)

;printf

("time:%s\n"

,st)

;printf

("mode:%o\n"

,sbuf.st_mode)

;#if 0if(

s_isreg

(sbuf.st_mode)

)printf

("-");

if(s_isdir

(sbuf.st_mode)

)printf

("d");

printf

("\n");

#endif

switch

(sbuf.st_mode&s_ifmt)

printf

("\n");

//列印出屬主的許可權

將檔案對映到記憶體

mmap的好處 和read write系統呼叫相比不會產生無關的副本 如果不出錯就不會有系統呼叫 操作環境切換等開銷 不再需要lseek呼叫。mmap的壞處 記憶體對映總是pagesize的整數倍,會浪費一定的記憶體 如果要對映的內容非常大的時候可能找不到連續的線性位址空間 建立並維護核心相關資料結...

虛擬記憶體 mmap檔案記憶體對映

記憶體對映是虛擬記憶體系統的重要特性,即虛擬記憶體中的虛擬頁 virtual page 總是對應於磁碟上的物理頁 physical page 記憶體對映技術,可以使得使用檔案來初始化虛擬記憶體的內容 只在第一次引用到相應記憶體時,才會快取進主存 linux程序中可以使用mmap函式,建立乙個虛擬記憶...

iOS將大檔案對映到記憶體 讀取大檔案

from 2012年10月23日 在 中國區gps偏移糾正 適用於google地圖 一文中曾讀取乙個78m的大資料檔案,一開始採用了nsdata的datawithcontentsoffile 方法。不少人反饋說如果直接使用,將會耗盡ios的記憶體。其實這個是可以改善的。nsdata還有乙個api i...