20
2014
04

UC编程03-内存分配与内存映射函数sbrk/brk/mmap/munmap

函数说明:


code1

#include<stdio.h>
#include<unistd.h>
int main()
{
void* empty=sbrk(0);
void * p1=sbrk(4);//虚拟内存映最少射一个内存页4096字节
int *pi=p1;
*(pi+2)=120;//给p3赋值
void* p2=sbrk(4);
void* p3=sbrk(4);
printf("p1=%p,p2=%p,p3=%p\n",p1,p2,p3);
sbrk(-8);
sbrk(4093);
printf("4097字节\n");
sleep(15);
sbrk(-1);
printf("4096字节\n");
sleep(15);
sbrk(-4096);
printf("0字节\n");
sbrk(123);
double * pd=sbrk(0);//取最后空间的首地址
brk(pd+1);//分配一个double空间
int result=brk(empty);//回收所有
//printf("p1=%p,p2=%p,p3=%p\n",p1,p2,p3);
//printf("p3=%d\n",*(int*)p3);
return 0;
}

code2

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
//int * begin=sbrk(0);
int *pi=sbrk(sizeof(int));
double *pd=sbrk(sizeof(double));
*pi=123;
*pd=34.56;
printf("*pi=%d,*pd=%g\n",*pi,*pd);
brk(pd);
brk(pi);
printf("内存回收完毕!\n");
return 0;
}

code3

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/mman.h>
#include<string.h>
/*
内存映射:
   mmap(void* addr,size_t length,
int prot,int flags,int fd,int off)
addr-一般为NULL,内核选择映射首地址
length 大小,不足一个内存页补齐
prot-权限,PROT_READ|PROT_WRITE|
flags-MAP_PRIVATE,MAP_SHARED 必选其一,
对内存无区别,对文件有区别
MAP_ANONYMOUS,映射物理内存,失败返回MAP_FAILED
 */
int main(){
void*p=mmap(NULL,4,PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS,0,0);//分配
if(p==MAP_FAILED){//失败
perror("mmap");
return -1;
}
int *pi=p;
*pi=100;
char* st=p+4;
strcpy(st,"mycpystr");
printf("%d,%s\n",*pi,st);
munmap(p,4);//释放。
//printf("%d,%s\n",*pi,st);//已释放,引发段错误
return 0;
}




版权声明:
作者:真爱无限 出处:http://www.pukuimin.top 本文为博主原创文章版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接.
« 上一篇下一篇 »

相关文章:

评论列表:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。