munmap函数的使用方式:

int munmap(void *addr,size_t length);        释放映射区

addr:mmap 的返回值

length:大小

使用注意事项:

1.用于创建映射区的文件大小为0,实际指定非0大小创建映射区,出“总线错误”。

2.用于创建映射区的文件大小为0,实际控制0大小创建映射区,出“无效参数”。

3.用于创建映射区的文件读写属性为,只读。映射区属性为 读、写。出“无效参数”。

4.创建映射区,需要read权限。mmap的读写权限,应该<=文件的open权限。只写不行。

5.文件描述fd,在mmap创建映射区完成即可关闭。后续访问文件,用地址访问。

6.offset必须是4096的整数倍。(MMU映射的最小单位4k)

7.对申请的映射区内存,不能越界访问。

8.munmap用于释放的 地址,必须是mmap申请返回的地址。

9.映射区访问权限为“私有”MAP_PRIVATE,对内存所做的所有修改,只在内存有效,不会反应到物理磁盘上。

10.映射区访问权限为“私有”MAP_PRIVATE,只需要open文件时,有读权限,用于创建映射区即可。

mmap函数的保险调用方式:

        1.fd=open("文件名",O_RDWR);

2.mmap(NULL,有效文件大小,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

 

父子进程使用mmap进程间通信:

  

     父进程先创建映射区。open(O_RDWR) mmap(MAP_SHARED);

指定MAP_SHARED权限。

fork()创建子进程。

一个进程读,另外一个进程写。

无血缘关系进程间mmap通信:

  

     两个进程 打开同一个文件,创建映射区。

指定flags为MAP——SHARED。

一个进程写入,另一个进程读出。

        【注意】:无血缘关系进程间通信。mmap:数据可以重复读取。

                                                                fifo:数据只能一次读取。

代码示例:

1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 #include<fcntl.h>
5 #include<sys/mman.h>
6 #include<errno.h>
7 #include<unistd.h>
8 #include<pthread.h>
9
10 struct student{
11 int id;
12 char name[256];
13 int age;
14 };
15
16 void sys_err(const char *str){
17 perror(str);
18 exit(1);
19 }
20
21 int main(int argc,char *argv[])
22 {
23 struct student stu;
24 struct student *p;
25 int fd;
26
27 fd=open("test_map",O_RDONLY);
28 if(fd==-1)
29 {
30 sys_err("open error");
31 }
32
33 p=mmap(NULL,sizeof(stu),PROT_READ,MAP_SHARED,fd,0);
34 if(p==MAP_FAILED)
35 {
36 sys_err("mmap error");
37 }
38 close(fd);
39
40 while(1){
41 printf("id=%d,name=%s,age%d\n",p->id,p->name,p->age);
42 sleep(1);
43 }
44 munmap(p,sizeof(stu));
45 return 0;
46 }