2010-03-10 3 views
2

J'essaie de partager deux blocs différents en utilisant un bloc de mémoire partagée en utilisant la bibliothèque shm.h. J'ai écrit l'exemple suivant, où un bloc de mémoire partagée est créé et est assez grand pour contenir deux entiers. Je lui attache ensuite deux nombres entiers et crée deux processus. Le premier processus incrémente le premier entier. Le deuxième processus imprime ensuite la valeur de deux entiers. Mais ce qui se passe est que les deux entiers sont incrémentés.Partage de plusieurs variables via sys/shm.h

Qu'est-ce que je fais mal? Je viens de commencer à apprendre à utiliser la bibliothèque shm.

Voici le code:

#include <sys/sem.h> 
#include <sys/ipc.h> 
#include <sys/types.h> 
#include <sys/shm.h> 

#include <stdio.h> 
#include <unistd.h> 

int main() { 
    // Declare variables 
    int shmID; 
    int *data1; 
    int *data2; 

    // Create a shared memory segment 
    if((shmID=shmget(IPC_PRIVATE, 2*sizeof(int), 0666 | IPC_CREAT))<0) 
    { 
     fprintf(stderr,"Problem initializing shared memory\n"); 
     perror("main"); 
     return -1; 
    } 

    if((data1=shmat(shmID,NULL,0))==(int *)-1) 
    { 
     fprintf(stderr,"Problem attaching memory 1\n"); 
     perror("main"); 
     return -1; 
    } 

    if((data2=shmat(shmID,NULL,0))==(int *)-1) 
    { 
     fprintf(stderr,"Problem attaching memory 2\n"); 
     perror("main"); 
     return -1; 
    } 

    printf("%p %p\n",data1,data2); 
    (*data1)=0; 
    (*data2)=0; 
    if(fork()) 
    { // Process 1 will be the incrementer 
     for(int i=0;i<100;i++) 
    { 
     (*data1)++; 
     printf("IN: %d\n",(*data1)); 
     sleep(1); 
    } 
     printf("IN DONE\n"); 
    } 
    else 
    { 
     while((*data1)<50) 
    { 
     printf("OUT: %d %d\n",(*data1),(*data2)); 
     sleep(1); 
    } 
     printf("OUT DONE\n"); 
    } 
} 

Et ceci est la sortie:

0x7fcd42a97000 0x7fcd42a96000 
IN: 1 
OUT: 1 1 
IN: 2 
OUT: 2 2 
IN: 3 
OUT: 3 3 

Je courais sur cette Gentoo Linux.

Répondre

2

Deux entiers ne sont pas incrémentés. Un entier est incrémenté mais vous l'imprimez à partir de deux adresses de processus qui correspondent à la même mémoire partagée.

Le gestionnaire de mémoire système joue certains jeux dans les coulisses pour résoudre la mémoire partagée. Dans deux processus complètement différents, il ne serait pas surprenant de constater qu'il a associé la mémoire partagée à deux adresses entièrement différentes dans chaque processus. La même chose se passe ici. Il est mappage data1 et data2 pour traiter respectivement les adresses 0x7fcd42a97000 et 0x7fcd42a96000, mais ils pointent vers la même chose dans la mémoire partagée.

Si je comprends ce que vous essayez de tester, d'ajouter et de modifier les lignes:

printf("%p %p\n", data1, data2); 

    (*data1) = 0; 
    (*data2) = 0; 

    int *data3 = data2 + 1; //points 1 int beyond data1 & data2 

    (*data3) = 5; //will always print 5 

    //............ 
    printf("OUT: %d %d %d\n", (*data1), (*data2), (*data3)); 
+0

Merci, qui a travaillé. – kkrizka

1

Je remarqué les deux lignes suivantes:

if((data1=shmat(shmID,NULL,0))==(int *)-1) 

et

if((data2=shmat(shmID,NULL,0))==(int *)-1) 

id_shm ne soit pas changé entre les deux lignes. Cela signifie que vous obtenez le même segment de mémoire partagée pour data1 et data2. Vous devrez créer un autre shmId pour data2 afin que data2 obtienne un segment de mémoire partagée différent.

Questions connexes