2017-10-11 24 views
0
int main() { 
    int fd;  // File Descriptor for the integer file 
    int pagesize=getpagesize(); // To store the size of virtual page 

    printf("\nPage size is %d bytes.\n100 integers require %lu bytes\n",pagesize,100*sizeof(int)); 
    void *data; // This is the pointer which will store the returned pointer when mmap() is called 

    fd=open("integer", O_RDWR); 

    data=mmap((caddr_t)0, pagesize, PROT_WRITE | PROT_READ, MAP_SHARED, fd,0); 
    close(fd); 

    sprintf((char*)data,"%d",100); 

    return 0; 
} 

Dies gibt einen Segmentation Fault 11Warum bekomme ich diesen Segmentierungsfehler?

+7

Sie könnten überprüfen, ob mmap() fehlgeschlagen ist. Wenn dies der Fall ist, rufen Sie 'perror()' auf oder prüfen Sie anderweitig 'errno', um zu erfahren, warum es fehlgeschlagen ist. Sie müssen auch überprüfen, ob open() fehlgeschlagen ist. – nos

+0

Ihre Datei "Integer" existiert wahrscheinlich nicht; Sie müssen es zuerst mit einer geeigneten Länge erstellen, eine Datei mit der Länge Null reicht nicht aus ... Wenn Sie es mit 'O_CREAT' öffnen, schreiben Sie einige (genug für Ihre Daten) Bytes, bevor Sie mmapping (seek() ing wird auch tun). – Ctx

Antwort

2

Sie für Fehler von open und mmap überprüfen sollten. Kompilieren Sie außerdem mit Warnungen und fügen Sie die erforderlichen Include-Dateien hinzu. mmap benötigt vor allem einen korrekten Prototyp auf vielen Systemen wegen seiner off_t-Argumente, die Dinge durchbrechen könnten, wenn Sie eine 0 als letztes Argument übergeben.

Aber das ist nicht genug. Existiert die Datei und hat keine Größe? mmap kann glücklich Seiten über das Ende einer Datei hinaus zuordnen, aber der Zugriff auf diese Seiten führt zu Fehlern. Wenn Sie wirklich wollen, dass die Daten in die Datei geschrieben werden, müssen Sie sicherstellen, dass es lang genug dafür ist. Verwenden Sie dazu ftruncate.

Ich frage mich auch, welches Museum Sie Ihre Dokumentation gefunden, wenn es caddr_t als das erste Argument zu mmap erwähnt, aber das ist neben dem Punkt, wenn das kompiliert sollte es auch funktionieren.

Verwandte Themen