共享内存
一.作用
进程间传输数据
二.函数
1、shmget函数
int shmget(key_t key, size_t size, int shmflg);
Key:程序需要提供一个参数key(非0整数),它有效地为共享内存段命名,shmget函数成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。调用失败返回-1.
Size:size以字节为单位指定需要共享的内存容量
Shmflg:shmflg是权限标志,它的作用与open函数的mode参数一样,如果要想在key标识的共享内存不存在时,创建它的话,可以与IPC_CREAT做或操作。共享内存的权限标志与文件的读写权限一样,举例来说,0644,它表示允许一个进程创建的共享内存被内存创建者所拥有的进程向共享内存读取和写入数据,同时其他用户创建的进程只能读取共享内存。
2、shmat函数
void *shmat(int shm_id, const void *shm_addr, int shmflg);
shm_id:shm_id是由shmget函数返回的共享内存标识。
shm_addr:shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。
Shmflg:shm_flg是一组标志位,通常为0。
调用成功时返回一个指向共享内存第一个字节的指针,如果调用失败返回-1.
3、shmdt函数
该函数用于将共享内存从当前进程中分离。注意,将共享内存分离并不是删除它,只是使该共享内存对当前进程不再可用
int shmdt(const void *shmaddr);
Shmaddr:shmaddr是shmat函数返回的地址指针,调用成功时返回0,失败时返回-1.
三.代码
H文件
#ifndef _SHARED_SYSTEMDATA_H_
#define _SHARED_SYSTEMDATA_H_
struct STransferData
{
char data1;
char data2;
char data3;
char data4;
};
struct SSharedDataSentence
{
unsigned int bReading :1; // 1表示正在读取,写操作需要等待
unsigned int bWriting :1; // 1表示正在写入,读操作需要等待
unsigned int reserved :30;
STransferData transferData;
};
bool InitSharedSystemData();
void WriteSharedSystemData(STransferData* pSSharedSentence);
void ReadSharedSystemData(STransferData& pSSharedSentence);
#endif
CPP文件
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <sys/shm.h>
#include "SharedSystemData.h"
#define SHARE_KEY_SYSTEMDATA 19840506
static SSharedDataSentence* m_pSharedSystemDataSentence = NULL;
bool InitSharedSystemData()
{
//创建共享内存
int shmidSentence = shmget((key_t)SHARE_KEY_SYSTEMDATA, sizeof(SSharedDataSentence), 0666|IPC_CREAT);
assert(shmidSentence != -1);
//将共享内存连接到当前进程的地址空间
void* shMemSentence = shmat(shmidSentence, NULL, 0);
assert(shMemSentence != (void*)-1);
//设置共享内存
m_pSharedSystemDataSentence = (struct SSharedDataSentence*)shMemSentence;
memset(m_pSharedSystemDataSentence, 0x00, sizeof(SSharedDataSentence));
return true;
}
void WriteSharedSystemData(STransferData* pSSharedSentence)
{
//数据还没有被读取,则等待数据被读取,不能向共享内存中写入文本
while(m_pSharedSystemDataSentence->bReading == 1 || m_pSharedSystemDataSentence->bWriting == 1)
{
usleep(1000);
}
m_pSharedSystemDataSentence->bWriting = 1;
memcpy(&m_pSharedSystemDataSentence->transferData, pSSharedSentence, sizeof(STransferData));
m_pSharedSystemDataSentence->bWriting = 0;
}
void ReadSharedSystemData(STransferData& pSSharedSentence)
{
//数据还没有被读取,则等待数据被读取,不能向共享内存中写入文本
while(m_pSharedSystemDataSentence->bWriting == 1)
{
usleep(1000);
}
m_pSharedSystemDataSentence->bReading = 1;
memcpy(&pSSharedSentence, &m_pSharedSystemDataSentence->transferData, sizeof(STransferData));
m_pSharedSystemDataSentence->bReading = 0;
}