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

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

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

一、虚拟内存的分配

 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));




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值