崩潰下面的程序:上段錯誤關機程序使用mmap(MAP_FIXED)在Linux 2.6.18 &&的glibc 2.5
#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盒。這是一個已知的錯誤, 應該一般不使用MAP_FIXED或者 程序有問題。它也會在其他平臺上崩潰嗎?
感謝您的幫助,
- 約翰內斯
在第一個'mmap()'之後關閉'fd'並在第二個'generate_test_file()'之後重新打開它有重要意義嗎?什麼樣的文件系統是「testfile」居住的?我想知道如果文件的截斷/覆蓋導致保持打開的文件描述符不一致,這會導致第二個'mmap()'出現問題。另外,由於「MAP_FIXED」會導致重疊的映射區域被丟棄,所以第二個映射可能會殺死映射的共享庫或數據段或其他內容。 – twalberg
看起來確實如此:第二個mmap調用殺死共享庫。關閉並重新打開文件並沒有什麼不同。 –
* 4096 * 1024 *您通過MAP_FIXED在先前預約的4K上映射4M。由於您不控制地址空間,因此它可以覆蓋任何內容。 – bestsss