Linux 版 (精华区)

发信人: tcpip (偶的昵称改了), 信区: Linux
标  题: 容易忽视的函数和调用(七)-- mmap
发信站: 哈工大紫丁香 (Wed Jan  5 16:44:34 2000), 转信

发信人: xh (江南白衣), 信区: Unix

标  题: 容易忽视的函数和调用 (七) -- mmap

发信站: 华南网木棉站 (Wed Jan  5 15:10:06 2000), 转信

    mmap()用于将一个文件载入到内存中,是一个很关键的函数。

我们随便trace一些可执行文件,都肯定可以看到以下几句:

    open("/usr/lib/libc.so.1", O_RDONLY)            = 4

    fxstat(2, 4, 0x0804798C)                        = 0

    mmap(0x00000000, 598016,xx, xx ,4 ,0)           = 0xDFB17000

    close(4)                                        = 0

    对,这就是程序载入动态连接库的不二法门。注意,最后一句

close(4),程序与硬盘上的文件脱离关系,此后的操作都是对内存

中的副本进行的,不再影响硬盘上的文件。

    除了为一个文件在内存创建多个副本供不同的进程隔离调用外,

mmap的另一个大用途,就是将需要频繁读取和搜索的文件如数据库

的index文件等等放到内存里,速度将得到巨大的提高.

mmap的原型为:

void *mmap(void *addr, size_t len, int prot, int flags,

           int  fildes, off_t off);

   参数表看上去挺长的,其实看看下面的例子就知道其实很简单。

   其中len一项需要用fstat(int fd, strucct stat* st)获取;

   mmap成功后会返回一个指针,之后对内存中文件的操作将利用该

指针配合fstat获得的文件信息完成。

   内存中文件使用完毕后,用munmap()释放。

   下面,模仿动态链结库的载入,实战一下(忽略判错部分):

#include all need.

int main(int argc, char **argv)

{

    int fd;

    struct stat st;

    caddr_t base,ptr;

    /*打开文件*/

    fd = open(*++argv, O_RDONLY, 0);

    /*将文件状态信息保存在st中,其中包括文件长度*/

    fstat(fd,&st);

    /*载入内存*/

    base = mmap(0,st.st_size, PROT_READ, MAP_SHARED, fd,0);

    /*关闭硬盘上的文件*/

    close(fd);

    /*下面演示载入的情况*/

    for (ptr = base; ptr < &base[st.st_size]; ptr++)

        putchar(*ptr);

    /*清除文件*/

    munmap(base, st.st_size);

}

    狗尾续貂,cpu师兄莫怪...

--

                                                     V2 Studio Xh2000

※ 修改:.xh 于 Jan  5 15:53:14 修改本文.[FROM: 202.38.248.63]

※ 来源:.华南网木棉站 bbs.gznet.edu.cn.[FROM: 202.38.248.62]

--

※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: 202.118.239.10]

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: bin@mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.123毫秒