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毫秒