mmp函式(共享記憶體對映)使用方法以及注意事項

2021-10-10 14:05:57 字數 1313 閱讀 4573

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); 建立共享記憶體對映

​ length:共享記憶體對映區的大小。(<= 檔案的實際大小,通常為檔案大小)

​ prot: 共享記憶體對映區的讀寫屬性。prot_read(讀)、prot_write(寫)、prot_read|prot_write(讀寫)

​ flags: 標註共享記憶體的共享屬性。

​ map_shared(共享,會將對映區所做的操作反映到物理裝置(磁碟)上。)

​ map_private(私有,對映區所做的修改不會反映到物理裝置。 )

​ fd: 用於建立共享記憶體對映區的那個檔案的 檔案描述符。

​ offset:預設0,表示對映檔案全部。偏移位置。需是 4k 的整數倍。

返回值:

​ 失敗:map_failed (void*(-1)), errno

int munmap(void *addr, size_t length); 釋放對映區。

addr:mmap 的返回值

length:大小

使用注意事項:

用於建立對映區的檔案大小為 0,實際指定非0大小建立對映區,出 「匯流排錯誤」。

用於建立對映區的檔案大小為 0,實際制定0大小建立對映區, 出 「無效引數」。由1.2條可得,用於對映的檔案必須要有實際大小;

用於建立對映區的檔案讀寫屬性為,唯讀。對映區屬性為 讀、寫。 出 「無效引數」。

建立對映區,需要read許可權。當訪問許可權指定為 「共享」map_shared時, mmap的讀寫許可權,應該 <=檔案的open許可權。 只寫不行。

檔案描述符fd,在mmap建立對映區完成即可關閉。後續訪問檔案,用 位址訪問。

offset 必須是 4096的整數倍。(mmu 對映的最小單位 4k )

對申請的對映區記憶體,不能越界訪問。

munmap用於釋放的 位址,必須是mmap申請返回的位址,若改變位址會造成munmap錯誤。

對映區訪問許可權為 「私有」map_private, 對記憶體所做的所有修改,只在記憶體有效,不會反應到物理磁碟上。

對映區訪問許可權為 「私有」map_private, 只需要open檔案時,有讀許可權,用於建立對映區即可。

mmap函式的最基本(常用)呼叫方式:

1. fd = open("檔名", o_rdwr);

2.mmap

(null

, 有效檔案大小, prot_read|prot_write, map_shared, fd,0)

;

共享記憶體的使用方法

使用共享記憶體的一般步驟 1 獲取共享記憶體的id 2 將共享記憶體對映到本程序虛擬記憶體空間的某個區域 3 不再使用時,接觸對映 4 不需要時,刪除它。注意 建立的共享記憶體是物理記憶體,必須要對映到本程序的記憶體空間才能使用。ipc stat獲得的屬性資訊查詢課本或其他資料 演示 p1傳送資訊給...

使用記憶體檔案對映實現共享記憶體

不使用ipc中的共享記憶體 shm 使用記憶體檔案對映的方式來實現共享記憶體 共享記憶體寫入者 使用檔案記憶體對映進行記憶體共享 include include include include include include include include include include using...

C map對映的使用方法

c map對映的使用方法 今天考試做了道題,用上了map,這是一道提高組聯賽難度的題目,先發題目 1 a b problem dec.c cpp pas description 大家都非常熟悉 a b problem!題目看多了也有審美疲勞,於是我捨棄了,改用 a b problem!題目是這樣的 ...