程序間通訊 mmap

2021-10-25 15:24:35 字數 4007 閱讀 9563

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 寫資料端程序 ...