Zyklischer Buffer bei std::ofstream bzw eigene ofstream-Implementierung



  • Hallo,

    folgendes Problem:
    Ich benutze ein Logging-Modul (auf log4cxx basierend), welches ich erweitern möchte.
    Das Modul benutzt intern einen std::ofstream um in Dateien zu schreiben.
    Ich möchte nun, dass ein zyklischer Buffer im Speicher benutzt wird, der mittels memory mapped files nochmal auf Platte gespiegelt wird. (Um Logs im Crash-Fall zu haben - aber das ist jetzt mal Detail). Halten wir fest dass ich gern einen Buffer im Speicher benutzen möchte den ich selbst zur Verfügung stelle und kontrolliere.

    Zunächst dachte ich, dass ofstream ja selbst bereits einen buffer nutzt und ich einfach diesen per
    ofs.rdbuf()->pubsetbuf(buffer, bufferSize);
    auf meinen eigenen Bufferbereich setzen könnte.
    Das funktionierte auch unter Windows, aber nicht unter Linux.
    Nach etwas Recherche hab ich dann erfahren (bzw interpretiert) dass die Implementation dieses Buffers wohl hochgradig "implementation defined" ist, ich darauf also nicht zählen sollte. (falls ihr diesbezüglich verlässliche Infos habt bitte bestätigen)

    Nun also die Frage wie ich herangehen sollte um mein eigenes gewünschtes Verhalten zu implementieren.

    Ich denke der Weg führt über Ableitung von std::filebuf und dann eventuell Überladen von overflow und/oder xsputn.
    Dann widerum überladen von ofstream damit es meinen eigenen filebuf benutzt.
    Seh ich das richtig?
    Ich hab hier irgendwie das Gefühl das Rad neu zu erfinden, was ich gerne vermeiden würde.
    Hat jemand Erfahrung damit?


Log in to reply