mmap失败追踪

  今天在小试mmap函数的时候,本以为会一路畅通没想到执行的时候出现了段错误,调试了一下发现在mmap返回以后访问返回的指针出了问题,代码如下

#define REC_NUM 100

typedef struct{

int val;

char str[24];

} RECORD;


int function(char *path, ...){

int fd;

RECORD *mapped=NULL;

...

fd = open(path, O_RDWR);
if( 0 > fd ){
perror("open");
return 1;
}

mapped = (RECORD*)mmap(NULL, REC_NUM*sizeof(RECORD),
PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

mapped[0].val = 1;    // 产生段错误的地方

...

}

  开始以为是mapped在mmap()后为NULL,结果打印出了实际的值(0xffffffff)才发现与预期的不太一样,根据mmap()的手册,返回0xffffffff(实际应该写为(void*)-1)表示mmap

在执行时产生了错误,于是接下来就用perror来打印mmap的错误原因,原来是遇到了invalid argument;到了这个阶段就变得有些棘手,因为代码基本都是和书上是一致的

而且对照手册里面导致错误的参数也看不出有什么问题,还是只有求助度娘,在网上找到了一篇文章,分析了mmap会错的原因,一个是open文件时的模式与mmap时使用

的模式不匹配(这个也是网上比较常见的错误);另一个是说因为linux不能保证对网络上的文件的一致性,所以mmap对这样的文件进行操作时会出现问题,该文作者在virtual box下实验了用mmap操作网络上的文件就出现了invalid argument,这样的话和我遇到的问题基本就是一样了,接下来把文件该为本地文件,全部通过!! 

  mmap设计的知识不少,还需要进一步的学习才能真正的掌握

  debug时觉得有用的文章如下

http://www.shangxueba.com/jingyan/1823180.html

http://blog.chinaunix.net/uid-26669729-id-3077015.html





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值