Wie Zugriff auf Variablen im shared memory
Ich versuche zu erstellen, ein shared-memory-segment mit drei Integer-Werten und ein array. Das segment wird erstellt und ein Zeiger angebracht ist, aber wenn ich versuche, Zugriff auf die Werte der Variablen (egal ob ändern, drucken, etc.) Ich bekomme einen segmentation fault.
Hier ist der code, den ich versuchte:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#define SIZE 10
int* shm_front;
int* shm_end;
int* shm_count;
int* shm_array;
int shm_size = 3*sizeof(int) + sizeof(int[SIZE]);
int main(int argc, char* argsv[])
{
int shmid;
//create shared memory segment
if((shmid = shmget(IPC_PRIVATE, shm_size, 0644)) == -1)
{
printf("error in shmget");
exit(1);
}
//obtain the pointer to the segment
if((shm_front = (int*)shmat(shmid, (void *)0, 0)) == (void *)-1)
{
printf("error in shmat");
exit(1);
}
//move down the segment to set the other pointers
shm_end = shm_front + 1;
shm_count = shm_front + 2;
shm_array = shm_front + 3;
//tests on shm
*shm_end = 10; //gives segmentation fault
printf("\n%d", *shm_end); //gives segmentation fault
//clean-up
//get rid of shared memory
shmdt(shm_front);
shmctl(shmid, IPC_RMID, NULL);
printf("\n\n");
return 0;
}
Ich habe versucht, den Zugriff auf den gemeinsam genutzten Speicher durch dereferenzieren der Zeiger auf die struct, bekam aber einen segmentation fault, jedes mal.
Danke an alle, keine Segmentierung Fehler jetzt.
- Versucht post-Vorschlag hier, aber die Formatierung sah schrecklich aus..siehe Antwort unten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Ihrem code, den Sie nicht gehören
sys/shm.h
, das sollte dazu führen, dass dein compiler ausspuckt diese:Casting der Rückgabewert von
shmat
zu einemint *
auch hide diese Warnung:Was passieren kann, ist, dass hier seit der
shmat
ist nicht definiert, kann der compiler implizit haben Sie wieder eineint
statt einervoid *
. Wenn die Adresse zurückgegeben, durch die es passt nicht in eine Ganzzahl mit Vorzeichen, erhalten Sie einen integer-überlauf, was zu undefiniertem Verhalten, und wird wahrscheinlich Ursache ein "segmentation fault") für den Zugriff auf einen nicht zugeordneten Speicherbereich.Sollten Sie nicht umgewandelt den Rückgabewert einer Funktion zurückgeben
void *
speziell zu fangen, diese Fehler (und immer kompilieren mit Warnungen aktiviert, auch).shm_front
, nichtshm_end
die10
.-Wall
) zu sehen, jene.void *
(wieshmat
odermalloc
), und immer stellen Sie sicher, dass Sie die richtigen header-Dateien. Das ist es.Ich weiß nicht, ob dies ist Ihre einzige problem, aber diese Zeile
wahrscheinlich nicht, was Sie wollen.
sizeof(shm_array[SIZE])
ist nur die Größe einesint
und nicht ein array. Wenn Sie möchten, dass Sie verwenden solltensizeof(int[SIZE])
.Und generell finde ich die moderne Oberfläche, die für gemeinsame Segmente
shm_open
, viel einfacher zu bedienen. Es funktioniert Analog zu Datei öffnen und mapping und hat weniger Constraints über segment-Größen.Diese war eigentlich gedacht als eine Verfeinerung Frage, aber der formatter blies es auf und machte es unleserlich, so dass ich ' m verschieben auf eine Antwort...
Vielleicht bin ich auch nur bei dieser Suche schief an, aber wäre es nicht Ihre Zeiger wie folgt:
Die erste Ganzzahl gespeichert werden würde an der Spitze des Blocks, direkt an shm_front, und dann so weiter auf der ganzen Linie...es sei denn, die shared-memory-block enthält einige relevante info bei offset 0, ich weiß nicht, warum Sie ausgeglichen würde diese bei jedem...nur eine Beobachtung.