[Display(ResourceType = typeof(RES.enums),Name = "enumSomeTypeValue1")]
这是我的代码我出于某种原因不断出现分段错误。 我的所有头文件都已包含在内,因此不是问题(显然,因为它与内存有关)。提前致谢。
编辑:知道了 - 它没有被格式化为字符串。并且还必须使用stat()来获取文件信息而不是getpagesize()
答案 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就是一个很好的例子。