mmap
-
hallo;
ich habe vor mit mmap() mir Blöcke einer Datei in den Arbeitsspeicher zu laden und einzelne Zeichen weiter zu verarbeiten..
... int fd; fd = open("test.cc", O_RDONLY); int pagesize = getpagesize(); char* ch; ch = (char *)mmap((caddr_t)0,pagesize,PROT_READ,MAP_PRIVATE,fr,0); cout<<ch<<endl; ...
Aus irgendeinem Grund wirft der gcc ein Segmentation fault. Weiß einer warum er dies tut und weiß auch jmd. von euch wie ich mein Problem konkret lösen kann?
-
nach "man mmap" wirst du sehen, dass man dateien in der regel wiefolgt mappt (z.b. readonly):
int fd = open(...); void* data = mmap((caddr_t)0, length, PROT_READ, MAP_SHARED, fd, 0);
:xmas1:
edit: wobei length hier nicht die pagesize sondern die anzahl der bytes ausgehend vom offset (letzter parameter) der datei ist, die du gemappt haben möchtest.
edit2: halbherziges lesen ftl
, ich sehe gerade, dass es ja wohl von dir beabsichtigt ist pagesize große blöcke zu mappen. dann ist der einzige fehler, den ich sehen kann, der filedeskriptor, der bei dir eigenartigerweise 'fr' ist :xmas1:
-
danke für die Antwort.
ich glaube den Fehler konnte man an diesem kleinen Codeschnipsel nicht erkennen.
Es gab einen anderen Fehler, der dann einen Segmentation fault auslöste. Denn habe ich bereits behoben. Jetzt sitze ich wieder an dem nächsten Problem.kann man der methode write(int fildes, const void buf, size_t nbyte); als *buf ein char* übergeben, indem man einfach (char) variablenname übergibt?
Der gcc meckert zwar nicht, aber ein Segmentation fault wirft er trotzdem.
-
sharp schrieb:
danke für die Antwort.
ich glaube den Fehler konnte man an diesem kleinen Codeschnipsel nicht erkennen.
Es gab einen anderen Fehler, der dann einen Segmentation fault auslöste. Denn habe ich bereits behoben. Jetzt sitze ich wieder an dem nächsten Problem.kann man der methode write(int fildes, const void buf, size_t nbyte); als *buf ein char* übergeben, indem man einfach (char) variablenname übergibt?
Der gcc meckert zwar nicht, aber ein Segmentation fault wirft er trotzdem.
also ohne code kann man da nur vermuten
-
den Seg. fau. habe ich behoben, aber...
zur Zeit sieht mein Code so aus
... data = (char *) mmap(0, pagesize, PROT_READ, MAP_PRIVATE, fr, /*offset * pagesize*/917504); for(int i = 0; i <10; i++) { cout<<data[i]<<endl; write(fw,(const void*)data[i] ,1); } ...
Der letzte Parameter in mmap bewirkt, dass das letzte Stück bzw. die letzte Page in den Arbeitsspeicher geladen wird. das cout beweist, dass mmap die richtigen Characters gefunden hat, da er sie mir auf den Bildschirm ausgibt. Doch wenn ich die entsprechende Datei öffne, sehe ich nada bzw. Nirwana. Aus irgendeinem Grund hat er mir nichts in die Datei geschrieben.
-
sharp schrieb:
Der letzte Parameter in mmap bewirkt, dass das letzte Stück bzw. die letzte Page in den Arbeitsspeicher geladen wird. das cout beweist, dass mmap die richtigen Characters gefunden hat, da er sie mir auf den Bildschirm ausgibt. Doch wenn ich die entsprechende Datei öffne, sehe ich nada bzw. Nirwana. Aus irgendeinem Grund hat er mir nichts in die Datei geschrieben.
du dereferenzierst data mit [i] und nimmst somit den inhalt von data als pointer für write.
for(int i = 0; i <10; i++) { cout<<data[i]<<endl; write(fw, data+i ,1); }
wäre eine möglichkeit
edit: cout hat übrigens nichts im ansi c code verloren :xmas2:
-
es hat indirekt geklappt...danke
was ich vergessen habe war, das write auf stdout schreibt, was ich durch deinen Code jetzt sehen konnte. Am besten ich benutze fwrite().
edit: cout hat übrigens nichts im ansi c code verloren Rudolf
ja stimmt. wobei zu c++ gehört das Thema auch nicht wirklich. Es sollte eine neue Rubrik geben: posix.
-
vergesst das letzte posting. er hat in stdout geschrieben, weil er in die Datei nicht schreiben konnte, weil ich vorher beim öffnen der Datei den Modus auf RD_ONLY gesetzt habe. Jetzt, nachdem setzten des richtigen Modus, also auf O_WRONLY, gibt er auf Bildschirm nichts aus, aber auf die Datei schreibt er leider auch nicht..