关闭

mmap的使用之两个进程通过映射普通文件实现共享内存通信

946人阅读 评论(0) 收藏 举报
分类:
/*-------------map_normalfile1.c-----------*/
#include	<sys/mman.h>
#include	<sys/types.h>
#include	<fcntl.h>
#include	<string.h>
#include	<stdio.h>
#include	<unistd.h>


typedef struct{
	char name[4];
	int age;
}  people;

//mmap_normal_file1.c 两个进程通过映射普通文件实现共享内存通信 
void main(int argc, char **argv)//map a normal file as shared mem:
{
	int fd,i;
	people *p_map;
	char temp;
	char data[64];
	fd = open(argv[1], O_CREAT | O_RDWR | O_TRUNC, 00777);
	lseek(fd, sizeof(people) * 5 - 1, SEEK_SET);
	write(fd, "", 1);
	//把文件映射到共享内存
	p_map = (people*)mmap(NULL, sizeof(people) * 10, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
	close(fd);
	temp = 'a';
	for(i=0;i<10;i++)
	{
		temp += 1;
		sprintf(data, "exe%c", temp);
		memcpy((*(p_map + i)).name, &data, strlen(data));
		(*(p_map + i)).age = 20 + i;
	}
	printf("initializeover  write finish \n");
	sleep(10);
	munmap(p_map, sizeof(people) * 10);
	printf("umap ok\n"); 
}
 

/*-------------map_normalfile2.c-----------*/  
#include <sys/mman.h>  
#include <sys/types.h>  
#include <fcntl.h>
#include <stdio.h>  
#include <unistd.h>  

typedef struct {  
    char name[4];   
    int age;   
}people;   
	
//mmap_normal_file2.c 两个进程通过映射普通文件实现共享内存通信 
void main(int argc, char **argv)//map a normal file as shared mem:  
{
	  
    int fd, i;   
    people *p_map;   
    fd = open(argv[1], O_CREAT | O_RDWR, 00777);   
    p_map = (people*)mmap(NULL, sizeof(people) * 10, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);   
    for(i = 0 ; i < 10 ; i++)  
	{
		  
	    printf("read data name=%s age=%d;\n", (*(p_map + i)).name, (*(p_map + i)).age);   
	}  
	munmap(p_map, sizeof(people) * 10);   
	
}

#Generated by VisualGDB project wizard.
#Note: VisualGDB will automatically update this file when you add new sources to the project.
#CMakeList.txt
cmake_minimum_required(VERSION 2.7)
project(LinuxProject1)
set(LIBRARIES_FROM_REFERENCES "")
add_executable(mmap_normal_file1 mmap_normal_file1.c)
add_executable(mmap_normal_file2 mmap_normal_file2.c)
target_link_libraries(mmap_normal_file1 "${LIBRARIES_FROM_REFERENCES}")
target_link_libraries(mmap_normal_file2 "${LIBRARIES_FROM_REFERENCES}")

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Linux进程间通信--mmap共享内存(一)

共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。 采用共享内存...
  • yusiguyuan
  • yusiguyuan
  • 2015-04-20 20:03
  • 2666

进程间通信笔记(8)—mmap详解

linux mmap详解
  • zhangxiao93
  • zhangxiao93
  • 2016-09-22 10:53
  • 837

python进程间共享数据

python的进程间共享数据可以通过multiprocess中的queue,pipe等现成的消息队列传递 也可以通过multiprocessing.manager创建共享的基本数据类型(如list,RLock等内置类型)但是以上两种方法都只能传递python内置数据类型 如何传递一个自定义类型数...
  • tpoy0099
  • tpoy0099
  • 2016-09-28 13:59
  • 585

linux 中mmap的用法(进程间通信-共享内存)

转自 : http://blog.csdn.net/angelbosj/article/details/8272887 函数:void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsiz...
  • xiaoxianerqq
  • xiaoxianerqq
  • 2016-11-15 09:34
  • 1062

Linux环境进程间通信(五): 共享内存(上) mmap [Important !!!!!!!!!]

共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。 5...
  • u011244446
  • u011244446
  • 2016-09-21 10:27
  • 583

Linux的mmap内存映射机制解析

在讲述文件映射的概念时, 不可避免的要牵涉到虚存(SVR 4的VM). 实际上, 文件映射是虚存的中心概念, 文件映射一方面给用户提供了一组措施, 好似用户将文件映射到自己地址空间的某个部分, 使用简单的内存访问指令读写文件;另一方面, 它也可以用于内核的基本组织模式, 在这种模式种, 内核将整个...
  • zqixiao_09
  • zqixiao_09
  • 2016-04-07 19:48
  • 7990

共享内存及其用mmap实现共享内存

一、什么是共享内存顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由...
  • Comedly
  • Comedly
  • 2016-08-01 00:32
  • 2060

共享内存映射之mmap()函数详解

本文 共享内存映射之mmap()函数详解    共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: ...
  • bluehawksky
  • bluehawksky
  • 2014-10-05 20:29
  • 2409

Linux内存映射——mmap

一 mmap系统调用 1.内存映射 所谓的内存映射就是把物理内存映射到进程的地址空间之内,这些应用程序就可以直接使用输入输出的地址空间,从而提高读写的效率。Linux提供了mmap()函数,用来映射物理内存。在驱动程序中,应用程序以设备文件为对象,调用mmap()函数,内核进行内存映射的...
  • hustfoxy
  • hustfoxy
  • 2013-03-23 17:00
  • 20161

文件内存映射mmap解决大文件快速读写问题和进程间共享内存

mmap函数主要用途有三个: 1、将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能; 2、将特殊文件进行匿名内存映射,可以为关联进程提供共享内存空间; 3、为无关联的进程提供共享内存空间,一般也是将一个普通文件映射到内存...
  • xhu_eternalcc
  • xhu_eternalcc
  • 2014-08-09 11:08
  • 3008
    个人资料
    • 访问:2140016次
    • 积分:28913
    • 等级:
    • 排名:第209名
    • 原创:785篇
    • 转载:394篇
    • 译文:0篇
    • 评论:244条
    我的技术博客
    最新评论