一.共享内存数据结构
对于每个共享内存区,内核维护如下信息结构,定义在<sys/shm.h>, 在ubuntu中路径:/usr/include/linux/shm.h
参数:
key: 这个共享内存段名字
size: 共享内存大小
shmflg:
由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的
IPC_RMID 删除共享内存段
shmwrite.c
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<sys/types.h>
#include<unistd.h>
#include<errno.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/mman.h>
#include<sys/ipc.h>
#include<sys/shm.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 err");
STU *p;
p = shmat(shmid,NULL,0);//将共享内存段连接到进程地址空间
if(p == (void*)-1) //error (void *) -1 is returned
ERR_EXIT("shmat err");
strcpy(p->name,"list");
p->age = 20;
while(1) // 等待,接收内存中有quit字符串时,代表读取完成
{
if(memcmp(p,"quit",4) == 0)// 需要注意的是,这里比较的是内存
break;
}
//sleep(10);
shmdt(p);//将共享内存段与当前进程脱离
shmctl(shmid,IPC_RMID,NULL);
return 0;
}shmread.c
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<sys/types.h>
#include<unistd.h>
#include<errno.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/mman.h>
#include<sys/ipc.h>
#include<sys/shm.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 err");
STU *p;
p = shmat(shmid,NULL,0);//将共享内存段连接到进程地址空间
if(p == (void*)-1) //error (void *) -1 is returned
ERR_EXIT("shmat err");
printf("name=%s age=%d\n",p->name,p->age);
memcpy(p,"quit",4); // 读取完数据后,向内存中写入4个字节的数据,代表读取完成
shmdt(p);//将共享内存段与当前进程脱离
return 0;
}
原文地址:http://blog.csdn.net/u014304293/article/details/45939015