我想在C中使用mmap来查看它是如何工作的。目前我尝试使用mmap逐字节读取二进制文件。我的代码是这样的:在C中使用mmap读取二进制文件时出现Segfault错误
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
int main(int argc, char *argv[]) {
int fd;
char *data;
for (int i = 1; i<argc; i++)
{
if(strcmp(argv[i],"-i")==0)
fd = open(argv[i+1],O_RDONLY);
}
data = mmap(NULL, 4000, PROT_READ, MAP_SHARED, fd, 8000);
int i = 0;
notation = data [i];
// ......
}
当我尝试记数法=数据[0]和我得到一个段错误时,我的问题发生。我相信二进制文件中的第一个字节也是一个字符。我的for循环检查编译时是否有-i标志,如果有下一个参数应该是文件名。
确定该文件的大小至少为8000字节?另外,手册页中提到“offset必须是由sysconf(_SC_PAGE_SIZE)返回的页面大小的倍数”。作为次要方面,您应该将fd初始化为-1,以防用户未指定-i参数,并且for循环应该循环到argc-1,否则您将访问argv,超出了用户指定的传入参数 - 我作为最后一个参数。 – EricS 2012-04-15 17:39:30