LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 821|回复: 4

mmap中关于强制类型转换的疑问

[复制链接]
发表于 2010-6-7 19:09:23 | 显示全部楼层 |阅读模式
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdlib.h>
typedef struct {
    int integer;
    char string[24];
} RECORD;
#define NRECORDS (100)
int main()
{
    RECORD record, *mapped;
    int i, f;
    FILE *fp;
    fp = fopen(“records.dat”,”w+”);
    for(i=0; i<NRECORDS; i++) {
        record.integer = i;
        sprintf(record.string,”RECORD-%d”,i);
        fwrite(&record,sizeof(record),1,fp);
    }
    fclose(fp);

2 我们现在改变记录43到143的整数值,并且写第43个记录字符串处:

fp = fopen(“records.dat”,”r+”);
fseek(fp,43*sizeof(record),SEEK_SET);
fread(&record,sizeof(record),1,fp);
record.integer = 143;
sprintf(record.string,”RECORD-%d”,record.integer);
fseek(fp,43*sizeof(record),SEEK_SET);
fwrite(&record,sizeof(record),1,fp);
fclose(fp);

3 为了将整数值改变为243(并且更新记录字符串),我们将这些记录映射到内存,并且访问第43个记录,在这里使用内存映射:

  f = open(“records.dat”,O_RDWR);
  mapped = (RECORD *)mmap(0, NRECORDS*sizeof(record),
                        PROT_READ|PROT_WRITE, MAP_SHARED, f, 0);
  mapped[43].integer = 243;
  sprintf(mapped[43].string,”RECORD-%d”,mapped[43].integer);
  msync((void *)mapped, NRECORDS*sizeof(record), MS_ASYNC);
  munmap((void *)mapped, NRECORDS*sizeof(record));
  close(f);
  exit(0);
}

关于程序第三部分中  

mapped = (RECORD *)mmap(0, NRECORDS*sizeof(record),
                        PROT_READ|PROT_WRITE, MAP_SHARED, f, 0);

看得不是很明白,想求解一下(RECORD *)是强制类型转换吗?这个mmap处理以后应该是把文件“records.dat”所有的记录都取出来了,如果用(RECORD *)来强制类型转换,好像很难理解转换以后mmapped里面的结构是怎么的?不知道那位高手能够指点一下?
发表于 2010-6-7 20:15:49 | 显示全部楼层
做了
mapped = (RECORD *)mmap(0, NRECORDS*sizeof(record),
PROT_READ|PROT_WRITE, MAP_SHARED, f, 0);
之后

mapped[0]到 mapped[NRECORDS-1]就是映射文件的内容了。如果43<NRECORDS的话,当然可以用mapped[43]这种形式。也可以用 *(mapped+43) 这种形式,两者是等价的表示方法。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-7 20:57:40 | 显示全部楼层
谢谢回复!我想知道的是强制转换到底是如何对应到内存里的元素。
回复 支持 反对

使用道具 举报

发表于 2010-6-7 22:24:29 | 显示全部楼层
指向记录的指针+1 相当于 原指针地址+记录长度
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-7 22:33:35 | 显示全部楼层
如何没有强制转换(RECORD *),那会出现什么情况?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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