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!
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? –
@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
genau das mache ich. Kinder aufteilen und Erinnerungen mit ihren Eltern teilen. Tut mir leid, dass ich das nicht gemacht habe. –