使用XCode 4.6在MacOSX 10.8.2下编写mmap会导致程序崩溃

我尝试使用XCode 4.6在MacOSX 10.8.2下运行mmap的简单测试。 此程序如下所示,映射为读取的文件是正常的,而对写入指针“target”的访问将使程序崩溃。 错误消息是“EXC_BAD_ACCESS”。

有人和我有同样的情况吗? 非常感谢。

#include  #include  #include  #include  #include  int main(int argc, const char * argv[]) { int input, output; size_t size; char *source, *target; input = open("SEK2.txt", O_RDONLY); if (input == -1) { printf("Open source file failed"); return -1; } output = open("test.txt", O_RDWR|O_CREAT|O_TRUNC); if (output == -1) { printf("Open Output file failed"); return -1; } size = lseek(input, 0, SEEK_END); printf("File size = %d\n", size); source = (char*)mmap(0, size, PROT_READ, MAP_PRIVATE, input, 0); if ( source == (void*)-1) { printf("Source MMap Error\n"); return -1; } target = (char*)mmap(0, size, PROT_EXEC, MAP_PRIVATE, output, 0); if ( target == (void*)-1 ) { printf( "Target MMap Error\n"); return -1; } memcpy(target, source, size); // EXC_BAD_ACCESS to "target" munmap(source, size); munmap(target, size); close(input); close(output); printf("Successed"); return 0; 

}

我认为你需要ftruncate(output, size); 使输出文件足够大。 我不相信内核会自动生成一个文件来容纳写入映射地址的数据。

您不能只使用PROT_EXEC写入内存映射。 你需要PROT_READ | PROT_WRITE,我不明白为什么你想要PROT_EXEC。

在mac下,你不能使用PROT_EXEC ,因此你不能使用命名的pthread互斥,cond等。

仅使用PROT_READ | PROT_WRITE PROT_READ | PROT_WRITE标志