遵循计划:
#include <stdio.h>
#include <assert.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void generate_test_file(int count)
{
FILE *f;
int i;
f = fopen("testfile", "w+");
for (i=0;i<count;i++) {
fwrite(&i, 1, sizeof(i), f);
}
fclose(f);
}
void test_mmap_directly()
{
int fd;
void *area_short, *area_long;
generate_test_file(1024);
fd = open("testfile", O_RDONLY);
assert(fd>=0);
area_short = mmap(0, 4096, PROT_READ, MAP_PRIVATE, fd, 0);
assert(area_short != MAP_FAILED);
generate_test_file(1024*1024);
area_long = mmap(area_short, 4096*1024, PROT_READ, MAP_PRIVATE | MAP_FIXED, fd, 0);
assert(area_long != MAP_FAILED);
assert(area_short == area_long);
}
int main(int argc, char ** argv)
{
test_mmap_directly();
/* Crashes on shutdown for libc 2.5 and kernel 2.6.18 (CentOS 5) */
}
在我的CentOS 5机箱上使用Segfault关闭时崩溃。这是一个已知的错误, 如果一般不使用MAP_FIXED或者有什么问题 程序。它是否也会在其他平台上崩溃?
感谢您的帮助,
答案 0 :(得分:0)
您是否忘记在指针上使用munmap
并在文件描述符上使用close
。
如果还没有,则问题很可能是MAP_FIXED
我在我的debian(内核2.6.32)上进行了测试,它在使用MAP_FIXED标志时导致了SEGFAULT,并且在没有标志的情况下工作(除了第二个mmap失败后的断言,我认为这并不是意料之外的。)
符合MAP_FIXED
对{{1}}的支持是实施定义的,不鼓励其支持。我自己从未使用它,所以除了省略它之外,我想不出任何其他解决方案。