void *mmap(void addr, size_t length, int prot, int flags, int fd, off_t offset); 建立共享記憶體對映
引數:addr:指定對映區的首位址。通常傳null,表示讓系統自動分配
length:共享記憶體對映區的大小。(<= 檔案的實際大小)
prot:共享記憶體對映區的讀寫屬性。prot_read、prot_write、prot_read|prot_write
flags:標註共享記憶體的共享屬性。map_shared、map_private。shared意思是修改會反映到磁碟上, private表示修改不反映到磁碟上
fd: 用於建立共享記憶體對映區的那個檔案的 檔案描述符。
offset:預設0,表示對映檔案全部。偏移位置。需是 4k 的整數倍。
返回值:成功:對映區的首位址。失敗:map_failed (void(-1)), errno
int munmap(void *addr, size_t length); 釋放對映區。
引數:addr:mmap 的返回值
length:大小
注意事項:
1.建立對映區的過程中,隱含著一次對對映檔案的讀操作
2.當map_shared時,要求:對映區的許可權應該<=檔案開啟的許可權(出於對對映區的保護)。而map_private則無所謂,因為mmap中的許可權是對記憶體的限制
3.對映區的釋放與檔案關閉無關。只要對映建立成功,檔案可以立即關閉
4.特別注意,當對映檔案大小為0時,不能建立對映區。所以:用於對映的檔案必須要有實際大小!!mmap使用時常常會出現匯流排錯誤,通常是由於共享檔案儲存空間大小引起的。如,400位元組大小的檔案,在簡歷對映區時,offset4096位元組,則會報出匯流排錯誤
5.munmap傳入的位址一定是mmap返回的位址。堅決杜絕指標++操作
6.檔案偏移量必須為4k的整數倍
7.mmap建立對映區出錯概率非常高,一定要檢查返回值,確保對映區建立成功再進行後續操作。
#include
#include
#include
#include
#include
#include
#include
#include
intmain
(int argc,
char
const
*ar**)
strcpy
(mem,
"hello world");
//close(fd); /如果檔案描述符先關閉,對mmap對映沒有影響,因為對映通道已經通了
//mem++; //不能改變位址,否則無法釋放
//釋放
int ret =
munmap
(mem,20)
;if(ret <0)
close
(fd)
;return0;
}
//mmap_fork.c
#include
#include
#include
#include
#include
#include
#include
intmain
(int argc,
char
const
*ar**)
//fork子程序
pid_t pid =
fork()
;//父程序和子程序交替修改資料
if(pid <0)
else
if(pid ==0)
else
if(pid >0)
int ret =
munmap
(mem,4)
;if(ret <0)
close
(fd)
;return0;
}
//mmpa_anon.c
#include
#include
#include
#include
#include
#include
#include
intmain
(int argc,
char
const
*ar**)
//fork子程序
pid_t pid =
fork()
;//父程序和子程序交替修改資料
if(pid <0)
else
if(pid ==0)
else
if(pid >0)
int ret =
munmap
(mem,4)
;if(ret <0)
return0;
}
//mmap_read.c
#include
#include
#include
#include
#include
#include
#include
typedef
struct student
student;
intmain
(int argc,
char
const
*ar**)
file
int fd =
open
(ar**[1]
, o_rdwr,
0666);
int length =
sizeof
(student)
;student *stu =
mmap
(null
, length, prot_read | prot_write, map_shared, fd,0)
;if(stu == map_failed)
//3.修改記憶體資料, read
while(1
)//4.釋放對映區和關閉描述符
int ret =
munmap
(stu, length);if
(ret <0)
close
(fd)
;return0;
}
//mmap_write.c
#include
#include
#include
#include
#include
#include
#include
typedef
struct student
student;
intmain
(int argc,
char
const
*ar**)
file
int fd =
open
(ar**[1]
, o_creat | o_rdwr | o_trunc,
0666);
int length =
sizeof
(student)
;ftruncate
(fd, length)
;student *stu =
mmap
(null
, length, prot_read | prot_write, map_shared, fd,0)
;if(stu == map_failed)
//3.修改記憶體資料, write
int num =1;
while(1
)//4.釋放對映區和關閉描述符
int ret =
munmap
(stu, length);if
(ret <0)
close
(fd)
;return0;
}
Linux 程序間通訊 mmap
讀操作 include include include include include include include struct ad struct ad ptr intmain int argc,char ar while 1 printf n for int i 0 i 5 i printf...
非血緣關係程序間mmap通訊
建立乙個讀檔案 mmap r.c include include include include include include include struct stu void sys err char str intmain int argc,char ar fd open ar 1 o rdon...
程序間通訊之記憶體對映 mmap記憶體對映
讀資料端程序 mmanp r.c include include include include include include define len 0x1000 int main close fd while 1 close fd munmap addr,len return 0 寫資料端程序 ...