使用共享内存和矩阵

我想在共享内存段中创建一个矩阵。 在我的第二个程序中,我可以读取tailleXtailleY但我的矩阵的值只有’0’。 我在我的函数initialiserSegMem创建我的矩阵,值很好……就像我总是指针有问题…

我的struct mem_share:

 typedef struct mem_partage{ int** carte; int tailleY; int tailleX; }mem_share; mem_share initialiserDonneeMem(grille* g){ mem_share mem_share_carte; int x = g->tailleX; int y = g->tailleY; int i,j; mem_share_carte.carte = malloc(y*sizeof(int*)); for(i=0;i carte; mem_share_carte.tailleY = y; mem_share_carte.tailleX = x; return mem_share_carte; } void initialiserSegMem(mem_share *mem_share_carte){ int shmid,id_memoire,i,j; int test = 100; int *adresse_mem; key_t cle; cle = 9999; /* Creation of the shared memory segment */ if(shmget(cle,(int) sizeof(mem_share) ,IPC_CREAT | IPC_EXCL | 0777)== -1) { printf("Erreur : Segment de mémoire partagée existant"); } /*on attache le segment a notre espace memoire */ id_memoire = shmget(cle,0,0); adresse_mem = shmat(id_memoire,NULL,0); /* les 2premiers int seront les tailles Y et X*/ printf("tailleY %d zzzz",mem_share_carte->tailleY); memcpy(adresse_mem,&mem_share_carte->tailleY,sizeof(int)); adresse_mem+=sizeof(int); memcpy(adresse_mem,&mem_share_carte->tailleX,sizeof(int)); adresse_mem+=sizeof(int); for(i=0;itailleY;i++){ printf("\n"); for(j=0;jtailleX;j++){ memcpy(adresse_mem,&(mem_share_carte->carte[i][j]),sizeof(int)); adresse_mem+=sizeof(int); } } } 

在我的第二个程序中,我正在尝试阅读共享的记忆:

 int shmid,tailleY,tailleX,y,x; int *adresse_mem; key_t cle; /* on recupere la cle du segment */ cle = 9999; if ((shmid = shmget(cle, 0, 0666)) < 0) { perror("shmget"); exit(1); } /* * on attache le segment a notre espace memoire */ if ((adresse_mem = shmat(shmid, NULL, 0)) == (char *) -1) { perror("shmat"); exit(1); } /* * on lit le segment : * - on recupe la taille y * - puis la taille x * - puis la carte */ memcpy(&tailleY,adresse_mem,sizeof(int)); adresse_mem+=sizeof(int); printf("tailleY %d",tailleY); memcpy(&tailleX,adresse_mem,sizeof(int)); printf("tailleX %d",tailleX); adresse_mem+=sizeof(int); int** carte; carte = malloc(tailleY*sizeof(int*)); for(y=0;ytailleX;x++){ memcpy(&carte[y][x],adresse_mem,sizeof(int)); adresse_mem+=sizeof(int); } } /* affichage de la carte */ for(y = 0;y<tailleY;y++){ printf("\n"); for(x = 0;x<tailleX;x++){ printf("%d ",carte[y][x]); } } 

顺便说一下,在我的第一个程序中,我必须在共享内存中更新我的矩阵,所以我可以用我的新矩阵调用initialiserSegMem吗?

一个简单的示例代码。 子级和父级使用System V共享内存段共享2D向量。 sizeElement用于数据类型更改时的偏移估计。 这里使用了double 。 函数返回的代码没有error handling。

 #include  #include  #include  #include  #include  unsigned int sizeof_dm(int rows, int cols, size_t sizeElement){ size_t size = rows * (sizeof(void *) + (cols * sizeElement)); return size; } void create_index(void **m, int rows, int cols, size_t sizeElement){ int i; size_t sizeRow = cols * sizeElement; m[0] = m+rows; for(i=1; i