Könnten Sie bitte erklären, warum mein Programm seltsame Werte aus einer Datei liest? Ich versuche eine Datei mit mmap zu lesen. Der Grund, warum ich diese Funktion verwende, ist zu verstehen, wie es funktioniert. Dann würde ich es mit/dev/mem verwenden, um binäre Daten an bestimmten physikalischen Speicheradressen zu lesen.Lesen einer Binärdatei mit mmap()
Ich habe eine Datei 'Hallo1.raw' mit dem folgenden Python-Skript erstellt.
Dann habe ich versucht, es mit dem c-Programm unten zu lesen.
#include <stdio.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
int main(){
int fd = open("hello1.raw",O_RDWR);
struct stat st;
fstat(fd, &st);
size_t size=st.st_size;
int * a = mmap(0, size, PROT_READ|PROT_EXEC ,MAP_SHARED , fd, 0);
printf("address of hello1.raw: %p\n",a);
printf("data in hello1.raw: %d\n", *a);
int b = munmap(a, size);
close(fd);
return 0;
}
Aber dieses Programm druckt seltsamen Wert.
address of hello.raw: 0x10238d000
data in hello.raw: 12592
Die Daten sind nicht 01, sondern 12592.
'd.write (b'01 ')' was soll das heißen? eine Charakterkonstante? 'write()' erwartet drei Argumente, ein int für den Dateideskriptor, einen Puffer (oder Zeiger) für die Daten und einen int für die Größe. (Ok, es ist Python). Verwenden Sie od -CX oder hexdump, um den tatsächlichen Inhalt zu sehen. BTW: mmap() funktioniert auf Speicherseiten. Sie sollten nichts außer dem physischen EOF annehmen. – joop
@joop Vielen Dank für Ihre Antwort. Bedeutet das, dass die von mir erstellte Datei hello1.raw keinen binären Wert 01 enthält? – SD11
Wie gesagt: Verwenden Sie hexdump oder od -X, um den Inhalt zu überprüfen. Und benutze ls, um seine Größe und seinen Modus zu überprüfen. – joop