2

以下程序:

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

谢谢你的帮助,

  • 约翰内斯
4

1 回答 1

0

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

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

根据man mmap支持,MAP_FIXED 定义了实现,不鼓励支持。我自己从未使用过它,所以除了省略它之外,我想不出任何解决方案。

于 2012-10-05T15:01:13.693 回答