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);
}
}
}