Linux下运用MMAP在进程间通信

    由于在操作系统层面,各个进程所看到的虚拟地址空间是独立的,之间没有交集。因此需要通过中间一个关联将多个关联进程的不同虚拟地址映射到相同的物理地址空间中。

MMAP 就是这么一个功能,它把一个文件(也就是在内存中的物理地址空间确定)映射到不同进程的地址空间中。

一、写

     值得注意的是由于MMAP需要内存中的物理地址空间,因此在写操作过程中需要将文件加载到内存中才能进行操作,因此在打开文件后需要进行写操作,引起缺页异常,将文件映射到内存中。

     

fd = open(argv[1],O_CREAT|O_RDWR|O_TRUNC,00777);
lseek(fd, 4, SEEK_SET);//这里size最好为共享的结构体的大小,将整个需要的大小都加载到内存中
write(fd,"",1);
p_mmap = (int *) mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd , 0);
close(fd);

*(p_mmap) =1;

   如果不进行写空操作便直接进行mmap映射,便会造成段错误,因为实际的fd对应的物理内存不存在。


二、读

      读进程必须在写进程之后调用mmap,否者会出现段错误,和前面一样的道理。

      读进程流程

fd= open(argv[1], O_CREAT |O_RDWR, 0077);
p_mmap = (int *) mmap (NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
printf("data: %d \n", (*(p_mmap)));




    


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值