当前位置: 首页 > 科技观察

Linux系统编程——mmap

时间:2023-03-14 10:26:55 科技观察

共享内存共享内存的概念共享内存是最高效的IPC通信方式,因为进程可以直接读写内存而无需复制数据。但是它没有自己的同步机制,需要通过信号量等方法进行同步。共享内存创建后,同一块物理内存被映射到多个进程地址空间。当一个进程修改共享内存中的数据时,其余进程可以看到修改的内容,反之亦然。mmap函数函数原型:voidmmap(voidadrr,size_tlength,intprot,intflags,intfd,off_toffset);返回值:成功:返回创建的映射区首地址;失败:返回MAP_FAILED具体参数含义:addr:指向映射区首地址,由系统内核决定,一般设置为NULL;length:要创建的映射区域的大小;prot:映射区的权限,一般如下:PROT_EXEC映射区可执行PROT_READ映射区可读PROT_WRITE映射区可写入PROT_NONE映射区不可访问flags:指映射的标志位area,MAP_FIXED和MAP_PRIVATE必须二选一:MAP_FIXED:映射区的修改会反映到物理设备上,但需要调用msync()或munmap();MAP_PRIVATE:对映射区域所做的修改不会反映在物理设备中。fd:创建映射区的文件描述符;offset:映射文件的偏移量,一般设置为0,表示从头开始映射。mumap函数函数原型:intmunmap(void*addr,size_tlength);function功能:就像malloc之后的free一样,使用mmap调用创建的映射区后,需要调用munmap释放。示例程序写入程序:#include#include#include#include#include#include#includetypedefstruct{11intid;charname[20];chargender;}stu;intmain(intargc,char*argv[]){stu*p=NULL;intfd=0;student={10,“哈利”,'m'};if(argc<2){printf("useage:./a.outfile\n");return-1;}fd=open(argv[1],O_RDWR|O_CREAT,0664);if(fd==-1){printf("ERROR:openfailed!\n");return-1;}ftruncate(fd,sizeof(stu));p=mmap(NULL,sizeof(stu),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if(p==MAP_FAILED){printf("ERROR:mmapfailed!\n");return-1;}close(fd);while(1){memcpy(p,&student,sizeof(stu));student.id++;sleep(2);}munmap(p,sizeof(stu));return0;}阅读程序:#include#include#include#include#include#includetypedefstruct{intid;charname[20];chargender;}stu;intmain(intargc,char*argv[]){stu*p=NULL;intfd=0;if(argc<2){printf("useage:./a.outfile\n");return-1;}fd=open(argv[1],O_RDONLY);if(fd==-1){printf("ERROR:openfailed!\n");return-1;}p=mmap(NULL,sizeof(stu),PROT_READ,MAP_SHARED,fd,0);if(p==MAP_FAILED){printf("ERROR:mmapfailed!\n");return-1;}close(fd);while(1){printf("id=%d,name=%s,gender=%c\n",p->id,p->name,p->gender);sleep(2);}munmap(p,sizeof(stu));return0;}本文已授权转载来自公众号「良旭Linux」500强外企Linux开发工程师良旭,在公众号分享大量Linux干货,欢迎关注!