Segmentation fault mit der Posix-C-Programm mit mmap und mapfile
Nun habe ich dieses Programm und ich bekomme einen segmentation fault: 11 (core dumped). Nach vielen Prüfungen, die ich bekommen Sie diese, wenn die for-Schleife wird i=1024 und es versucht zu mapfile[i]=0. Das Programm wird über ein server-und einem client-Programm kommuniziert durch Lesen/schreiben in einer gemeinsamen Datei in das server-Programm. Dies ist das server-Programm und es druckt den Wert im inneren vor und nach der änderung. Ich möchte sehen, was passiert, wenn es ein problem mit dem mapping oder einfach nur problem mit Speicher der *mapfile. Danke!
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <errno.h>
#include <math.h>
int main()
{
int ret, i;
int *mapfile;
system("dd if=/dev/zero of=/tmp/c4 bs=4 count=500");
ret = open("/tmp/c4", O_RDWR | (mode_t)0600);
if (ret == -1)
{
perror("File");
return 0;
}
mapfile = mmap(NULL, 2000, PROT_READ | PROT_WRITE, MAP_SHARED, ret, 0);
for (i=1; i<=2000; i++)
{
mapfile[i] = 0;
}
while(mapfile[0] != 555)
{
mapfile = mmap(NULL, 2000, PROT_READ | PROT_WRITE, MAP_SHARED, ret, 0);
if (mapfile[0] != 0)
{
printf("Readed from file /tmp/c4 (before): %d\n", mapfile[0]);
mapfile[0]=mapfile[0]+5;
printf("Readed from file /tmp/c4 (after) : %d\n", mapfile[0]);
mapfile[0] = 0;
}
sleep(1);
}
ret = munmap(mapfile, 2000);
if (ret == -1)
{
perror("munmap");
return 0;
}
close(ret);
return 0;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
In diesem code hier, sehen Sie, dass Sie anfordern, 2000 Einheiten des Gedächtnisses. In diesem Fall mmap ist die Einnahme in einem size_t-Typ, was bedeutet, dass seine Suche nach einer Größe, und nicht eine Menge Dinge für den Speicher. Wie @Mat bereits erwähnt, müssen Sie t verwenden Sie den sizeof(int) - operator, um zu füttern mmap die richtige Größe, die Sie benötigt.
Das andere Problem, das sollte hervorgehoben werden dass dieser code kann zu einem problem für Sie die Straße hinunter, ist zu Beginn der Schleife den index i=1 statt i=0. Starten Sie Ihre index bei 0 wil sicherstellen, dass Sie sind, geht aus den Indizes 0 bis 1999, die dem entspricht, was die Erinnerung, die Sie versuchen zu reservieren.
Insgesamt hier sieht es aus wie das, was Sie zu tun versuchen ist, initialisieren Sie die Werte der Speicher auf 0. könnten Sie vielleicht auch leichter tun, indem Sie sich auf eingebaute Funktion namens memset:
Ihr code wird dann:
docs für memset kann hier gefunden werden:
http://www.tutorialspoint.com/c_standard_library/c_function_memset.htm
Du bist ersuchenden 2000 bytes von
mmap
, aber die Behandlung der zurückgegebene Wert als ein array von 2000 ints. Das kann nicht funktionieren, einint
ist in der Regel 4 oder 8 bytes in diesen Tagen. Sie werden schriftlich über das Ende des reservierten Speichers im loop.Ändern Sie die
mmap
Anrufe zu verwenden2000*sizeof(int)
. Und wenn du schon dabei bist, gib, dass 2000 konstant einen Namen (z.B.const int num_elems = 2000;
oben) und wiederholen Sie nicht die magic Konstante alle über dem Platz. Und wenn ' s dann ändern Sie es auf 1024 oder 2048, so dass die resultierende Größe ist ein Vielfaches der page-Größe (wenn Sie nicht sicher von Ihrer Seite Größegetconf PAGE_SIZE
auf der Kommandozeile).Und auch ändern Sie Ihre
dd
Befehl zum erstellen einer großen-genug-Datei. Es ist derzeit die Schaffung einer 2000-byte-Datei, die Sie brauchen, um zu erhöhen, wie gut.Und überprüfen Sie den Rückgabewert von
mmap
- es kann fehlschlagen, und Sie sollten erkennen, dass.Schließlich nicht ständig neu zuordnen, bist du mit
MAP_SHARED
änderungen durch andere gemeinsame Zuordnungen von den gleichen Datei-und offset wird sichtbar sein, um Ihren Prozess. (Muss wirklich die gleiche Datei sein, wenn der andere Prozess auch nicht eindd
, das könnte nicht funktionieren. Nur ein Prozess soll die Verantwortung haben, erstellen der Datei).Wenn Sie eine zeitverzerrung anwenden möchten, Sie muss auch Abkoppeln jedes mal. Ansonsten sind Sie undicht Zuordnungen.
dd
.