共享内存
使用共享内存的一般步骤:
(1)获取共享内存的ID;
(2)将共享内存映射到本进程虚拟内存空间的某个区域;
(3)不再使用时,接触映射;
(4)不需要时,删除它。
注意:创建的共享内存是物理内存,必须要映射到本进程的内存空间才能使用。
IPC_STAT获得的属性信息查找课本或其他资料
代码演示:
p1发送信息给p2
int main()
{
int shmid;
key_t key = ftok("/home/gec",1000);
//申请共享内存
shmid=shmget(key,1024,IPC_CREAT|IPC_EXCL|0777); //新建共享内存
if(shmid==-1)
{
//进一步分析错误原因
if(errno==EEXIST) //共享内存已经存在
{
shmid=shmget(key,1024,0777); //打开共享内存
}
else //其他错误
{
perror("申请失败!\n");
return -1;
}
}
//映射得到首地址
char *p=shmat(shmid,NULL,0);
if(p==NULL)
{
perror("映射失败!\n");
return -1;
}
//通过共享内存发送信息给p2
while(1)
{
printf("请输入要发送给p2的信息!\n");
scanf("%s",p);
}
//shmctl(shmid,IPC_RMID,NULL);//删除共享内存
}
p2接收p1信息:
int main()
{
int shmid;
key_t key = ftok("/home/gec",1000);
//申请共享内存
shmid=shmget(key,1024,IPC_CREAT|IPC_EXCL|0777); //新建共享内存
if(shmid==-1)
{
//进一步分析错误原因
if(errno==EEXIST) //共享内存已经存在
{
shmid=shmget(key,1024,0777); //打开共享内存
}
else //其他错误
{
perror("申请失败!\n");
return -1;
}
}
//映射得到首地址
char *p=shmat(shmid,NULL,0);
if(p==NULL)
{
perror("映射失败!\n");
return -1;
}
//访问p1存放到共享内存中的信息
while(1)
{
printf("共享内存中p1发送过来的信息是:%s\n",p);
shmdt(p);//读完数据,解除映射
}
}
获取共享内存属性信息:
#include "myhead.h"
/*
获取共享内存的属性信息
*/
int main()
{
int shmid;
key_t key = ftok("/home/gec",1000);
//申请共享内存
shmid=shmget(key,1024,IPC_CREAT|IPC_EXCL|0777); //新建共享内存
if(shmid==-1)
{
//进一步分析错误原因
if(errno==EEXIST) //共享内存已经存在
{
shmid=shmget(key,1024,0777); //打开共享内存
}
else //其他错误
{
perror("申请失败!\n");
return -1;
}
}
//定义结构体变量,用于存放获取到的属性信息
struct shmid_ds myds;
//获取你刚才申请成功的那个共享内存的属性信息
shmctl(shmid,IPC_STAT,&myds);
printf("大小是:%ld\n",myds.shm_segsz);
printf("键值是:%x\n",myds.shm_perm.__key);
printf("权限是:%o\n",myds.shm_perm.mode);
}