荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: FreeBSD (FreeBSD), 信区: Linux
标  题: 容易忽视的函数和调用 (七) -- mmap(zz)
发信站: BBS 荔园晨风站 (Sat Jan  8 17:52:42 2000), 站内信件

【 以下文字转载自 FreeBSD 的信箱 】
【 原文由 liugang.bbs@melon.gznet.edu.cn 所发表 】
发信人: xh (江南白衣), 信区: Unix
标  题: 容易忽视的函数和调用 (七) -- mmap(zz)
发信站: 华南网木棉站 (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文件等等放到内存里,速度将得到巨大的提高.

平台: Solaris,FreeBSD及其他
原型:
      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 21:35:31 修改本文.[FROM: 202.38.248.63]
※ 来源:.华南网木棉站 bbs.gznet.edu.cn.[FROM: 202.38.248.62]
--
※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: 210.39.3.50]
--
※ 转载:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 210.39.3.71]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店