mprotect中的疑惑

Borenbao 2008-06-27 11:39:24
在linux帮助页里面mprotect 函数有如下一个例子:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/mman.h>

#include <limits.h> /* for PAGESIZE */
#ifndef PAGESIZE
#define PAGESIZE 4096
#endif

int
main(void)
{
char *p;
char c;

/* Allocate a buffer; it will have the default
protection of PROT_READ|PROT_WRITE. */
p = malloc(1024+PAGESIZE-1);
if (!p) {
perror("Couldn't malloc(1024)");
exit(errno);
}

/* Align to a multiple of PAGESIZE, assumed to be a power of two */
p = (char *)(((int) p + PAGESIZE-1) & ~(PAGESIZE-1));

c = p[666]; /* Read; ok */
p[666] = 42; /* Write; ok */

/* Mark the buffer read-only. */
if (mprotect(p, 1024, PROT_READ)) {
perror("Couldn't mprotect");
exit(errno);
}

c = p[666]; /* Read; ok */
p[666] = 42; /* Write; program dies on SIGSEGV */

exit(0);
}

为了保证新分配的内存p在一个页的开头使用了p = (char *)(((int) p + PAGESIZE-1) & ~(PAGESIZE-1));
那释放内存的时候怎么办?
free(p)好像不行吧。这个例子程序应该如何更改一下会更好?
...全文
828 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Borenbao 2008-06-27
  • 打赏
  • 举报
回复
p = (char *)(((int) p + PAGESIZE-1) & ~(PAGESIZE-1));
这一句里面本来有他没有分配的内存,它去使用能行吗?
king_water 2008-06-27
  • 打赏
  • 举报
回复
程序已经挂了,
p[666] = 42; /* Write; program dies on SIGSEGV */

就没有必要free了
babyvox1999 2008-06-27
  • 打赏
  • 举报
回复
再用个变量保存malloc出来的P,然后free
xkyx_cn 2008-06-27
  • 打赏
  • 举报
回复
如果像上面程序这样,崩了就退,也就不用管free了

若要释放,可以像ls几位提供的方法,先保存p的原始地址,free使用这个地址
K行天下 2008-06-27
  • 打赏
  • 举报
回复
p = (char *)(((int) p + PAGESIZE-1) & ~(PAGESIZE-1));
之后就将p指向了刚开始分配动态内存时的下一页首地址

因此可以将第一次分配的地址保存在 char* p1中,然后再释放

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧