内存映射实现无血缘关系进程间通信

简介: 内存映射实现无血缘关系进程间通信

创建映射区等知识看上一篇:内存映射实现父子进程通信-CSDN博客

实验结果

这里因为手速原因,id 1~8被覆盖

大致过程:mmap_w.c先向p指针中写如数据 每次让id自增  然后sleep(1)

                 mmap_r.c 在p指针中读数据,打印到屏幕上

代码:

mmap_r.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;
   struct student *p;
   int fd;
 
   fd=open("test_map",O_RDONLY);
   if(fd==-1)sys_err("open error");
 
   p=mmap(NULL,sizeof(stu),PROT_READ,MAP_SHARED,fd,0);
   if(p==MAP_FAILED)sys_err("mmap error");
   close(fd);
   while(1){
        printf("id=%d,name=%s,age=%d\n",p->id,p->name,p->age);
        sleep(1);
   }
   munmap(p,sizeof(stu));
   return 0;
}

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);
   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(1);
   }
   munmap(p,sizeof(stu));
   return 0;
}
相关文章
|
1月前
|
存储 Linux 调度
深入理解操作系统:从进程管理到内存分配
【8月更文挑战第44天】本文将带你深入操作系统的核心,探索其背后的原理和机制。我们将从进程管理开始,理解如何创建、调度和管理进程。然后,我们将探讨内存分配,了解操作系统如何管理计算机的内存资源。最后,我们将通过一些代码示例,展示这些概念是如何在实际操作系统中实现的。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
|
4天前
|
缓存 算法 调度
深入浅出操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅。我们将从进程管理的基本概念出发,逐步深入到内存管理的复杂世界,最终探索如何通过实践技巧来优化系统性能。文章将结合理论与实践,通过代码示例,帮助读者更好地理解操作系统的核心机制及其在日常技术工作中的重要性。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往操作系统深层次理解的大门。
|
25天前
|
存储 缓存 Linux
用户态内存映射
【9月更文挑战第20天】内存映射不仅包括物理与虚拟内存间的映射,还涉及将文件内容映射至虚拟内存,使得访问内存即可获取文件数据。mmap 系统调用支持将文件或匿名内存映射到进程的虚拟内存空间,通过多级页表机制实现高效地址转换,并利用 TLB 加速映射过程。TLB 作为页表缓存,存储频繁访问的页表项,显著提升了地址转换速度。
|
1天前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
8 0
|
29天前
|
监控 Ubuntu API
Python脚本监控Ubuntu系统进程内存的实现方式
通过这种方法,我们可以很容易地监控Ubuntu系统中进程的内存使用情况,对于性能分析和资源管理具有很大的帮助。这只是 `psutil`库功能的冰山一角,`psutil`还能够提供更多关于系统和进程的详细信息,强烈推荐进一步探索这个强大的库。
34 1
|
15天前
|
存储 安全 Linux
将文件映射到内存,像数组一样访问
将文件映射到内存,像数组一样访问
24 0
|
2月前
|
存储 Linux Windows
在Linux中,如何查看linux中内存使用率最高的进程?
在Linux中,如何查看linux中内存使用率最高的进程?
|
1月前
|
Linux
查看进程的内存使用信息
查看进程的内存使用信息
|
1月前
|
消息中间件 Linux 容器
共享内存的创建和映射过程
【9月更文挑战第1天】消息队列、共享内存及信号量在使用前需生成key并获取唯一ID,均通过`xxxget`函数实现。
|
2月前
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存分配
【8月更文挑战第31天】在数字世界的每一次点击和滑动背后,都隐藏着一个复杂而精妙的世界——操作系统。它如同一座无形的桥梁,连接着人类与机器的沟通。本文将带你一探究竟,从进程的生命周期到内存的精细管理,我们将一起解码操作系统的核心机制。通过直观的代码示例,你将看到理论与实践的结合如何让冷冰冰的机器生动起来。准备好了吗?让我们开始这段探索之旅,揭开操作系统神秘的面纱。

相关实验场景

更多