- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在带有gcc 4.9.2的vmware 11.0和linux-2.6.34上遇到了此问题,尚未在实际硬件上进行测试。
以下代码成功运行,并且在没有SIGSEGV的情况下打印了消息。但是,如果我在munmap之前取消对printf的注释,则会捕获到SIGSEGV。
在以下消息中打印munmap()之前和之后的地图。
static void check_mmap(void){
int fd, i;
char *p = NULL;
if ((fd = shm_open("xxxxxxxxxxxx", O_RDWR|O_CREAT|O_TRUNC, 0666)) == -1) {
printf("open shm file failed.\n");
return;
}
if (ftruncate(fd, 4096) == -1)
goto out;
p = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
if (MAP_FAILED == p)
goto out;
//printf("Mapped at %p\n", p);
getchar(); // <----- chance to print maps befor munmap
if (munmap(p, 4096) != 0)
printf("munmap error: %s\n", strerror(errno));
printf("Corrupting mmap memory.\n");
for(i = 0; i < 4095; i ++)
p[i] = 0;
printf("Done\n");
getchar(); // <----- chance to print maps after munmap
out:
close(fd);
if (p)
munmap(p, 4096);
}
0000000000400890 <main>:
400890: 55 push %rbp
400891: 53 push %rbx
400892: ba b6 01 00 00 mov $0x1b6,%edx
400897: be 42 02 00 00 mov $0x242,%esi
40089c: bf 9c 0a 40 00 mov $0x400a9c,%edi
4008a1: 48 83 ec 08 sub $0x8,%rsp
4008a5: e8 fe fd ff ff callq 4006a8 <shm_open@plt>
4008aa: 83 f8 ff cmp $0xffffffffffffffff,%eax
4008ad: 89 c3 mov %eax,%ebx
4008af: 0f 84 c0 00 00 00 je 400975 <main+0xe5>
4008b5: be 00 10 00 00 mov $0x1000,%esi
4008ba: 89 c7 mov %eax,%edi
4008bc: e8 37 fe ff ff callq 4006f8 <ftruncate@plt>
4008c1: 83 f8 ff cmp $0xffffffffffffffff,%eax
4008c4: 0f 84 9b 00 00 00 je 400965 <main+0xd5>
4008ca: 45 31 c9 xor %r9d,%r9d
4008cd: 31 ff xor %edi,%edi
4008cf: 41 89 d8 mov %ebx,%r8d
4008d2: b9 02 00 00 00 mov $0x2,%ecx
4008d7: ba 03 00 00 00 mov $0x3,%edx
4008dc: be 00 10 00 00 mov $0x1000,%esi
4008e1: e8 22 fe ff ff callq 400708 <mmap@plt>
4008e6: 48 83 f8 ff cmp $0xffffffffffffffff,%rax
4008ea: 48 89 c5 mov %rax,%rbp
4008ed: 0f 84 8e 00 00 00 je 400981 <main+0xf1>
4008f3: 48 8b 3d 0e 05 20 00 mov 0x20050e(%rip),%rdi # 600e08 <__TMC_END__>
4008fa: e8 b9 fd ff ff callq 4006b8 <_IO_getc@plt>
4008ff: be 00 10 00 00 mov $0x1000,%esi
400904: 48 89 ef mov %rbp,%rdi
400907: e8 dc fd ff ff callq 4006e8 <munmap@plt>
40090c: 85 c0 test %eax,%eax
40090e: 75 7a jne 40098a <main+0xfa>
400910: bf d1 0a 40 00 mov $0x400ad1,%edi
400915: e8 6e fd ff ff callq 400688 <puts@plt>
40091a: 48 8d 8d ff 0f 00 00 lea 0xfff(%rbp),%rcx
400921: 48 89 ea mov %rbp,%rdx
400924: 0f 1f 40 00 nopl 0x0(%rax)
400928: c6 02 00 movb $0x0,(%rdx)
40092b: 48 83 c2 01 add $0x1,%rdx
40092f: 48 39 ca cmp %rcx,%rdx
400932: 75 f4 jne 400928 <main+0x98>
400934: bf e9 0a 40 00 mov $0x400ae9,%edi
400939: e8 4a fd ff ff callq 400688 <puts@plt>
40093e: 48 8b 3d c3 04 20 00 mov 0x2004c3(%rip),%rdi # 600e08 <__TMC_END__>
400945: e8 6e fd ff ff callq 4006b8 <_IO_getc@plt>
最佳答案
您正在调用“未定义的行为”。什么事情都可能发生。这样,您就不会抱怨在一种情况下您更喜欢结果,而不是在两种情况下都具有未定义的行为。只是停止运行无效的代码。
关于linux - mmap和munmap,有时可以访问未映射的区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27643920/
我有通过 mmap 创建的未命名进程间共享内存区域.进程是通过 clone 创建的系统调用。进程共享文件描述符表(CLONE_FILES)、文件系统信息(CLONE_FS)。进程不共享内存空间(除了先
当我尝试研究一些处理 FPGA 的代码时,我遇到了 munmap、mmap。 我仔细阅读了提供的手册 here .我仍然不明白这个功能的目的。这到底是做什么的? 最佳答案 mmap() 是一个系统调用
在 Mac 上,我使用 munmap 可以看到更高的页面回收率。 我的munmap的返回值为0,这表明请求的页面已成功取消映射。 当我使用以这种方式映射和取消映射的内存测试程序时,为什么会看到更高的页
我正在编写一个使用共享内存的函数库。我编写的用于关闭共享内存的函数每当到达 munmap() 部分时都会给我一个段错误,但如果我不使用该函数而只是让代码 munmap() 和 shm_unlink 最
我定义了一个名为 ClusterSet 的类,它只有一个字段,名为 clusters: class ClusterSet { std::map* > clusters; public:
我正在编写一个程序,并获得了一个内存位置,我将其存储为一个 unsigned int,并将映射的长度存储为一个 unsigned int,我想取消映射。 我的以下方法会生成警告: warning: p
我调用munmap没有错误,但映射仍然可见 /proc//maps当我尝试 mmap(address_overlapping_with_what_I_tried_to_munmap, ...)我没有得
如果一个进程调用 mmap(...,MAP_ANONYMOUS | MAP_SHARED,...) 并 fork N 个子进程,这些进程(父进程或后代进程)中的任何一个是否有可能 munmap() 一
例如,如果我这样做: char *pMap1; /* First mapping */ char *pReq; /* Address we would l
我想知道,为什么映射内存的大小应该作为一个参数传入,因为从同一地址开始的映射不能超过一个(可以吗?),为什么 linux 内核不记录两个起始地址, 长度在一起,但让用户空间程序记住它们。 我的意思是,
我试图优化 C 代码。当我使用 strace跟踪程序,我发现它一直在调用 mmap和 munmap .但是这段代码只是对使用 malloc() 分配的内存元素进行操作。 .有人可以解释为什么吗? 最佳
我想知道是否有必要(或建议)在通过 fork 创建的子进程中取消映射共享内存(使用 munmap),如果内存已获得在父级中,在 fork 之前,使用 mmap(..., MAP_ANONYMOUS |
我在 RHEL 5.8 上有一个多线程应用程序,它通过 mmap 读取大文件(每个文件大约 500MB)并对它们进行一些处理;一个线程执行 mmap,其他线程执行处理。当文件不再位于文件系统上时,将执
Open Group 标准规定应使用页对齐地址调用 munmap,但似乎没有任何要求 mmap 应返回页对齐地址。这是您在编写可移植代码时需要处理的事情吗? 最佳答案 mmap 只会映射整个页面,因此
我正在尝试使用辛普森规则进行数值积分,所以我认为最好的方法是在三个线程中,一个用于 2,一个用于 3,然后是结束边界。 但我是线程新手,仍在学习一些东西。但是,我真的不知道这有什么问题,我使用其属性创
有关于通过mmap分配内存的代码 void *ret = mmap(NULL, 4 * 1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1
如果我在内存映射区域上使用 MS_ASYNC 调用 msync,同步过程将被异步处理。 但是,如果我立即对该区域调用 munmap,我是否可以假设 msync 将安全执行?或者我必须在 munmap
我对 C++ 比较陌生,正在学习其他人的代码。他的代码从映射文件中读取,但最终没有释放任何映射内存。以我的理解, mmap() 将文件映射到虚拟内存中。难道我不需要以某种方式释放那些映射内存,比如调用
我有一个关于 Linux 中的 mmap 和 munmap 的简单问题:是否有可能 mmap 成功但 munmap 失败? 假设所有参数都正确给出,例如,请看下面的代码片段。什么情况下会打印munma
我正在尝试为无交换系统实现一个文件支持的内存分配器。 对于每个新分配,我使用 mkstemp 创建一个临时文件作为后台存储,mmap 将其作为 MAP_SHARED 以允许交换页面当系统的内存压力很高
我是一名优秀的程序员,十分优秀!