曲径通幽论坛
标题:
mmap 函数相关应用
[打印本页]
作者:
beyes
时间:
2009-2-15 22:09
标题:
mmap 函数相关应用
代码:
01
#include <unistd.h>
02
#include <stdio.h>
03
#include <sys/mman.h>
04
#include <fcntl.h>
05
#include <stdlib.h>
06
07
typedef
struct
{
08
int
integer;
09
char
string[
24
];
10
} RECORD;
11
12
#define NRECORDS (100)
13
14
int
main
()
15
{
16
RECORD record,
*
mapped;
17
int
i, f;
18
FILE
*
fp;
19
20
fp
=
fopen(
"records.dat"
,
"w+"
);
21
22
for
(i
=
0
; i
<
NRECORDS; i
++
) {
23
record.integer
=
i;
24
25
sprintf(record.string,
"RECORD-%d"
, i);
26
27
fwrite(
&
record,
sizeof
(record),
1
, fp);
28
}
29
30
fclose(fp);
31
32
fp
=
fopen(
"records.dat"
,
"r+"
);
33
fseek(fp,
43
*
sizeof
(record), SEEK_SET);
34
fread(
&
record,
sizeof
(record),
1
, fp);
35
36
record.integer
=
143
;
37
sprintf(record.string,
"RECORD-%d"
, record.integer);
38
39
fseek(fp,
43
*
sizeof
(record), SEEK_SET);
40
fwrite(
&
record,
sizeof
(record),
1
, fp);
41
fclose(fp);
42
43
f
=
open(
"records.dat"
, O_RDWR);
44
mapped
=
(RECORD
*
)mmap(
0
, NRECORDS
*
sizeof
(record), PROT_READ|PROT_WRITE , MAP_SHARED, f,
0
);
45
46
mapped[
43
].integer
=
243
;
47
sprintf(mapped[
43
].string,
"RECORD-%d"
, mapped[
43
].integer);
48
49
msync((
void
*
)mapped, NRECORDS
*
sizeof
(record), MS_ASYNC);
50
munmap((
void
*
)mapped, NRECORDS
*
sizeof
(record));
51
52
close(f);
53
54
exit(
0
);
55
56
}
作者:
beyes
时间:
2009-2-15 22:52
程序分析
:
16. 定义一个 RECORD 结构体变量 record 和 一个指针 mapped
20. 创建或更新 records.dat 文件,获得文件流指针传给 fp
25. 整数 i 通过 sprintf 函数转变为字符串形式存入 record.string 中
27. 一次把一个结构体数据写向文件流,即是把结构体数据写向 records.dat 文件中
30. 关闭文件流
32. 以 r+ 的方式打开 records.dat(r+打开可读写文件前提是该文件必须存在),建立文件流
33. 定位到 records.dat 文件中的第 43 个结构体位置处
34. 读取第 43 个结构体单元内容到 record 变量中
36. 改变整数元素为 143
37. 143整数值转变为字符串存入 record.string 中
39. 再次定位到第 43 个结构体单元处,因为在 34 中读取后指针已经下移到第 44 个结构体单元处
40. 把修改后的数据写回到文件中
41. 写完后关闭文件流
43. 通过系统调用
44. 在 mmap 函数中,第一个参数 0 ,表示自动分配内存区域指针; 第二个参数指定要映射多大的内存空间;第四个参数,表明此块内存空间可读可写;第五个参数,表明允许共享这块空间;第六个参数,为文件句柄(文件句柄是文件在文件描述符表里的索引);第七个参数,表示不明确指定地址(?)
46. 通过 mmap 函数已经把文件映射到了内存块中,这里修改的是内存块,而不是直接在修改文件
47. 修改相应的字符串值
49. 通过 msync 函数使映射内存区的改变生效关联到文件里的变化(同步)
50. 通过 munmap 函数卸载文件到内存的映射
51. 关闭文件
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/)
Powered by Discuz! X3.2