2016-07-02 16 views
-2

Ich versuche, diesen Code zu laufen, während ich bin mit Endung - Wert: 1 Wert: 0.000000Was ist falsch mit diesem Code des Lesens mit mmap?

Meine Frage ist, warum die beiden Ergebnisse unterschiedlich sind ??

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <sys/mman.h> 
#include <string.h> 
#include <unistd.h> 

int main() 
{ 
int fd; 
struct stat mystat; 
void *pmap; 
int i,integer; 
double *values; 
int32_t *mapped_baseA; 
int32_t fdA; 


fd = open("test.txt",O_RDWR); // a text file containing- 1 2 3 4 5 
if(fd==-1) 
{ 
perror("open"); 
exit(1); 
} 

if(fstat(fd,&mystat)<0) 
{ 
perror("fstat"); 
close(fd); 
exit(1); 
} 

pmap = mmap(0,mystat.st_size,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0); 
if(pmap==MAP_FAILED) 
{ 
perror("mmap failed"); 
close(fd); 
exit(1); 
} 

//strncpy(pmap,"That is my name",15); 
sscanf (pmap, " %d", &integer); 
printf("value: %d \n", integer); 

// Drucken der Werte nach dem Scannen aus Zeichenfolge.

values = (double *) mmap(0,mystat.st_size,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0); 

printf("value: %lf \n", values[1]); 

// Drucken der Werte von den Zeiger munmap (PMAP, mystat.st_size);

close(fd); 
return 0; 
} 
+1

'eine Textdatei, die 1 2 3 4 5 enthält, wird nicht automatisch verdoppelt, wenn mmap() Ed. Es wird für das Programm als (großes) Char-Array auftreten. UND: Sie sollten darauf achten, die Größe bis zu einer Seitenlänge zu runden. (und ignorierte den aufgerundeten Teil) – wildplasser

Antwort

1

sorgfältig lesen (und mehr mal) mmap(2). Hinweis:

Eine Datei wird in Vielfachen der Seitengröße zugeordnet.

und in dem Abschnitt ERRORS

EINVAL Wir möchten nicht addr, Länge oder Offset (beispielsweise sind sie zu groß ist, oder nicht, auf einer Seitengrenze ausgerichtet).

Verwenden Sie auch strace(1) auf Ihrer ausführbaren Datei.

Natürlich ist eine Speicherabbildung ist, gibt nur eine Ansicht (als Ausgangssequenz vonBytes) der abgebildeten Datei in die process durch seine virtual address space modifizieren. Es wird natürlich keine Konvertierung durchgeführt (Sie könnten oder strtol(3) für Teile dieser Ansicht verwenden, um eine solche Umwandlung von einer UTF8- oder ASCII-Zeichenfolgendarstellung einer Zahl in ihre Maschinendarstellung vorzunehmen).

+0

Ich tat dies nur, um den Ergebnisfehler zu sehen. Lediglich die mmap mit dem Typ Double Cast ist erforderlich, andere können gelöscht werden. –

+0

Ich möchte nur eine Datei, die 1 2 3 4 5 enthält, auf eine Variable "Werte" abbilden. aber es gibt 0.0000 beim Drucken zurück. Warum? –