一.brk sbrk介绍

借用linux那个男人,看下

BRK(2)                    Linux Programmer's Manual

BRK(2)

此部分补充一个知识点:后面的括号

1:Linux系统(shell)指2:系统函数3:标准C函数7:系统编程帮助

所以此部分是linux系统函数

NAME

brk, sbrk -change data segment size

SYNOPSIS

头文件

#include<unistd.h>

原形

intbrk(void *addr);

void*sbrk(intptr_t increment);

DESCRIPTION

brk() and sbrk() change  the location  of  the program  break,  which

defines the end of the process's data segment (i.e., the program break

is the first location after the end ofthe uninitialized data segment).

Increasing the program break has theeffect of allocating memory to the

process; decreasing the breakdeallocates memory.

brk() sets the end of the data segmentto the value specified by  addr,

when that  value  is reasonable, the system has enough memory,and the

process does not exceed its maximum datasize

sbrk() increments the program's dataspace by increment bytes.  Calling

sbrk() with an increment of 0 can be used to find the current location

of the program break.

RETURNVALUE

On success, brk() returns zero.  On error, -1 is returned, and errno is

set to ENOMEM.  (But see Linux Notes below.)

On  success, sbrk() returns the previous program break.  (If the break

was increased,then this value is a pointer to the start of the  newly

allocatedmemory).  On error, (void *) -1 isreturned, and errno is set

to ENOMEM.

二.程序验证

先说下整个运行原理

1.      内核维护一个指针,假设是p,那么第一次调用sbrk(>0的size)或得到一个没有被占用的虚拟内存,大小一般是4K的倍数,返回页开始地址的,并且把p=p+size

第二次调用以及后续调用sbrk(>0的size),返回p,并且把p+size

写个程序一目了然

#include<stdio.h>
#include <unistd.h>int main()
{int*p1 = sbrk(4);int*p2 = sbrk(4);int*p3 = sbrk(4);printf("pid%d\n",getpid());printf("p1:%p\n",p1);printf("p2:%p\n",p2);printf("p3:%p\n",p3);while(1);
}

运行效果

此时我们可以看下他的maps文件

发现他确实是映射了4K的空间

2.      内核维护一个指针,假设是p,那么sbrk(0)或得到一个没有被占用的虚拟内存地址,但是此时不分配空间,但是此时只是初始化p,所以你如果对此时得到的内存地址赋值,那么就会出现段错误

程序验证

#include<stdio.h>
#include<unistd.h>int main()
{int *p = sbrk(0);printf("%p\n",p);*p = 111;
}

此时出现段错误

3.      brk一般配合着sbrk做申请内存和释放内存使用,用sbrk得到地址后,使用brk做偏移,当然要做合理的范围之内

如程序

#include<stdio.h>
#include<unistd.h>int main()
{int *p = sbrk(0);brk(p+1);/* 3 使用brk分配空间 */*p = 1;printf("%d\n",*p);brk(p);      /*4 使用brk释放空间 */*p = 2;printf("%d\n",*p);return 0;
}

运行效果

发现8888能打印,原因是我们用brk(p+1)申请了4个byte的空间,但是后续brk(p)又释放掉了,所以访问会出现段错误

所以总结下brk和sbrk的用法

一般brk和sbrk的通用用法是:

1.      使用sbrk分配空间

Sbrk(>0的size)映射一个4K的page,并且分配一个空间

2.使用sbrk得到没有映射的虚拟地址.

3.使用brk分配空间

4.使用brk释放空间

三. 综合案例,寻找100以内的素数

#include<stdio.h>
#include<unistd.h>
int isPrimer(int a)
{int i=2;for(;i<a;i++){if(a%i==0){return 1;}}return 0;
}int main()
{int i = 2;int b;int *p = sbrk(0);int *r = p;for(;i<100;i++){b = isPrimer(i);if(b == 0){brk(r+1);*r = i;r = sbrk(0);}}i=0;r=p;while(r!=sbrk(0)){printf("%d\n",*r);r++;}brk(p);
}

linux学习---brk(), sbrk() 用法相关推荐

  1. brk(), sbrk() 用法详解【转】

    转自:http://blog.csdn.net/sgbfblog/article/details/7772153 贴上原文地址,好不容易找到了:brk(), sbrk() -- 改变数据段长度 brk ...

  2. brk(), sbrk() 用法详解

    贴上原文地址,好不容易找到了:brk(), sbrk() -- 改变数据段长度 brk() , sbrk() 的声明如下: #include <unistd.h> int brk(void ...

  3. Linux学习-40-格式化分区mkfs、mke2fs命令用法

    10.6 mkfs命令详解:格式化分区(为分区写入文件系统) 分区完成后,如果不格式化(创建文件系统)写入文件系统,则是不能正常使用的.这时就需要使用 mkfs 命令对硬盘分区进行格式化.mkfs 命 ...

  4. Linux学习-42-查看文件系统信息dumpe2fs命令用法

    10.9 dumpe2fs命令:查看文件系统信息 了解文件系统之后,我们可以使用dumpe2fs 显示ext2.ext3.ext4文件系统的超级快和块组信息.此命令的适用范围:RedHat.RHEL. ...

  5. Linux之curl命令用法指南学习

    Linux之curl命令用法指南学习 前言 常用参数 命令样例 其他 参考链接 前言 应用场景 工作中经常需要用到curl命令在测试或生产服务器中测试第三方接口,尤其是一些内外网接口.判断线上接口信息 ...

  6. Linux下brk、sbrk实现一个简易版本的malloc

    目录 一.内存四区回顾 二.brk.sbrk 三.使用brk.sbrk模拟实现malloc和free 一.内存四区回顾 程序代码区:该区域在程序运行时存放程序的二进制代码. 全局数据区:该区域主要存放 ...

  7. Linux学习(四)---用户管理

    文章目录 Linux学习--用户管理 一.基本介绍 二.添加用户 2.1 基本语法 2.2 实际案例 2.3 细节说明 三.给用户指定或者修改密码 四.删除用户 4.1基本语法 4.2 应用案例 五. ...

  8. python中module用法_Python学习之module用法

    Python学习之module用法 Python学习之module用法 为什么80%的码农都做不了架构师?>>> Python has a way to put definition ...

  9. Linux端日志加密,Linux学习--第十三天--日志、系统运行级别、grub加密

    日志 rsyslogd取代了syslogd. /var/log/cron #定时任务相关日志 /var/log/cups #打印信息相关日志 /var/log/dmesg #开机内核自检相关日志,dm ...

最新文章

  1. ClickHouse 系列教程五:多种连接方法
  2. 微型计算机步进电机控制,步进电机的微型计算机控制
  3. redis 数据操作命令汇总(string hash list set zset)
  4. 神经网络——BP算法
  5. matlab根据给定3点画圆弧_圆弧齿廓面齿轮齿顶尖化研究
  6. Logistic Regression(逻辑回归)模型实现二分类和多分类
  7. 信噪比:高端科研级相机的核心参数
  8. CentOS 6.5源码编译安装MySQL 5.6
  9. SQL中的树型编号处理
  10. streamVR里面自带的交互的例子
  11. linux mint运行速度,Linux Mint 19 Tara Cinnamon启动应用速度将会更快
  12. Tungsten Fabric解决方案指南-Kubernetes集成
  13. 【题解】Luogu P3110 [USACO14DEC]驮运Piggy Back
  14. 凝思系统激活序列号_凝思磐石安全操作系统
  15. 山沟沟里的技术脱贫:阿里工程师助平武蜂农物联网养蜂
  16. 用Matlab求拐点和凹凸区间需要使用MATLAB
  17. 华为8年女硕离职:多么痛的领悟...
  18. 分布式系统多副本复制的问题与解决方案
  19. 2023计算机毕业设计SSM最新选题之javaJava长途汽车订票系统xr24z
  20. 兔子NB播放器 (不用配置网上邻居,手机播放电脑视频)

热门文章

  1. 汇编语言——跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP
  2. java 生成当天日期 昨天日期
  3. 「季淳卿」零基础学习 MyBatis-Plus-springBoot(笔记总结)
  4. 杰理6905A更改蓝牙名字
  5. Yoyo OS安装过程
  6. 观《从你的全世界路过》
  7. vCenter6.7 取消检查更新通知
  8. 军职在线高性能计算机网络答案,全国计算机一级考试题库(附答案).pdf
  9. Springboot 项目打包上传到私服 Nexus3,如何通过私服下载自己上传的jar包,Nexus3的搭建和使用(二)
  10. 无人驾驶—激光雷达与相机