创建修改共享内存:
#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返回)是各个进程的虚拟内存地址;
共享内存中切勿存储虚拟内存地址,可以通过存储首地址的相对偏移实现。
新闻热点
疑难解答