寒假学习 第三天 (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));