当前位置: 首页 > 知识库问答 >
问题:

在MacOSX 10.8.2和XCode 4.6下写入的mmap会使程序崩溃

阎成天
2023-03-14

我尝试在MacOSX 10.8.2和XCode 4.6下运行一个简单的mmap测试。这个程序如下,映射为读取的文件是OK的,而对写入指针“目标”的访问将使程序崩溃。错误消息是“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个答案

卫骏
2023-03-14

在mac下,不能使用PROT_EXEC,因此不能使用命名的pthread mutex、cond等。

仅使用PROT_READ | PROT_WRITE标志

梁研
2023-03-14

你不能只写PROT_EXEC的内存映射。你需要PROT_READ|PROT_WRITE,我完全不明白你为什么要PROT_EXEC。

邵星河
2023-03-14

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

 类似资料:
  • 问题是,当我在Google中使用授权运行此代码时,它会立即崩溃: 但是日志中的错误: 2019-06-22 17:55:42.652 29327-23222/?E/AudioSource:在已关闭的AudioSource 2019-06-22 17:55:43.240 2093-2616/?E/TouchFilter:setTouchFilter日志启用参数:0 2019-06-22 17:55:

  • 我正在Eclipse中创建一个应用程序,现在我想在我的项目中使用appcompat库。我已经成功地导入了这个库,当我用AppCompatActivity扩展一些活动时,它工作得很好。问题是,当我运行应用程序时,我的应用程序启动由AppCompActivty扩展的活动。应用程序崩溃。Log Cat正在显示NoClassDefFoundError:请为我指引正确的方向。谢谢

  • 我是编程新手,正在尝试制作一款android应用程序。最近几天我在使用调试器时遇到了麻烦。该应用程序在正常运行模式下工作正常。应用程序连接到firebase,所有数据都保存在那里。如果我尝试以学生身份在调试模式下登录,应用程序将立即崩溃。如果我以教授的身份登录,我会进入主页,但如果我单击“下一步”按钮,我会返回到登录页面,它会变为运行模式。我真的不知道问题出在哪里,但调试器和firebase有什么

  • 从昨天开始,当我在没有调试器的情况下启动应用程序时,它就会挂起。当我调试应用程序时,一切正常。我不知道我是不是应该把代码贴出来我觉得太多了。我正在使用Google Maps API。

  • E/AndroidRuntime:致命异常:主进程:com。维内特。计算器,PID:29435 java。lang.NullPointerException:尝试调用虚拟方法的布尔java。朗,布尔<代码>在此输入代码booleanValue()”在com的空对象引用上。维内特。计算器主要活动16美元。android上的onClick(MainActivity.java:177)。看法看法andr