共享内存学习

1、  创建获取共享内存

1.1头文件

#include <sys/ipc.h>

#include <sys/shm.h>

1.2功能描述

创建或者获取共享内存并返回描述符。

1.3 函数原型

int shmget(key_t key,size_t size,int shmflg)

1.4 返回值

成功:返回创建或者获取到的共享内存的描述符。

失败:-1

1.5 参数说明

Key:共享内存的键值

Size:共享内存的大小

Shmflg:打开标志,如果使用了IPC_CREAT,则会新创建一块共享内存。

 

2、  映射共享内存

2.1 头文件

#include <sys/types.h>

#include <sys/shm.h>

2.2 函数功能

把shmid指定的共享内存映射到进程的地址空间中去。

2.3 函数原型

Void * shmat(int shmid,const void *shmaddr,intshmflg)

2.4 返回值

返回映射到进程空间之后的内存地址。

2.5参数说明

Shmid:要映射的共享内存的描述符

Shmaddr:指定映射之后的地址,但是一般情况都让该参数为空(NULL),使linux系统自动分配要映射的地址空间。

Shmflg:标志

 

3、  脱离共享内存

3.1 头文件

#include <sys/types.h>

#include <sys/shm.h>

3.2 函数功能

从进程地址空间中断掉与共享内存映射。

3.3 函数原型

int shmdt(const void *shmaddr)

3.4 返回值

成功:0

失败:-1

3.5 参数说明

Shmaddr:要断开的共享内存的映射地址

 

4、  删除共享内存

4.1 头文件

#include<sys/ipc.h>

#include<sys/shm.h>

 

4.2 函数功能

控制共享内存

4.3 函数原型

Int shmctl(int shmid,int cmd,structshmid_ds *buf)

4.4 返回值

失败:-1

成功:根据不同的操作返回不同的值

4.5 参数说明

Shmid:要控制的共享内存的ID

Cmd:决定执行什么样的操作,如IPC_RMID(表示删除共享内存)。

Buf:获取linux描述的共享内存的shmid_ds结构,基本不使用。

测试代码:

read.c

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


struct shareMemary
{
	unsigned char taxLifeFlag;
	pid_t taxAppID;	
	unsigned char hdlcLifeFlag;	
};

struct shareMemary * shareMem;

void main()
{
	int shmid = -1;
	void * shareMemaryArea;
	char buffer[20];
	unsigned char taxLife  = 0x00;
	unsigned char taxLifeAbnomalCount = 0x00;
	unsigned char killFlag = 0x00;
	
	shmid = shmget((key_t)0x1235,sizeof(struct shareMemary),IPC_CREAT);
	
	if(shmid == -1)
	{
		printf("create share memary faild\n");
		
		exit(EXIT_FAILURE);
	}
	
	shareMemaryArea = shmat(shmid,NULL,0);
	
	if(shareMemaryArea == (void*)-1)
	{
		printf("shareMemaryArea error\n");
		exit(EXIT_FAILURE);
	}
	
	shareMem = (struct shareMemary *)shareMemaryArea;

	
	while(1)
	{
		printf("share Memary :taxLifeFlagFlag %d,hdlcLifeFlag %d,taxAppID %d count%d\n",
																   shareMem->taxLifeFlag,
																   shareMem->hdlcLifeFlag,
																   shareMem->taxAppID,
																   taxLifeAbnomalCount);
        if(taxLife != shareMem->taxLifeFlag)
		{
			taxLifeAbnomalCount = 0;
			taxLife = shareMem->taxLifeFlag;
		}
		else
		{
			taxLifeAbnomalCount++;
			if(taxLifeAbnomalCount >= 20)
			{
				taxLifeAbnomalCount = 0;
				sprintf(buffer,"kill %d",shareMem->taxAppID);	
				system(buffer);
				printf("kill taxAPP\n");				
			}
		}
													   
		sleep(1);
	}
}

write.c

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

struct shareMemary
{
	unsigned char taxLifeFlag;
	pid_t taxAppID;
	unsigned char hdlcLifeFlag;
	
};

struct shareMemary * shareMem;

void main()
{
	int shmid = -1;
	unsigned char i = 0;
	void * shareMemaryArea;
	
	
	shmid = shmget((key_t)0x1235,sizeof(struct shareMemary),IPC_CREAT);
	
	if(shmid == -1)
	{
		printf("create share memary faild\n");
		
		exit(EXIT_FAILURE);
	}
	
	shareMemaryArea = shmat(shmid,NULL,0);
	
	if(shareMemaryArea == (void*)-1)
	{
		printf("shareMemaryArea error\n");
		exit(EXIT_FAILURE);
	}
	
	shareMem = (struct shareMemary *)shareMemaryArea;
	
	shareMem->taxLifeFlag = 0;
	shareMem->hdlcLifeFlag = 0;
	shareMem->taxAppID = getpid();
	
	while(1)
	{
		for(i = 0;i < 254;i++)
		{
			if(i < 20)
			{
				shareMem->taxLifeFlag = i;
				shareMem->hdlcLifeFlag = i+1;						
			}
			else
			{
				shareMem->taxLifeFlag = 20;				
			}
		    sleep(1);
		}		
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值