共享内存通讯

1.核心理论

共享内存是IPC机制中的一种,它允许两个不相关的进程访问同一段内存,这是传递数据的一种非常有效的方式。

2.函数学习

创建/获取共享内存

函数名:shmget

函数原型:int shmget(key_t key,size_t size,int shmflg)

函数功能:创建或者获取共享内存,并返回其描述符

头文件:<sys/ipc.h> <sys/shm.h>

返回值:成功:返回创建或获取到的共享内存的描述符 失败:-1

参数说明:key:共享内存的键值 size:共享内存的大小 flg:打开标志,如果使用了IPC_CREAT,则会新创建一块共享内存

映射共享内存

函数名:shmat

函数原型:void *shmat(int shmid,const void *shmaddr,int shmflg)

函数功能:把shmid指定的共享内存映射到进程的地址空间里

头文件:<sys/types.h> <sys/shm.h>

返回值:成功:返回映射到进程空间后的内存地址  失败:-1

参数说明:shmid:要映射的共享内存的描述符

Shmaddr:指定映射后的地址,一般取NULL,表明让系统自动选择映射地址

Shmflg:标志

脱离共享内存

函数名:shmdt

函数原型:void *shmdt(const void *shmaddr)

函数功能:从进程地址空间中断掉与共享内存的联系

头文件:<sys/types.h> <sys/shm.h>

返回值: 成功:0  失败:-1

参数说明:要断开的共享内存的映射地址

删除共享内存

函数名:shmctl

函数原型:int shmctl(int shmid,int cmd,struct shmid_ds *buf)

函数功能:控制共享内存

头文件:<sys/ipc.h> <sys/shm.h>

返回值:成功:根据不同地操作返回不同的值 失败:-1

参数说明:shmid:要控制的共享内存的id

cmd:决定要执行什么样的控制操作,如IPC_RMID表示删除

buf:获取linux中描述共享内存的struct_ds结构,基本上不使用

3.综合实例

/* write.c */

#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <stdio.h>
#include <stdlib.h>

#define TEXT_SZ 2048

struct shared_use_st
{
	int writen_by_you;
	char some_text[TEXT_SZ];
};

int main()
{
	int shmid;
	int running = 1;
	struct shared_use_st *shared_stuff;
	char buffer[TEXT_SZ];

	/* 创建共享内存 */
	shmid = shmget((key_t)1234,sizeof(struct shared_use_st),IPC_CREAT);
	if(shmid == -1)
	{
		printf("creat share memory fail!\n");
		exit(EXIT_FAILURE);
	}

	/* 映射共享内存 */
	shared_stuff = (struct shared_use_st *)shmat(shmid,NULL,0);

	/* 循环 */
	while(running)
	{
		while(shared_stuff->writen_by_you == 1)
		{
			sleep(1);
			printf("wait read process\n");
		}

		/* 获取用户输入 */
		fgets(buffer,TEXT_SZ,stdin);

		/* 将用户输入的字符串放入共享内存 */
		strncpy(shared_stuff->some_text,buffer,TEXT_SZ);
		shared_stuff->writen_by_you = 1;

		if(strncmp(buffer,"end",3)==0)
		{
			running = 0;
		}
	}
	/* 脱离共享内存 */
	shmdt((const void*)shared_stuff);

	return 1;
}
/* read.c */

#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <stdio.h>
#include <stdlib.h>

#define TEXT_SZ 2048

struct shared_use_st
{
	int writen_by_you;
	char some_text[TEXT_SZ];
};

int main()
{
	int shmid;
	int running;
	struct shared_use_st *shared_stuff;

	/* 创建/获取共享内存 */
	shmid = shmget((key_t)1234,sizeof(struct shared_use_st),IPC_CREAT);

	/* 映射共享内存 */
	shared_stuff = (struct shared_use_st*)shmat(shmid,NULL,0);

	shared_stuff->writen_by_you = 0;

	/* 循环 */
	while(running)
	{
		if(shared_stuff->writen_by_you == 1)
		{
			printf("write process write %s\n",shared_stuff->some_text);
			shared_stuff->writen_by_you = 0;

			if(strncmp(shared_stuff->some_text,"end",3)==0)
			{
				running = 0;
			}
		}
	}
	/* 脱离共享内存 */
	shmdt((const void *)shared_stuff);

	/* 删除共享内存 */
	shmctl(shmid,IPC_RMID,0);

	return 1;
}

先运行read,然后运行write,在write里写入数据,read即可读出数据,write写入end时两个进程都退出

时间: 2024-10-22 06:23:57

共享内存通讯的相关文章

linux_c开发(5-4)进程间通讯_共享内存通讯

共享内存 共享内存 是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快方法,一个进程向共享内存写入了数据,共享这个内存的所有进程就可以立刻看到其中内容. 共享内存实现分为两个步骤 1.创建共享内存,使用shmget函数. 2.映射共享内存,将创建的这段共享内存映射到具体的进程空间去,使用shmat函数. int shmget(key_t key,int size,int shmflg) key标志共享内存的键值:O/IPC_PRIVATE.当key的取值为IPC/PRIVATE

[国嵌攻略][085][共享内存通讯]

共享内存 共享内存是IPC机制中的一种,它允许两个相关的进程访问同一段内存,这是传递数据的一种有效的方式. A.c #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <string.h> #define SIZE 2048 typedef struct sharemem{ int flag; //共享标志 cha

共享内存通讯编程

共享内存是IPC机制中的一种.它允许两个不相关的进程访问同一段内存,这是传递数据的一种非常有效的方式. shmget函数 原型:int shmget(key_t key,size_t size,int shmflg) 头文件:<sys/ipc.h><sys/shm.h> 功能:创建/获取一个共享内存,成功则返回共享内存的描述符id,失败返回-1 参数:key:键值 size:创建的共享内存大小 shmflg:打开标志.如值为IPC_CREAT,则会创建一个新的共享内存 shmget

win32进程间通讯--共享内存

小白一枚,如有不对,请各位大神多多指教! 最近看了看win32进程间通讯.简单写了写利用共享内存实现进程间通讯 使用共享内存实现进程间通讯: 1.在WM_CREATE消息下创建文件映射内核对象 1 hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, (LPCWSTR)szName); 2.在需要进行数据共享的地方映射缓存区视图,将要写入的数据放入pbuf 1 pBuf = (c

ACE框架 基于共享内存的进程间通讯

ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件.流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_MEM_Accpter.ACE框架为基于共享内存的进程间通讯提供了两种数据传输(分发deliver)策略.一种是使用生产者-消费者队列的一对多的多用户MT策略,另一种是使用socket流的可以使用反应器响应数据接收事件的Reactor策略.不论哪一种策略都要通过socket进行TCP连接,并进行进程

进程通信之共享内存

共享内存 共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进程之间共享的内存通常安排为同一段物理内存.进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样.而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程. 共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自

Linux环境编程之共享内存区(一):共享内存区简介

Spark生态圈,也就是BDAS(伯克利数据分析栈),是伯克利APMLab实验室精心打造的,力图在算法(Algorithms).机器(Machines).人(People)之间通过大规模集成,来展现大数据应用的一个平台,其核心引擎就是Spark,其计算基础是弹性分布式数据集,也就是RDD.通过Spark生态圈,AMPLab运用大数据.云计算.通信等各种资源,以及各种灵活的技术方案,对海量不透明的数据进行甄别并转化为有用的信息,以供人们更好的理解世界.Spark生态圈已经涉及到机器学习.数据挖掘.

C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转

原文:C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). 内存映射文件对于托管世界的开发人员来说似乎很陌生,但它确实已经是很远古的技术了,而且在操作系统中地位相当.实际上,任何想要共享数据的通信模型都会在幕后使用它. 内存映射文件究竟是个什么?内存映射文件允许你保留一块地址空间,然后将该物理存储映射到这块内存空间中进行操作.物理存储是文件管理,而内存

进程间通信IPC:消息队列,信号量,共享内存

2015.3.4星期三 阴天 进程间通信:IPC 文件对象:记录文件描述符,文件开关等 IPC标示符:系统全局的流水号两个进程要通信,打开的是唯一的对象进行通讯,通过key操作 XSI IPC:消息队列,信号量,共享内存. ipcs 查看ip对象共享内存,信号量,消息队列等信息ipcrm 删除一个IP对象 Linux为用户提供了完善的,强大的网络功能完善的内置网络:其他操作系统不包含如此紧密的和内核结合在一起的网络部分 共享内存标示符的获取有两种方法:ftok(pathname,id)另一个是K