Linux环境下共享内存

共享内存指 (shared memory)在多处理器的计算机系统中,可以被不同中央处理(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(Cache)。任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则不同的处理器可能用到不同的数据。共享内存是 Unix下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。


共享内存相比其他几种方式有着更方便的数据控制能力,数据在读写过程中会更透明。当成功导入一块共享内存后,它只是相当于一个字符串指针来指向一块内存,在当前进程下用户可以随意的访问。缺点是,数据写入进程或数据读出进程中,需要附加的数据结构控制。


共享内存映射在进程地址空间的栈和堆之间

共享内存通过int shmget(key_t key, size_t size, int shmflg);函数创建其中key是由ftok()函数自动获取,size是所申请的共享内存的大小单位是字节一般size是4096的整数倍,shmflg为IPC_CREAT或者IPC_EXCL

用 int shmctl(int shmid, int cmd, struct shmid_ds *buf);函数删除


申请到共享内存之后需要挂接到对应的进程上由 void *shmat(int shmid, const void *shmaddr, int shmflg);函数实现

用 void *shmat(int shmid, const void *shmaddr, int shmflg);函数解除挂接


com.h

#ifndef __SHM__
#define __SHM__

#include<stdio.h>
#include<sys/shm.h>
#include<sys/ipc.h>
#include<sys/wait.h>
#include<unistd.h>


static shm(int size, int flag);
int create_shm(int size);
int get_shm();
char* at_shm(int shmid);
int dt_shm(char* addr);
int destory_shm(int shmid);

#endif //__SHM__
com.c

#include"com.h"


static int shm(int size, int flag)
{
	key_t key = ftok(".",88);
	int shmid = shmget(key,size,flag);
	if(shmid == -1)
	{
		perror("shmget:");
		return -1;
	}
	
	return shmid;
}

int create_shm(int size)
{
	return shm(size,IPC_CREAT | IPC_EXCL | 0666);
}

int get_shm()
{
	return shm(0,IPC_CREAT);
}

char* at_shm(int shmid)
{
	return (char*)shmat(shmid, NULL,0);
}

int dt_shm(char* addr) 
{
	return shmdt(addr);
}

int destory_shm(int shmid)
{
	return shmctl(shmid,IPC_RMID,NULL);
}

server.c

#include"com.h"

int main()
{
	int shmid = get_shm();
	usleep(1000);
	char* str =  at_shm(shmid);
	usleep(5000);
	int count = 0;

	while(count < 4096)
	{
		printf("%s\n",str);
		usleep(1000);
		count++;
	}

	dt_shm(str);

	return 0;
}


client.c


#include"com.h"

int main()
{
	int shmid = create_shm(4096);
	usleep(1000);
	char* str =  at_shm(shmid);
	usleep(5000);
	int count = 0;

	while(count < 4096)
	{
		str[count] = 'A' + count%26;
		usleep(1000);
		count++;
		str[count] = '\0';
	}

	dt_shm(str);

	destory_shm(shmid);

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值