荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店