2010-12-11 67 views
1

Je travaille avec des segments de mémoire partagée et j'ai rencontré ce problème de bizzare.Problème d'initialisation de mémoire partagée (c)

Je suis en train de partager un struct entre de nombreux processus:

struct shmstruct{ 
    int pid[50]; 
    char user[50][10]; 
}; 

struct shmstruct *shmobj; 
void *shmp; 

int main() 
{ 
    //server creates shared memory 
    if((shmid = shmget((key_t)1234,sizeof(struct shmstruct),0666|IPC_CREAT)) == -1){ 
     fprintf(stderr,"shmget failed\n"); 
     exit(EXIT_FAILURE); 
    } 

    //server attaches shared memory segment to pointer (void *) 
    if((shmp = shmat(shmid,(void *) 0,0)) == (void *)-1){ 
     fprintf(stderr,"shmat failed\n"); 
     exit(EXIT_FAILURE); 
    } 

    //structure is now linked with shared memory pointer 
    printf("Memory attached at %X\n",shmp); 
    shmobj = (struct shmstruct *)shmp; 

    int i; 
    for(i = 0; i < 50; i++) 
     if(shmobj->pid[i]!=0) 
      printf("shminit:i:%d user:%s pid:%d\n", i, shmobj->user[i], shmobj->pid[i]); 
} 

Mais chaque fois que je crée et fixer le segment de mémoire partagée, shmobj-> pid [1] est déjà initialisé avec la valeur 2673!

Le résultat de printf est TOUJOURS:

shminit:i:1 user: pid:2673 

Toutes les idées sur les raisons de ce qui se passe?
Merci d'avance!

Répondre

3

Les segments de mémoire partagée ne disparaissent pas nécessairement lorsque tous les processus s'en détachent. Il y a de fortes chances que votre serveur se connecte simplement à un segment déjà existant.

IPC_CREATE ne le fait pas la force création, il permet la création si le segment n'existe pas encore.

Vous pouvez utiliser shm_unlink() pour supprimer correctement les segments de mémoire partagée, ou la ligne de commande shmdel pour tester cela fonctionnera.

+0

Merci beaucoup pour votre avis! Il semble que IPC_PRIVATE peut m'assurer que je reçois un nouveau segment de shm frais. Puis-je avoir une confirmation à ce sujet? –

+1

@Littledot, je pense à partir de la mémoire qui fonctionnera si vous créez le segment d'abord, puis fourchez les enfants. Sinon, il n'y a aucun moyen de réellement partager la mémoire. – paxdiablo

+0

c'est exactement ce que je fais. Forking enfants et partage de la mémoire avec leurs parents. Désolé de ne pas avoir mis ça. –