【问题标题】:memory-mapped files in CC中的内存映射文件
【发布时间】:2009-05-26 15:25:23
【问题描述】:

我在 C 中玩弄内存映射文件,想知道是否有 是一种将 fopen 中的 FILE * 透明地替换为内存映射文件的方法。

例子:

FILE * fp = g_fopen(...);

//Program does things to this fp.

fclose();

但是,是否可以让 FILE *fp = my_fopen(...)

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

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

【问题讨论】:

标签: c memory file-io transparency library-interposition


【解决方案1】:

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


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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 对我来说,感知到的优势是能够修改现有调用来做我想做的事情。可能在读取文件之前插入自定义操作或更改读取方式而无需更改现有代码。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-12-08
      • 1970-01-01
      • 2020-11-06
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多