内存映射mmap拓展

简介: 内存映射mmap拓展

第一个是上一篇博客中用mmap实现任意两个进程间相互通信,前几篇博客也用管道实现了进程间通信

这里有个问题,管道是基于缓冲区环形队列的,实验也表明读过的数据不能在读利用命名管道实现任意进程间的通信

那么mmap多个读写操作时会是什么情况呢?

一写多读

多写一读

这里代码要改变一下

mmap_w.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <errno.h>
 
struct student {
   int id;
   int age;
   char name[256];
};
 
void sys_err(const char *str){
    perror(str);
    exit(1);
}
 
int main(int argc,char *argv){
   struct student stu={1,23,"xiaoming"};
   struct student *p;
   int fd;
 
  //fd=open("test_map",O_RDWR|O_CREAT|O_TRUNC,0664);
   fd=open("test_map",O_RDWR);
   if(fd==-1)sys_err("open error");
 
   ftruncate(fd,sizeof(stu));
   p=mmap(NULL,sizeof(stu),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
   if(p==MAP_FAILED)sys_err("mmap error");
   close(fd);
   while(1){
        memcpy(p,&stu,sizeof(stu));
        stu.id++;
        sleep(2);
   }
   munmap(p,sizeof(stu));
   return 0;
}

mmap_r.c不变,可以看前一篇文章

目录
打赏
0
0
0
0
25
分享
相关文章
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
91 6
用户态内存映射
【9月更文挑战第20天】内存映射不仅包括物理与虚拟内存间的映射,还涉及将文件内容映射至虚拟内存,使得访问内存即可获取文件数据。mmap 系统调用支持将文件或匿名内存映射到进程的虚拟内存空间,通过多级页表机制实现高效地址转换,并利用 TLB 加速映射过程。TLB 作为页表缓存,存储频繁访问的页表项,显著提升了地址转换速度。
|
4月前
|
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
96 0
将文件映射到内存,像数组一样访问
将文件映射到内存,像数组一样访问
55 0
共享内存的创建和映射过程
【9月更文挑战第1天】消息队列、共享内存及信号量在使用前需生成key并获取唯一ID,均通过`xxxget`函数实现。
深入了解Linux的pmap命令:进程内存映射的利器
`pmap`是Linux下分析进程内存映射的工具,显示内存区域、权限、大小等信息。通过`/proc/[pid]/maps`获取数据,特点包括详细、实时和灵活。参数如`-x`显示扩展信息,`-d`显示设备。示例:`pmap -x 1234`查看进程1234的映射。注意权限、实时性和准确性。结合其他工具定期监控,排查内存问题。
|
8月前
|
C++
C++对C的改进和拓展\动态内存空间管理
C++对C的改进和拓展\动态内存空间管理
38 0
|
9月前
内存映射实现无血缘关系进程间通信
内存映射实现无血缘关系进程间通信
|
9月前
内存映射实现父子进程通信
内存映射实现父子进程通信
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
677 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等