首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在带有XCode 4.6的MacOSX 10.8.2下写入mmap会导致程序崩溃

在带有XCode 4.6的MacOSX 10.8.2下写入mmap会导致程序崩溃
EN

Stack Overflow用户
提问于 2013-04-28 01:02:55
回答 3查看 1K关注 0票数 3

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

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

代码语言:javascript
运行
复制
#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;

}

EN

回答 3

Stack Overflow用户

发布于 2013-04-28 02:38:40

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

票数 3
EN

Stack Overflow用户

发布于 2013-04-28 01:05:10

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

票数 2
EN

Stack Overflow用户

发布于 2018-10-25 01:21:54

在mac下,你不能使用PROT_EXEC,所以你不能使用命名的pthread mutex,cond等。

仅使用PROT_READ | PROT_WRITE标志

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16254743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档