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!題目是這樣的 ...