今天在小试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