MMAP分段错误

时间:2016-12-20 15:39:43

标签: c unix mmap

 [Display(ResourceType = typeof(RES.enums),Name = "enumSomeTypeValue1")]

这是我的代码我出于某种原因不断出现分段错误。 我的所有头文件都已包含在内,因此不是问题(显然,因为它与内存有关)。提前致谢。

编辑:知道了 - 它没有被格式化为字符串。并且还必须使用stat()来获取文件信息而不是getpagesize()

4 个答案:

答案 0 :(得分:4)

您无法fclose()open()获得的文件描述符。您必须改为使用close(fp)。你做的是传递一个被视为指针的小int。这会导致分段错误。

请注意,您选择的标识符命名是不幸的。通常fp将是指向文件的指针(FILE*,由标准IO库使用),而fd将是文件描述符(小整数),由内核的IO系统调用。

你的编译器应该告诉你,你传递了一个int指向fILE的指针,或者你使用fclose()而没有原型。您是否启用了编译器的最大警告级别?

如果data指针未指向NUL(0)终止字符串,则可能出现另一个段错误。您的log.txt是否包含以NUL结尾的字符串?

您还应该检查mmap()是否无法返回MAP_FAILED

答案 1 :(得分:2)

mmap's man page为您提供有关参数的信息:

  

void * mmap(void * addr,size_t length,int prot,int flags,int fd,off_t offset);

正如您所看到的,您的第二个参数可能是错误的(除非您确实想要将文件的一部分精确映射到单个页面中)。

另外:可能0不是有效的标志值?让我们再看一下手册页:

  

flags参数确定是否对映射进行更新          映射相同区域的其他进程可见,以及是否          更新将传递到基础文件。这种行为是          通过在标志中包含以下其中一个值来确定:MAP_SHARED或MAP_PRIVATE

所以你可以试试像

这样的东西
data = mmap(0, size, PROT_READ, MAP_SHARED, fp, 0);
  • 始终使用提供的标记,因为基础值可能因机器而异。

  • 此外,映射区域不应大于底层文件。事先检查log.txt的大小。

答案 2 :(得分:1)

好的,这是让它运行的代码

#include <sys/stat.h>
int status;
struct stat s;
status = stat(file, &s);

if(status < 0){
    perror("Stat:");
    exit(1);

data = mmap(NULL, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0);

在我使用&#39; getpagesize()之前;&#39;谢谢beej !!!

答案 3 :(得分:0)

mmap的第二个参数不应该是页面大小,它应该是文件的大小。 Here就是一个很好的例子。