zoukankan      html  css  js  c++  java
  • unix c 03

    C程序员的错误处理
      errno/perror/strerror 都是系统设计好的
      自定义函数中的错误处理
       1 可以返回-1 代表错误
       2 指针类型可以用 NULL 代表错误
       3 如果不需要考虑错误,用void
      环境变量和环境表
       extern char** environ;
       (用指针操作字符串数据/字符串 是基本能力)
      内存管理
       内存管理的依附关系:
        STL-自动管理 -> C++ new/delete ->
        C malloc/free ->Unix sbrk/brk -> Unix mmap
       内存的管理 使用 虚拟内存地址 技术,就是说:程序员 接触的是 虚拟的地址,不是 真实的 物理内存地址。虚拟内存地址 必须 映射到 物理内存 才能真正使用(mmap),否则 产生段错误。虚拟内存地址有用户空间(0-3G)和内核空间(3G-4G)之分。
       一个进程(就是运行起来的程序)内存是分为以下部分:
       1 代码区 存函数 (只读区),常量和字面值近似
       2 全局区 存static和初始化的全局变量
       3 BSS段  存未初始化的全局变量
       4 栈     存局部变量(包括函数的参数)
       5 堆     自由区,由程序员控制

    可以用cat /proc/进程ID/maps 查看内存的分配情况
    进程ID 可以用 ps -aux查看,也可以用 getpid()取得。
      malloc 一次分配33个内存页,但如果申请的内存比较大(超过32个内存页)就会分配比申请的内存 稍大一点的内存页数(不固定)。
      malloc分配内存时,先记录附加信息,然后再返回一个首地址。但不影响使用。
      如果33个内存页用完,会增加新的内存页,不一定是66个。
      由于 内存映射 非常耗费时间,所以free并不确保一定解除映射。malloc分配的内存,free会最后保留33个内存页,直到内存被清空时。
      结论:申请内存用malloc,释放内存用free.

      getpagesize()函数可以取得内存页的大小。
      注:不同进程之间即使虚拟地址一样,也是对应不同的物理内存。(IPC之共享内存除外)

      brk和sbrk
       底层维护了一个位置,由位置决定内存的分配或回收。
       sbrk本身可以申请/释放内存,
       void* sbrk(int num)
       num 是正数 申请内存,同时移动位置,把移动之前的位置作为首地址返回。
       num 是负数 释放内存,同时移动位置,返回值意义不大。
       num 是0 取当前的位置地址。
      sbrk是以 一个内存页作为操作内存的基本单位。
      经验:sbrk分配内存简单,但释放内存 麻烦。
      sbrk一般用于 分配内存,brk 负责回收内存。
      练习:
       用sbrk申请内存,用brk释放内存,实现以下要求
       存放一个整数,再存放一个double,再存放一个长度为8的字符串,放入"abcd",最后,逐一释放空间。

      mmap负责 映射 物理内存/文件。
       关于多个选项合并的方式:
       用一个二进制位代表一种权限,用 | 进行合并。
       001 - 执行
       010 - 写权限 PROT_READ
       100 - 读权限 PROT_WRITE

       PROT_READ | PROT_WRITE  -> 110

      取 i的后8位
       i & 0xFF

      1000 0000
      1111 1111

  • 相关阅读:
    hdu 2044 一只小蜜蜂
    HDU 2041 超级楼梯
    卡特兰数
    hdu 1267 下沙的沙子有几粒?(二维递推题)
    大数加法、乘法
    学习时仪式感太强是不是不太好
    php记日志
    cygwin安装apt-cyg
    存储过程死循环之后的清理
    linux的计划任务crontab
  • 原文地址:https://www.cnblogs.com/elisha-blogs/p/3771112.html
Copyright © 2011-2022 走看看