共享内存的使用方法

共享内存

使用共享内存的一般步骤:
(1)获取共享内存的ID;
(2)将共享内存映射到本进程虚拟内存空间的某个区域;
(3)不再使用时,接触映射;
(4)不需要时,删除它。
注意:创建的共享内存是物理内存,必须要映射到本进程的内存空间才能使用。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
IPC_STAT获得的属性信息查找课本或其他资料

代码演示:

p1发送信息给p2

int main()
{
	int shmid;
	key_t key = ftok("/home/gec",1000); 
	//申请共享内存
	shmid=shmget(key,1024,IPC_CREAT|IPC_EXCL|0777); //新建共享内存
	if(shmid==-1)
	{
		//进一步分析错误原因
		if(errno==EEXIST) //共享内存已经存在
		{
			shmid=shmget(key,1024,0777); //打开共享内存
		}
		else //其他错误
		{
			perror("申请失败!\n");
			return -1;
		}
	}
	
	//映射得到首地址
	char *p=shmat(shmid,NULL,0);
	if(p==NULL)
	{
		perror("映射失败!\n");
		return -1;
	}
	
	//通过共享内存发送信息给p2
	while(1)
	{
		printf("请输入要发送给p2的信息!\n");
		scanf("%s",p);
	}
	//shmctl(shmid,IPC_RMID,NULL);//删除共享内存
}

p2接收p1信息:

int main()
{
	int shmid;
	key_t key = ftok("/home/gec",1000); 
	//申请共享内存
	shmid=shmget(key,1024,IPC_CREAT|IPC_EXCL|0777); //新建共享内存
	if(shmid==-1)
	{
		//进一步分析错误原因
		if(errno==EEXIST) //共享内存已经存在
		{
			shmid=shmget(key,1024,0777); //打开共享内存
		}
		else //其他错误
		{
			perror("申请失败!\n");
			return -1;
		}
	}
	
	//映射得到首地址
	char *p=shmat(shmid,NULL,0);
	if(p==NULL)
	{
		perror("映射失败!\n");
		return -1;
	}

	//访问p1存放到共享内存中的信息
	while(1)
	{
		printf("共享内存中p1发送过来的信息是:%s\n",p);
		shmdt(p);//读完数据,解除映射
	}	
}

获取共享内存属性信息:

#include "myhead.h"

/*
	获取共享内存的属性信息
*/
int main()
{
	int shmid;
	key_t key = ftok("/home/gec",1000); 
	//申请共享内存
	shmid=shmget(key,1024,IPC_CREAT|IPC_EXCL|0777); //新建共享内存
	if(shmid==-1)
	{
		//进一步分析错误原因
		if(errno==EEXIST) //共享内存已经存在
		{
			shmid=shmget(key,1024,0777); //打开共享内存
		}
		else //其他错误
		{
			perror("申请失败!\n");
			return -1;
		}
	}
	
	//定义结构体变量,用于存放获取到的属性信息
	struct shmid_ds myds;
	//获取你刚才申请成功的那个共享内存的属性信息
	shmctl(shmid,IPC_STAT,&myds);
	printf("大小是:%ld\n",myds.shm_segsz);
	printf("键值是:%x\n",myds.shm_perm.__key);
	printf("权限是:%o\n",myds.shm_perm.mode);
	
}
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值