2016-04-05 4 views
0

Ich bin in der Lage, eine Struktur über den gemeinsamen Speicher zu senden, aber was ist, wenn ich meineStructure [SIZE] ??Freigeben eines Vektors mit mmap in C

Ich versuche dies mit einem Vektor von ganzen Zahlen. Und mein Problem beginnt mit dem Schriftsteller hier:

int fd, data_size = VECSIZE*sizeof(int), i, numbers[VECSIZE]; 
int *number; 

fd = shm_open("/ex02_1100620", O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR); 

ftruncate(fd, data_size); 

number = numbers; 

srand((unsigned) time(NULL)); 
for(i = 0; i < SIZE; i++){ 
    number[i] = rand()% SIZE + 1; 
} 

number = (int *)mmap(NULL, data_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 

Nun, wenn ich so etwas wie:

number = numbers 

und dann number[SIZE] Positionen drucken es funktioniert, aber wenn ich number[SIZE] nach dem Mmap drucken druckt er alle 0 und tut das gleiche für den Leser.

Ich mache das, aber ich denke, die Fehler zu erfassen, um mein Problem zu erklären, ist nicht wirklich notwendig.

Ich habe diesen Beitrag Sharing an array of structs using mmap gelesen, konnte aber nicht verstehen, was ich falsch mache.

Wenn Sie weitere Informationen zum Code benötigen, sagen Sie es einfach.

+0

Ähm, hier der Autor schreibt, nichts zu der geteilte Erinnerung? – immibis

+0

Da habe ich Probleme. Soll ich einfach Nummer benutzen und Zahlen vergessen? Wenn das der Fall ist sollte ich nicht malloc anstelle von Nummer = Zahlen verwenden? Und wie würde das mit dem Aufruf von mmap funktionieren? – AimForNuts

+0

Ich meine, es schreibt nichts in den geteilten Speicher *, weil du es nicht gesagt hast, dass du das tun sollst * - du stellst 'number' auf' numbers' und schreibst dann eine Reihe von Zahlen durch 'number' (also, zu das Array 'numbers', dann ordnen Sie einen gemeinsamen Speicher zu und setzen' number', um auf den gemeinsamen Speicher zu zeigen. Zu keinem Zeitpunkt haben Sie tatsächlich in den gemeinsamen Speicher geschrieben. – immibis

Antwort

0

Lassen Sie uns überprüfen, was Ihr Programm tut:

  • eine Reihe von int s erstellen/zuteilen numbers genannt.
  • Setzen Sie number auf numbers.
  • Schreiben Sie eine Reihe von Zahlen durch number - weil es auf numbers zeigt, das ist das gleiche wie direkt auf numbers schreiben.
  • Ordnen Sie einen gemeinsamen Speicher zu und setzen Sie number auf den gemeinsamen Speicher.

Was Sie wirklich wollen, ist, dies zu tun:

  • Karte etwas gemeinsam genutzten Speicher und setzen number auf den gemeinsamen Speicher zu zeigen.
  • Schreiben Sie eine Reihe von Zahlen durch number - da es auf den gemeinsamen Speicher zeigt, ist dies das gleiche wie direkt in den gemeinsamen Speicher schreiben.

Hoffentlich ist dies genug Informationen, um Ihren Code zu beheben.

(Beachten Sie, dass seit dem gemeinsam genutzten Speicher, keine Variablennamen haben Sie nicht direkt darauf schreiben kann - das ist, warum wir einen Zeiger verwenden)

+0

Ja, das tut es! Danke für die Antwort, war ein dummer Fehler von mir ... Und ich verstehe jetzt, dass meine zweite Frage über malloc ist ein bisschen dumm, weil Sie auch einige gemeinsame Speicher zuordnen müssen ... es hat wirklich geholfen. Danke vielmals. – AimForNuts

+0

(Ich habe "etwas Shared Memory zuweisen" geändert, um "Shared Memory" zuzuordnen, da es genauer erscheint, aber ich weiß nicht so viel darüber, wie Shared Memory unter Linux funktioniert) – immibis