2010-12-11 4 views
1

Ich arbeite mit Shared-Memory-Segmenten und stieß auf dieses bizarre Problem.Initialisierungsproblem beim gemeinsamen Speicher (c)

Ich versuche, eine Struktur zwischen vielen Prozessen zu teilen:

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]); 
} 

Aber immer, wenn ich erstelle und fügen Sie das Shared-Memory-Segment, shmobj-> pid [1] bereits mit dem Wert 2673 initialisiert wird!

Das Ergebnis printf ist IMMER:

shminit:i:1 user: pid:2673 

Alle Ideen, warum dies geschieht?
Vielen Dank im Voraus!

Antwort

3

Shared Memory-Segmente verschwinden nicht notwendigerweise, wenn sich alle Prozesse von ihnen lösen. Es besteht eine gute Chance, dass Ihr Server sich einfach an ein bereits bestehendes Segment anfügt.

IPC_CREATE nicht Kraft Schöpfung, es erlaubt Schöpfung, wenn das Segment noch nicht existiert.

Sie können mit shm_unlink() untersuchen, um gemeinsam genutzte Speichersegmente ordnungsgemäß zu entfernen, oder die Befehlszeile shmdel, um dies zu testen funktioniert.

+0

Vielen Dank für Ihre Einsicht! Es scheint, dass IPC_PRIVATE sicherstellen kann, dass ich ein frisches neues shm-Segment bekomme. Kann ich eine Bestätigung bekommen? –

+1

@Littledot, ich denke aus dem Speicher, dass funktioniert, wenn Sie zuerst das Segment erstellen und dann die Kinder abzweigen. Andernfalls besteht keine Möglichkeit, den Speicher tatsächlich zu teilen. – paxdiablo

+0

genau das mache ich. Kinder aufteilen und Erinnerungen mit ihren Eltern teilen. Tut mir leid, dass ich das nicht gemacht habe. –

Verwandte Themen