父子进程使用mmap进程间通信
原创
©著作权归作者所有:来自51CTO博客作者黑马金牌编程的原创作品,请联系作者获取转载授权,否则将追究法律责任
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 }