首页 > 其他 > 详细

寒假学习 第三天 (linux 高级编程)

时间:2014-01-21 00:35:40      阅读:315      评论:0      收藏:0      [点我收藏+]

寒假学习 第三天 (linux 高级编程) 笔记 小结

晚上刷了笔记本的BIOS ,尽然刷坏了,折腾了一个晚上还没好,我勒个去bubuko.com,布布扣。只能在自己的台式机上搞了。

一、虚拟内存的分配

 int brk(void *addr);                           分配空间,释放空间                        
 void *sbrk(intptr_t increment);          返回空间地址
#include<stdio.h>
#include<unistd.h>

int main()
{
    int *p = sbrk(0);
    *p = 222;
    
    return 0;
}

会出现 段错误

如果输出 p 的地址 在 maps 文件中看不到  有它的地址,说明p没有映射。

#include<stdio.h>
#include<unistd.h>

int main()
{
    int *p = sbrk(0);
    brk(p+1)
    *p = 222;
    
    return 0;
}

运行正常

这时看 p 地址 可以看到  有一个  1页区间的地址,p为这个的第一个地址。


sbrk 和 brk 相当于 在后台维护一个指针
sbrk(int)         先返回 再映射地址 在移动指针
                      如果是第一次用sbrk且参数是0  就返回一个没有映射过的地址。
                     如果已经有映射的内存,数是0就返回第一个映射过的,但不合法的地址。(因为不是上面的情况sbrk()会至少产生1页的地址)
                     sbrk(size)   返回  第一个映射过的 ,把后台管理的指针(追后一个映射过的地址)移动 size。
brk(地址)      直接把后台管理的指针移动到 指定的位置

int *p;
int *r;
p = sbrk(0);
r = p;
for(int i=0;i<10;++i)
{
    brk(r+1);
    *r = i;
    r++;
}

r = p; 
while(r!=sbrk(0))
{
    printf("%d\n",*r);
    r++;
}

保存0到9  再输出0 到9

sbrk和brk的异常处理
int brk(void* )            成功返回0  失败返回 -1
void *sbrk(int )          成功返回-1   失败反回 (void*)-1

二、其他知识点

linux/unix  错误函数
errno.h头文件
输出错误 三种方式:
perror();
printf("%m\n");
printf("%s\n",strerror(errno));




寒假学习 第三天 (linux 高级编程)

原文:http://blog.csdn.net/billvsme/article/details/18352187

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!