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