1.共享内存数据结构
2.共享内存函数
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmdt(const void *shmaddr);
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
3.shmget函数
(1)原型:int shmget(key_t key, size_t size, int shmflg);
(2)功能:用来创建共享内存
打开一个已经存在共享内存, 如果打开时不知道共享内存的大小, 可以将size指定为0, shmflg可以指定为0(按照默认的权限打开);
(3)参数:
key:这个共享内存段名字;
size:共享内存大小(bytes);
shmflg:用法类似msgget中的msgflg参数;
(4)返回值:
成功返回一个非负整数,即该共享内存段的标识码;失败返回-1
4.shmat函数
(1)原型:void *shmat(int shmid, const void *shmaddr, int shmflg);
(2)shmaddr为NULL,核心自动选择一个地址
(3)shmaddr不为NULL且shmflg无SHM_RND标记,则以shmaddr为连接地址
(4)shmaddr不为NULL且shmaddr设置了SHM_RND标记,则连接的地址会自动向下调整为SHMLBA的整数倍。公式:shmaddr-(shmaddr % SHMLBA)
(5)shmflg=SHM_RDONLY,表示连接操作用来只读共享内存
5.shmctl函数
(1)功能:用来设置或获取一个共享内存
(2)原型:int shnctl(int shnid, int cmd, struct shmid_ds* buf);
(3)参数:shmid:由shmget返回的共享内存标识码
cmd:将要采取的动作(由三个可取值)
buf:指向一个保存着共享内存的模式状态和访问权限数据结构
(4)返回值:成功返回0,;失败返回-1
6.shmdt函数
(1)原型:int shmdt(const void *shmaddr);
(2)参数:shmaddr: 由shmat所返回的指针
(3)注意:将共享内存段与当前进程脱离不等于删除共享内存段
7.示例
shmwrite.cpp
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
}while(0)
typedef struct stu {
char name[32];
int age;
}STU;
int main(int argc, char* argv[]) {
int shmid;
shmid = shmget(1234, sizeof(STU), IPC_CREAT | 0666);
if(shmid == -1) {
ERR_EXIT("shmget");
}
STU* p;
p = (STU*)shmat(shmid, NULL, 0);
if((void*)-1 == p) {
ERR_EXIT("shmat");
}
strcpy(p->name, "lisi");
p->age = 20;
//sleep(10);
while(1) {
if(memcmp(p, "quit", 4) == 0) {
break;
}
}
shmdt(p);
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
shmread.cpp
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
}while(0)
typedef struct stu {
char name[32];
int age;
}STU;
int main(int argc, char* argv[]) {
int shmid;
shmid = shmget(1234, 0, 0);
if(shmid == -1) {
ERR_EXIT("shmget");
}
STU* p;
p = (STU*)shmat(shmid, NULL, 0);
if((void*)-1 == p) {
ERR_EXIT("shmat");
}
printf("name = %s age = %d\n", p->name, p->age);
memcpy(p, "quit", 4);
shmdt(p);
return 0;
}