2009-05-26 5 views
3

Ich spielte mit Memory-Mapped-Dateien in C und fragte mich, ob eine Möglichkeit ist, die FILE * von Fopen durch eine Memory-Mapped-Datei transparent zu ersetzen.Memory-Mapped-Dateien in C

Beispiel:

FILE * fp = g_fopen(...); 

//Program does things to this fp. 

fclose(); 

Aber stattdessen ist es möglich, FILE hat * fp = my_fopen (...)

Wo meine eigene Funktion eine Datei auf der Festplatte Mmap öffnen würde, vielleicht ändern Inhalt und dann die Datei zurück * ohne das Programm sehen nichts anders mit Ausnahme der neuen my_fopen() und my_fclose().

Ist das möglich, ohne die Art und Weise, wie die Operationen im Programm ausgeführt werden, neu schreiben zu müssen?

+0

Diese Antworten für * ix-Systeme sind, Antwort für Windows ist hier: http://stackoverflow.com/questions/7369445/is-there-a-windows-equivalent-to-fdopen-for-handles –

Antwort

5

Die magischen Worte sind "Bibliothek Interposition". Hier ist ein gutes Tutorial: http://developers.sun.com/solaris/articles/lib_interposers.html


Wenn Oracle Sonne scheinen viele Artikel gekauft zu haben, verschwunden sind und/oder nicht zugänglich sind durch Oracle-Website.

Hier einige Links, die zur Zeit, funktionell sind:

+0

Groß link, danke – James

0

Ich verstehe nicht. Sie können Sie mmaped haben sich auf eine Datei lesen/schreiben verwenden, so dass Ihr my_fopen wie diese

FILE * my_fopen() 
{ 
    FILE * myfp 
    myfp = fopen(...); 
    mmap(fileno(myfp),...); 
    return myfp; 
} 
2

Der Zweck der Memory-Mapped-Datei IO aussehen würde nicht System durchlaufen fordert liest und schreibt, sondern stützen sich auf VM/Puffer-Cache, um die Arbeit zu erledigen. Wenn Sie die Tatsache verbergen, dass die Datei im Speicher abgelegt wurde, was ist der Vorteil hier? Woher wissen Sie, an welche Adresse die Datei gemappt wurde?

+0

Der wahrgenommene Vorteil für mich war die Fähigkeit, bestehende Anrufe zu ändern, um zu tun, was ich wünsche. Fügen Sie möglicherweise benutzerdefinierte Aktionen ein, bevor eine Datei gelesen wird, oder ändern Sie die Art des Einlesens, ohne den vorhandenen Code ändern zu müssen. – James