共享内存mmap

   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)
    当有了共享内存后,多个亲缘进程间就可以通过内存指针进行通信。


你可能感兴趣的:(共享内存mmap)