mmap共享記憶體對映實戰

2021-10-11 15:28:26 字數 2585 閱讀 5272

mmap函式用於申請一段記憶體空間。我們可以將這一段記憶體空間作為程序之間通訊的共享記憶體也可以將檔案直接對映其中。munmap函式則釋放由mmap函式建立的這段記憶體空間。函式定義如下:

#include

void

*mmap

(void

*addr, size_t length,

int prot,

int flags,

int fd, off_t offset)

;int

munmap

(void

*addr, size_t length)

;

mmap函式的引數:

void

*mmap

(void

*addr, size_t length,

int prot,

int flags,

int fd, off_t offset)

;

引數1:對映區的首位址,一般為null(由核心自己分配)

引數2:共享記憶體對映區的大小(小於等於對映檔案的大小)

引數3:共享記憶體對映區的讀寫屬性。prot_read,prot_write

引數4:標記對映區的共享屬性。map_share,map_private

引數5:建立共享記憶體對映區檔案的檔案描述符

引數6:偏移位置,需要時4k的整數倍(mmu的大小是4k),預設設定為0,表示對映檔案的全部。

返回值:

成功:對映區的首位址

失敗:map_failed

munmap函式:

int

munmap

(void

*addr, size_t length)

;

返回值:

成功:返回0

失敗:返回-1

mmap通訊的特點:

1.可以實現無血緣關係程序之間的通訊

2.資料可以重複讀取

案例一父子程序之間利用mmap實現通訊。

#include

#include

#include

#include

#include

#include

#include

#define num 1024

void

sys_err

(const

char

*str)

intmain()

ftruncate

(fd,num)

;//拓展檔案的大小

p=mmap

(null

,num,prot_read|prot_write,map_shared,fd,0)

;if(p==map_failed)

//建立對映區完畢後,即可關閉檔案

close

(fd)

; pid=

fork()

;//fork建立子程序

if(pid==0)

//子程序

else

if(pid>0)

return0;

}}

案例二:

利用mmap函式實現無血緣程序之間的通訊

讀端:

#include

#include

#include

#include

#include

#include

//讀端

struct person

;int

main()

close

(fd)

;while(1

)munmap

(p,sizeof

(person));

return0;

}

2.寫端

#include

#include

#include

#include

#include

#include

struct person

;int

main()

;int num=

sizeof

(person)

;//共享對映區的大小

fd=open

("./12_mmp.txt"

,o_rdwr|o_creat,

0644);

if(fd==-1

)ftruncate

(fd,num)

;//拓展檔案的大小

p=mmap

(null

,num,prot_write|prot_read,map_shared,fd,0)

;//建立共享對映區

if(p==map_failed)

close

(fd)

;//建立共享對映區後就可以關閉檔案描述符

while(1

)munmap

(p,num)

;return0;

}

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

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

mmap記憶體對映

記憶體對映是個很有用,也很有意思的思想。我們都知道作業系統分為使用者態和核心態,使用者態是不能直接和物理裝置打交道的,如果想把硬碟的一塊區域讀到使用者態,則需要兩次拷貝 硬碟 核心 使用者 但是記憶體對映的設計只需要發生一次的拷貝,大大的提高了讀取資料的效率。那麼記憶體對映的原理和核心是如何實現的呢...

記憶體對映mmap

應用與裝置驅動之間資料互動,很多時候都使用copy to user與copy from user。但如果在追求高效能的驅動上,這種拷貝顯然不是最佳的做法。linux核心提供了一種記憶體對映的機制,它主要完成將裝置的位址空間對映到使用者空間或者直接使用使用者空間中的位址,這樣做的目的顯然是為了提公升系...