使用mmap(MAP_FIXED)的程序在Linux 2.6.18上发生崩溃&& glibc 2.5

时间:2012-10-05 14:14:57

标签: linux segmentation-fault mmap

遵循计划:

#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或者有什么问题 程序。它是否也会在其他平台上崩溃?

感谢您的帮助,

  • 约翰内斯

1 个答案:

答案 0 :(得分:0)

您是否忘记在指针上使用munmap并在文件描述符上使用close。 如果还没有,则问题很可能是MAP_FIXED

我在我的debian(内核2.6.32)上进行了测试,它在使用MAP_FIXED标志时导致了SEGFAULT,并且在没有标志的情况下工作(除了第二个mmap失败后的断言,我认为这并不是意料之外的。)

符合MAP_FIXED对{{1}}的支持是实施定义的,不鼓励其支持。我自己从未使用它,所以除了省略它之外,我想不出任何其他解决方案。