3

我正在玩 C 中的内存映射文件,想知道是否有办法用内存映射文件透明地替换 fopen 中的 FILE *。

例子:

FILE * fp = g_fopen(...);

//Program does things to this fp.

fclose();

但相反,是否有可能 FILE *fp = my_fopen(...)

我自己的函数会在磁盘上打开一个文件 mmap 它,可能会更改内容,然后传回 FILE *,除了新的 my_fopen() 和 my_fclose() 之外,程序没有看到任何不同。

这是否可以在不必重写程序中完成操作的方式的情况下完成?

4

3 回答 3

5

神奇的词是“图书馆介入”。这是一个很好的教程:http: //developers.sun.com/solaris/articles/lib_interposers.html


当 Oracle 购买 sun 时,许多文章似乎已经消失和/或无法通过 Oracle 的网站访问。

以下是一些暂时可用的链接:

于 2009-05-26T15:29:50.923 回答
2

内存映射文件 IO 的目的不是通过系统调用进行读写,而是依靠 VM/缓冲区缓存来完成工作。如果隐藏文件已被内存映射的事实,这里有什么优势?你怎么知道文件映射在哪个地址?

于 2009-05-26T15:34:53.097 回答
0

我不明白。您可以对已映射的文件使用读/写,因此您的 my_fopen 看起来像这样

FILE * my_fopen()
{
    FILE * myfp
    myfp = fopen(...);
    mmap(fileno(myfp),...);
    return myfp;
}
于 2009-05-26T15:34:14.143 回答