`
tcspecial
  • 浏览: 916316 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Linux 共享内存

阅读更多

    Linux下共享内存有mmap和System V两种方式

    1.mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。由此看来mmap并不纯粹是为实现共享内存而设计的

   2.System V 共享内存是通过映射特殊文件系统 shm 中的文件实现进程间的共享内存通信,即把所有共享数据放在共享内存区域, 任何想要访问该数据的进程都必须在本进程的地址空间新增一块内存区域,用来映射存放共享数据的物理内存页面。

   两者从应用上来看,区别不大,一个是操作普通文件,一个是操作交换分区上的 shm 文件系统

 

1. mmap方式

   写进程:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

#define SHMNAME "shm_ram"
#define OPEN_FLAG O_RDWR|O_CREAT
#define OPEN_MODE 00777
#define FILE_SIZE 4096*4

int main(int argc,char **argv)
{
	int ret = -1;
	int fd = -1;

	void* add_w = NULL;

	//创建或者打开一个共享内存
	fd = shm_open(SHMNAME, OPEN_FLAG, OPEN_MODE);
	if(-1 == (ret = fd))
	{
		perror("shm  failed: ");
		return ret;;
	}
	
	
	//调整确定文件共享内存的空间
	ret = ftruncate(fd, FILE_SIZE);
	if(-1 == ret)
	{
		perror("ftruncate");
		return ret;;
	}
	
	// 映射目标文件的存储区
	add_w = mmap(NULL, FILE_SIZE, PROT_WRITE, MAP_SHARED, fd, SEEK_SET);
	if(NULL == add_w)
	{
		perror("mmap");
		return ret;;
	}


	// memcpy 内存共享 写入内容
	memcpy(add_w, "howaylee", sizeof("howaylee"));

	// 取消映射
	ret = munmap(add_w, FILE_SIZE);
	if(-1 == ret)
	{
		perror("munmap add_w faile: ");
		return ret;;
	}
	
	// 删除内存共享
	/*shm_unlink(SHMNAME);
	if(-1 == ret)
	{
		perror("shm_unlink faile: ");
		return ret;;
	}*/
}

 

    读进程

int main(int argc,char **argv)
{
	int ret = -1;
	int fd = -1;

	char buf[4096] = {0};
	void* add_r = NULL;

	//创建或者打开一个共享内存
	fd = shm_open(SHMNAME, OPEN_FLAG, OPEN_MODE);
	if(-1 == (ret = fd))
	{
		perror("shm");
		return ret;
	}
	
		//调整确定文件共享内存的空间
	ret = ftruncate(fd, FILE_SIZE); // 16k
	if(-1 == ret)
	{
		perror("ftruncate");
		return ret;
	}
	
	// 映射目标文件的存储区
	add_r = mmap(NULL, FILE_SIZE, PROT_READ, MAP_SHARED, fd, SEEK_SET);
	if(NULL == add_r)
	{
		perror("mmap");
		return ret;
	}

	// memcpy 内存共享 写入内容
	memcpy(buf, add_r, sizeof(buf));
	
	printf("buf = %s\n", buf);

	// 取消映射
	ret = munmap(add_r, FILE_SIZE);
	if(-1 == ret)
	{
		perror("munmap");
		return ret;
	}
} 

 

2. System V方式

   system V API比较简洁,只涉及到 shmget(),shmmat(),shmmdt(),shmctrl()四个函数,与信号量函数命名一致

   

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#define MY_SHM_ID 0x00004589
#define IPC_BUF_SIZE 1*1024*1024

pthread_mutex_t mutex;
bool WriteShmMsg(const char *szMsg)
{
	if(pthread_mutex_init(&mutex,NULL)!=0)
	{
		printf("错误:初始化锁失败\n");
		return false;
	}
	
	// 创建共享内存区
	if((shmid=shmget(MY_SHM_ID,IPC_BUF_SIZE,0600|IPC_CREAT))<0)
	{
		perror("shmget");
		return false;
	}

	void *mem;
	
	// 映射共享内存区
	if((mem=shmat(shmid,0,0))==(void*)-1)
	{
		perror("shmat");
		return false;
	}

	sprintf((char*)mem,"%s",szMsg); // 写入消息
	shmdt(mem); // 取消共享内存映射

	pthread_mutex_unlock(&mutex);
	return true;
}

 

   更多内容参见:

   http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html

   http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index2.html

分享到:
评论

相关推荐

    linux 共享内存详解

    ### Linux共享内存详解 #### 一、概述 在Linux及Unix环境下,进程间通信(IPC, Inter-Process Communication)是一项重要的技术,它允许不同进程之间交换数据和信息。System V IPC提供了三种通信机制:消息队列、...

    Linux共享内存的查看和删除

    在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误。您可以使用shell命令来查看与释放已经分配的共享内存,下面将详细说明如何进行查看和释放分配的共享内存的方法。

    linux 共享内存简单使用

    linux 共享内存简单使用

    Linux共享内存源码

    完整的Linux共享内存实例,包括读进程、写进程、信号量

    linux 共享内存浅析

    ### Linux共享内存浅析 #### 共享内存概述 共享内存是进程间通信(IPC)的一种方式,通过在内核中开辟一块特定的内存区域,允许多个进程对其进行访问,以此实现数据的共享和传递。相比其他进程间通信机制,共享...

    linux共享内存源码.rar

    linux共享内存源码例子 linux共享内存源码例子

    Linux共享内存实验的5个头文件

    自己整理的Linux5个共享内存头文件, 通过编写共享内存实验,进一步了解使用共享内存的具体步骤,同时加深对共享内存的理解。在本实验中,采用信号量作为同步机制完善两个进程(“生产者”和“消费者”)之间的通信。

    linux共享内存的参考代码

    linux的信息传输方式之一,共享内存,希望对初学者有用

    Linux共享内存C语言编程示例(包含一个应用的范例)

    Linux共享内存C语言编程示例(包含一个应用的范例)

    cpu_usage.rar_Linux共享内存

    "cpu_usage.rar_Linux共享内存"是一个针对Linux系统的工具,用于统计CPU的使用情况,而且特别强调了采用共享内存的方式来实现。这个工具的设计旨在提高效率,减少不必要的I/O操作,因为共享内存允许多个进程之间快速...

    linux讲解通过共享内存实现进程间的通信

    ### Linux共享内存实现进程间通信详解 #### 一、引言 在Linux系统中,进程间的通信(Inter-Process Communication, IPC)是一项重要的技术,它允许不同进程之间交换数据和同步执行。其中一种高效的进程间通信方法是...

    头哥实践平台操作系统实训四 Linux 共享内存2

    头哥实践平台操作系统实训四 Linux 共享内存2

    Linux共享内存的研究与实现

    Linux系统提供了多种IPC机制,如信号、管道、信号量、消息队列、共享内存和套接字等,其中以共享 内存效率最高.

    基于C语言和linux共享内存的数据分发软件

    本文将深入探讨一个基于C语言和Linux共享内存实现的数据分发软件。这种技术允许多个进程间高效、实时地交换信息,无需通过传统的文件系统或网络通信,极大地提高了性能。 首先,我们要理解C语言在系统编程中的地位...

    linux通过共享内存实现进程之间的通信

    ### Linux通过共享内存实现进程之间的通信 #### 一、概述 共享内存作为一种高效的过程间通信(IPC)方式,允许多个进程直接访问同一段物理内存。这种方法的优势在于减少了数据复制的开销,使得进程间的数据交换更为...

    linux共享内存专题编程笔记.docx

    linux共享内存专题编程笔记

    电信设备-基于Linux共享内存实现家庭网关数据通信的系统及方法.zip

    本技术文档“基于Linux共享内存实现家庭网关数据通信的系统及方法”深入探讨了如何利用Linux操作系统中的共享内存机制来优化家庭网关的数据通信效率。共享内存是一种在多进程间高效传递数据的方法,尤其适用于高并发...

    Linux共享内存实例及文件映射编程及实现原理.pdf

    Linux共享内存是一种高效的进程间通信(IPC)方式,允许多个进程访问同一块内存区域,从而实现数据的快速共享。文件映射则是将磁盘文件直接映射到内存中,使得对文件的操作就像对内存进行读写一样高效。两者在Linux...

Global site tag (gtag.js) - Google Analytics