首页 > 学院 > 开发设计 > 正文

linux共享内存

2019-11-08 01:13:00
字体:
来源:转载
供稿:网友

创建修改共享内存:

#include <stdio.h>#include <sys/ipc.h>#include <sys/shm.h>#include <errno.h>#include <string.h>typedef struct {char* add1;char* add2;}info;int main(){int i = 0;  key_t shm_key = ftok("/home/wade/test/a.tx", 0x19);    int shm_id = shmget(shm_key,1024*1024,0666|IPC_CREAT);   if(shm_id == -1){ PRintf("shmget:%s/n",strerror(errno)); return -1;}    char* space = shmat(shm_id,NULL,0);    if((void*)-1 == (void*)space){printf("%s",strerror(errno));return -1;}printf("address is %p/n",space);((info*)space)->add1=(char*)space +100;((info*)space)->add2=(char*)space +1000;    for(; i< 100; i++)    {       *(((char*)((info*)space)->add1)+i)=i;    }i = 0;for(; i< 100; i++)    {       *(((char*)((info*)space)->add2)+i)=i+10;    }while(1){  sleep(1);} return 0;  }

读取共享内存:

#include <stdio.h>#include <sys/ipc.h>#include <sys/shm.h>#include <errno.h>#include <string.h>typedef struct {char* add1;char* add2;}info;int main(){  int i = 0;  key_t shm_key = ftok("/home/wade/test/a.tx", 0x19);  int shm_id = shmget(shm_key,0,0);   if(shm_id == -1)        {          printf("shmget:%s/n",strerror(errno));          return -1;        }   char* space = shmat(shm_id,NULL,0);    if((void*)-1 == (void*)space)        {         printf("shmat:%s/n",strerror(errno));         return -1;        }printf("address is %p/n",space);

/* 

//错误做法,获取存储的地址

    for(;i<100;i++){ printf("value1 is %d/n",*(((info*)space)->add1)+i);}i=0;for(;i<100;i++){ printf("value2 is %d/n",*(((info*)space)->add2)+i);}

*/

for(;i<100;i++){ printf("value1 is %d/n",*(space+100+i));}i = 0;for(;i<100;i++){ printf("value2 is %d/n",*(space+1000+i));}}

说明:(重要)

共享内存返回的指针地址(通过shmat返回)是各个进程的虚拟内存地址;

共享内存中切勿存储虚拟内存地址,可以通过存储首地址的相对偏移实现。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表