write methode mit O_DIRECT



  • hi community!

    Ich stehe mal wieder vor einem Problem, dass sich leider nicht mit google hat lösen lassen 😃

    Ich muss in Systemprogrammierung einen Buffer schreiben, der mittels Flag O_DIRECT Speicher auf der Platte ausrichtet und allokiert...

    Speicher allokieren mache ich mit posix_memalign(....)

    Im Konstruktor habe ich momentan das hier stehen, das funktioniert auch einwandfrei

    file_descriptor_read = open("test2", O_RDONLY|O_DIRECT);
    		posix_memalign((void **)&ptr_read, pagesize , (pagesize * 2));
    
    		file_descriptor_write = open("write", O_APPEND|O_WRONLY|O_CREAT|O_DIRECT); //O_RDWR|O_CREAT|O_DIRECT
    		posix_memalign((void**)&ptr_write, pagesize, pagesize);
    

    lesen mit read aus einer Datei funktioniert auch...nur beim Schreiben bekomme ich nen Fehler...

    len_write = write(file_descriptor_write, test, pagesize);
    

    hier liefert write in len_write den wert -1. test ist hier ein char puffer test[index]...sobald index == pagesize, dann soll in die Datei "write" geschrieben werden....die datei wird auch erstellt, nur leider bekomme ich folgende fehlermeldung, wenn ich die datei öffnen will:

    Failed to open file '/home/user/workspace/Buffer/write': Keine Berechtigung
    


  • Kann denn keiner helfen?



  • hier liefert write in len_write den wert -1.

    Du musst errno auswerten, dann sagt er dir den genauen Fehler.

    test ist hier ein char buffer[index]

    Warum nimmst du nicht den memaligned buffer? O_DIRECT hat spezifische Alignment-Anforderungen. (Siehe [url=http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html]open(2)[/man])

    die datei wird auch erstellt, nur leider bekomme ich folgende fehlermeldung, wenn ich die datei öffnen will:

    Schau dir halt an welche Rechte die Datei hat.



  • also hab mir mal errno ausgeben lassen, ist anscheindend nr. 22 --> #define EINVAL 22 /* Invalid argument */

    EINVAL
        fd is attached to an object which is unsuitable for writing; or the file was opened with the O_DIRECT flag, 
    and either the address specified in buf, the value specified in count, or the current file offset is not suitably aligned.
    

    mit dem memaligned buffer hat es nicht funktioniert, wollte es dann mit nem lokalen puffer probieren,wenn mein test[pagesize] (pagesize = 4096) voll ist, dann sollte eigentlich alles in die datei geschrieben werden...

    wahrscheinlich habe ich einen falschen Parameter angegeben, weiss jetzt aber nicht genau woran es liegt...



  • ja den memaligned buffer nehme ich wenn mein buffer[pagesize] (pagesize = 4096) voll ist, dann sollte eigentlich alles in die datei geschrieben werden...

    In dem write Aufruf nimmst du aber nicht den memaligned buffer sondern test. Das wird das Problem sein.



  • ok, ich hab die Rechte fürn Zugriff nicht angegeben...ja und ich muss natürlich auch den zeiger angeben, mit dem ich den Speicherplatz allokiert habe, den lokalen buffer hab ich nur genutzt um zu testen, weils vorher mit dem ptr_write nicht ging...ok jetzt gehts...Danke!


Anmelden zum Antworten