IPC之mmap共享映射区

匿名 (未验证) 提交于 2019-12-02 23:34:01
版权声明: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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!