共享内存mmap

来源:互联网 发布:高淇java300集 知乎 编辑:程序博客网 时间:2024/06/06 17:59

   mmap的是将文件指定的区域映射到内存缓冲区中,从缓冲区中读取数据就相当于从文件中读取相应数据,对缓冲区进行写操作相当于写入文件相应位置。

  void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);//将文件映射到内存中,addr和offset通常为0,length是映射的内存长度,prot是内存的权限(不能高于fd的打开权限),flags是内存属性  int munmap(void *addr, size_t length);//解除该映射
    一个实例,将文件映射到内存然后直接操作内存从而写入文件

#include<stdio.h>#include<string.h>#include<sys/mman.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<stdlib.h>int main(){    int fd=open("1.txt",O_RDWR|O_CREAT,S_IRWXU);//创建文件    lseek(fd,49,SEEK_SET);//由于刚创建的文件为空,需要先扩充文件内容,才能mmap映射至内存后操作内存,不然会报错    write(fd," ",1);//象征性的写一个字    void *buf=mmap(NULL,30,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//length参数不足一个内存页按照一个内存页计算(512B)    memcpy(buf,"hello world\nso beautiful\n",strlen("hello world\nso beautiful\n"));//直接操作内核缓冲区,最后的结果写入文件    printf("%s",buf);    //msync(buf,30,MS_SYNC);//等到写入文件后返回,这里未使用    //munmap(buf,20);//解除映射    exit(0);}
文件内容:

hello world
so beautiful

    在网络编程中,文件映射可以快速IO,因为这比read/write组合调用少了内核缓冲区到用户态缓冲区(read)和用户缓冲区到内核态(write)两次拷贝。

    mmap还可以作为内存共享,这种方式通常不映射文件,将mmap函数参数的flags置为MAP_ANNON,fd置为-1,就可以实现内存共享(没有映射到文件),创建一个length大小的可读写的共享内存方式例如:

void* mmap(NULL,length,PROT_READ|PROT_WRITE,MAP_ANON|MAP_SHARED,-1,0)
    当有了共享内存后,多个亲缘进程间就可以通过内存指针进行通信。


0 0
原创粉丝点击