版权声明:wangdassye https://blog.csdn.net/weixin_43136315/article/details/90513411
mmap
共享内存(Shared Memory):映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问
优点:
缺点:
相关函数
创建映射区函数
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
释放映射区
int munmap(void *addr, size_t length);
写端
#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<sys/mman.h> #include<string.h> typedef struct _student{ int sid; char sname[20]; }student; int main(int argc, char *argv[]){ if(argc != 2){ printf("./a.out filename\n"); return -1; } int fd = open(argv[1],O_RDWR|O_CREAT|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){ perror("mmap erro"); return -1; } int num = 0; while(1){ stu->sid = num++; sprintf(stu->sname,"wangdassye"); sleep(1); } munmap(stu,length); close(fd); return 0; }
读端
#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<sys/mman.h> #include<fcntl.h> #include<sys/wait.h> typedef struct _student{ int sid; char sname[20]; }student; int main(int argc,char* argv[]){ int fd = open(argv[1],O_RDWR); int length = sizeof(student); student *stu = mmap(NULL,length,PROT_WRITE|PROT_READ,MAP_SHARED,fd,0); if(stu == MAP_FAILED){ perror("mmap err"); return -1; } while(1){ printf("sid = %3d,sname = %s\n",stu->sid,stu->sname); sleep(1); } munmap(stu,length); close(fd); return 0; }
- 匿名映射 flag设置为 MAP_ANON 或者 MAP_ANONYMOUS(unix中没有这两个宏,可以用/dev/zero 做映射)。
- 用mmap支持无血缘关系进程通信:flag必须设置为MAP_SHARED
文章来源: https://blog.csdn.net/weixin_43136315/article/details/90513411