曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6595|回复: 1
打印 上一主题 下一主题

mmap 函数相关应用

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2009-2-15 22:09:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码:
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 }

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
沙发
 楼主| 发表于 2009-2-15 22:52:00 | 只看该作者
程序分析

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. 关闭文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 05:02 , Processed in 0.083426 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表