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が発生し、フラグなしで動作しました(ただし、2番目のmmapが失敗した後のアサートは予想外ではないと思います)。

のサポートman mmapMAP_FIXED 実装定義であり、そのサポートはお勧めできません。私は自分で使ったことがないので、省略する以外に解決策は考えられません。

于 2012-10-05T15:01:13.693 に答える