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
unix c 03的更多相关文章
- 三个入侵的必备小工具-lcx.exe、nc.exe、sc.exe
lcx.exe的使用方法 以前抓肉鸡都是通过1433弱口令,然后.. 但是发现很多服务器开了1433,3389,但是终端是连不上的,因为服务器本身是在内网,只对外开放了1433端口,幸好有lcx. ...
- 2016-1-28 图解HTTP(03)
6.2.5 非HTTP/1.1首部字段 不限于RFC2616中定义的47种首部字段,还有Cookie.Set-Cookie和Content-Disposition等在其他RFC中首部字段 ...
- UNIX系统的显示时间何时会到达尽头
本文分为三个小块: 一.UNIX系统中时间的存储形式: 二. time_t 的最大值是多少: 三. 将time_t 的最大值转化为真实世界的时间: #---------------------# # ...
- UNIX常用命令
以下只说明各常用指令的基本用法, 若需详细说明, 请用 man 去读详细的 manual. 1.关於档案/目录处理的命令 ls--列目录 这是最基本的档案指令. ls 的意义为 "list& ...
- js 取得 Unix时间戳(Unix timestamp)
js 取得 Unix时间戳 Unix时间戳(Unix timestamp),或称Unix时间(Unix time).POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间19 ...
- Unix权限管理
// */ // ]]> Unix权限管理 Table of Contents 1 Unix权限管理 2 进程权限 3 文件权限 4 进程对文件的存取访问的权限校验过程 1 Unix权限管理 权 ...
- multiple definition of `err_sys' 《UNIX环境高级编程》
本文地址:http://www.cnblogs.com/yhLinux/p/4079930.html 问题描述: [点击此处直接看解决方案] 在练习<UNIX环境高级编程>APUE程序清单 ...
- UNIX Time 时间戳 与 北京时间 相互转换
typedef struct t_xtime { int year; int month; int day; int hour; int minute; int second; } _xtime ; ...
- Unix Shell 程序设计 —— 正则表达式
参考:http://www.cnblogs.com/erichhuang/archive/2012/03/13/2394119.html 简介: 简单的说,正则表达式是一种可以用于模式匹配和替换的强有 ...
随机推荐
- VS2013中C++创建DLL导出class类
1.创建"Win32 Console Application"项目,命名为"ClassDllLib",并在"Application type" ...
- 如何保存JMeter的性能测试数据到ElasticSearch上,并且使用Kibana进行可视化分析(1)
前言 Jmeter是一款性能测试,压力测试的开源工具,被大量的测试人员拿来测试产品的性能,负载等等. Jmeter除了强大的预置的各种插件,各种可视化图表工具以外,也有些固有的缺陷,例如: 我们往往只 ...
- 必看谷歌HTML/CSS规范
背景 这篇文章定义了 HTML 和 CSS 的格式和代码规范,旨在提高代码质量和协作效率. 通用样式规范 协议 省略图片.样式.脚本以及其他媒体文件 URL 的协议部分( http:,https: ) ...
- (转)直接保存对象的数据库——db4o
在实际开发中,数据的存储是必不可少的,常用的有数据库存储和文件存储.数据库目前有关系型数据库和文档型数据库(No-SQL).关系型数据库以字段.类型.约束.表关系来存储和管理数据,比较常见的比如Ora ...
- 万恶DevExpress
公司需要,开始了DevExpress的学习之旅,说它万恶也只是在不了解它的情况下,熟悉之后能很方便的实现很多想要的功能 这里简单写一下要整理的内容,也就是大纲,以后再慢慢添加 一.控件和组件 date ...
- Wince修改系统时间问题
当我们需要修改到系统时间的时候,需要用到下面四个函数:SetLoaclTime,GetLocalTime,SetSystemTime,GetSystemTime.这四个函数是用来修改或者 ...
- mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法
权限问题,授权 给 root 全部sql 权限 mysql> grant all privileges on *.* to root@"%" identified by & ...
- how tomcat works 读书笔记(一)----------一个简单的webserver
http协议 若是两个人能正常的说话交流,那么他们间必然有一套统一的语言规则<在网络上server与client能交流也依赖与一套规则,它就是我们说的http规则(超文本传输协议Hypertex ...
- itoa的源代码实现
由于通过socket传递数据的时候,仅仅能够通过字符串类型,可是,当我们要传递的数据是整型的是,应该怎么办呢?本来我想着使用for循环,可是,总感觉太麻烦了,后来别人告诉我能够使用itoa,以下是it ...
- [Redux] Redux: Extracting Container Components -- AddTodo
Code to be refactored: const AddTodo = ({ onAddClick }) => { let input; return ( <div> < ...