linux共享内存

2/22/2017来源:ASP.NET技巧人气:978

创建修改共享内存:

#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返回)是各个进程的虚拟内存地址;

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