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

时间:2013-04-27 17:02:55

标签: c macos mmap

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

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

#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
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;

}

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

在Mac下,您不能使用PROT_EXEC,因此不能使用命名的pthread互斥锁,cond等。

仅使用PROT_READ | PROT_WRITE标志