您的位置:首页 > 运维架构 > Linux

linux中共享内存示例

2016-04-30 15:14 316 查看
/*所需头文件     #include<sys/ipc.h>
#include<sys/type.h>
#include<sys/shm.h>

函数原型         int shmget(key_t key,int size,int shmflg)

函数参数:       key :IPC_PRIVATE 或 ftok的返回值
size:共享内存区大小
shmflg:权限位

返回值:     成功:共享内存段标识符
失败:-1

函数原型:   void *shmat(int  shmid,const  void  *shmaddr,int   shmflg)

函数参数:    shmid:要映射的共享内存区标识符
shmaddr:将共享内存映射到指定地址(NULL表示由系统自动完成映射)
shmflg:SHM_RDONLY : 共享内存只读
默认0 :可读写

函数返回值:   成功:映射后的地址
失败:-1

函数原型:    int  shmdt(const  void *shmaddr)

函数参数:    shmaddr:共享内存映射后的地址

返回值:      成功:0
失败:-1

函数原型:   int shmctl(int shmid,int cmd,struct shmid_ds  *buf)

函数参数:    shmid:要操作的共享内存段标识符
cmd:   IPC_STAT :获取对象属性
IPC_SET : 设置对象属性
IPC_RMID:删除对象      (此时buf为NULL)
buf : 指定IPC_STAT / IPC_SET时用以保存/设置属性

函数返回值:    成功:0
失败:-1

示例:*/
read.c

#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>

int main()
{
key_t key = ftok("/home",1122);
if(key == -1)
{
perror("ftok fail!\n");
return -1;
}
int id = shmget(key,0,0);          //打开共享内存段
if(id == -1)
{
perror("open fail!\n");
return -1;
}

char *p = shmat(id,NULL,0);         //返回映射后的地址
if(p == NULL)
{
perror("shmat fail!\n");
return -1;
}

printf("%s\n",p);                //读出内容

shmdt(p);                         //撤销共享内存映射
shmctl(id,IPC_RMID,NULL);         //删除共享内存对象
return 0;
}

write.c

#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<string.h>

int main()
{
key_t key = ftok("/home",1122);      //用路径和整数创建唯一的key
if(key == -1)
{
perror("ftok fail!\n");
return -1;
}
int id = shmget(key,4096,IPC_CREAT | 0660);    //生成共享内存段标识符
if(id == -1)
{
perror("shmget fail!\n");
return -1;
}

char *p = shmat(id,NULL,0);       //返回映射地址
if(p == NULL)
{
perror("shmat fail!\n");
return -1;
}

strcpy(p,"hello word!");       //写入内容

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: