2009-12-25 2 views
3

Je souhaite allouer de la mémoire partagée en tant que matrice 2D à l'aide d'IPC. J'ai essayé ce qui suit:Est-il possible d'allouer un tableau 2D en tant que mémoire partagée avec IPC?

id_shmem = shmget(ipc_key, sizeof(int)*rows*columns, IPC_CREAT|0666); 

matrix = (int **)shmat(id_shmem, 0, 0); 

Le problème est que chaque fois que j'essaye d'écrire quelque chose dans la matrice, j'obtiens un défaut de segment.

+0

Afficher le code qui provoque le défaut de segmentation. –

Répondre

13

int ** n'est pas un tableau 2D, c'est plutôt un tableau de pointeurs. Vous ne devez pas stocker de pointeurs dans la mémoire partagée car le segment de mémoire partagée peut être alloué à différentes adresses dans différents processus. Essayez d'utiliser un tableau 1D simple et plat, qui "émule" le tableau 2D avec un peu de magie d'index, c'est-à-dire.

x,y -> y*width+x 
+0

Ok, compris. – miguelSantirso

+0

C'est aussi la voie à suivre lorsque la performance compte - même pour des utilisations non IPC! – Chris

3

La pratique courante avec des structures dans la mémoire partagée est de stocker des décalages et non des pointeurs. C'est pour contourner le fait que la mémoire peut être mappée à différentes adresses virtuelles dans différents processus.

Une autre approche courante consiste à laisser d'abord traiter l'adressage fourni par le système d'exploitation et ensuite passer l'adresse virtuelle résultante à tous les autres processus qui doivent être attachés à la même mémoire et leur demander un mappage fixe à cette adresse.

Questions connexes