1.malloc工作原理:     malloc使用一个数据结构(链表)维护分配空间

    链表的构成:分配的空间/上一个空间数据/下一个空间/空间大小等信息.
    对malloc分配的空间不要越界访问.因为容易破坏后台维护结构.导致malloc/free/calloc/realloc不正常工作.
2.有关__stdcall __cdecl __fastcall
<1>.决定函数栈压栈的参数顺序. <2>.决定函数栈的清空方式   <3>.决定了函数的名字转换方式.
__cdecl
  这是编译器默认的函数调用转换方式,它可以处理可变参数的函数调用。参数的入栈顺序是从右向左。在函数运行结束后,由调用函数负责清理入栈的参数。在编译时,在每个函数前面加上下划线(_),没有函数名大小写的转换。即_functionname
  每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。注意:对于可变参数的成员函数,始终使用__cdecl的转换方式。
 
__fastcall
  有一些函数调用的参数被放入ECX,EDX中,而其它参数从右向左入栈。被调用函数在它将要返回时负责清理入栈的参数。在内嵌汇编语言的时候,需要注意寄存器的使用,以免与编译器使用的产生冲突。函数名字的转换是:@functionname@number没有函数名大小写的转换,number表示函数参数的字节数。由于有一些参数不 需要入栈,所以这种转换方式会在一定程度上提高函数调用的速度。
 
__stdcall
  函数参数从右向左入栈,被调用函数负责入栈参数的清理工作。函数名转换格式如下:_functionname@number
 

3.虚拟内存:      虚拟地址与物理地址映射的时候有一个基本单位: 4k  一个内存页.     如果虚拟地址没有映射到物理地址,试图用指针访问必定发生段错误

4.分配释放内存函数:      int brk(void *end);//分配空间,释放空间
     void *sbrk(int size);//返回空间地址 
            sbrk(int  size)
    sbrk与brk后台系统维护一个指针.
    指针默认是null.
    调用sbrk,判定指针是否是0,是:得到大块空闲空间的首地址初始化指针.
5.映射虚拟内存函数:
  mmap(分配)/unmap(释放)
 
void *mmap(
void *start,//指定映射的虚拟地址 0由系统指定开始位置)
size_t length,//映射空间大小 pagesize倍数
int prot,//映射权限  PROT_NONE | PROT_READ PROT_WRITE PROT_EXEC
int flags,//映射方式
int fd,//文件描述符号
offset_t off);//文件中的映射开始位置(必须是pagesize的倍数)
 
映射方式:
内存映射:匿名映射。
文件映射:映射到某个文件   只有文件映射最后两个参数有效。
 
MAP_ANONYMOUS
MAP_SHARED   MAP_PRIVATE(二选一)
 
 
 
6.编译工具与动态库:
 
<1> gcc
-o  输出文件名
-O  -O0 -O1 -O2 -O3 编译优化
-g  -g0 -g1 -g2 -g3  产生调试信息
-W  all  error  
-Wall  显示所有警告 
-Werror   把警告当错误
-w  关闭警告
 
 
 
-c  只编译不连接
-E  预编译
-S  汇编
 
-D 在命令行定义宏。
在代码中定义宏
在命令行定义宏
 
-x  指定编译的语言类型
c++
c
.S
none 自动判定
-std=C89
C99
 
 
 
编译过程:-E  -c -S   自动调用连接器
连接器 ld
补充:
.c
.cpp
.CC
.h
.hpp
.o
.a
.so
.i    预编译文件
.s  汇编文件
 
 
<2>
1.编译过程(*.a   achieve)
1.1.编译成目标文件
-static  可选
gcc -c -static 代码文件.c
 
1.2.归档成静态库
ar工具
ar -r  ||  -t
ar -r 静态库文件  被归档的文件
 
nm工具(察看函数符号表)
nm 静态库或者动态库或者目标文件或者执行文件
1.3.使用静态库
gcc 代码  静态库 
 
2.库的规范与约定
库命名规则:
lib库名.a.主版本号.副版本号.批号
lib库名.a
库使用规则
-l 库名
-L 库所在目录
 
 
<3>.动态库的编译
 
1.什么是动态库?(共享库)
动态库是可以执行,静态库不能执行
但动态库没有main,不能独立执行。
动态库不会连接成程序的一部分。
程序执行的时候,必须需要动态库文件。
 
2.工具
       ldd  察看程序需要调用的动态库
ldd 只能察看可执行文件.
readelf -h 察看执行程序头.
nm   察看库中的函数符号
 
3.动态库的编译
3.1.编译
-c -fpic(可选)
3.2.连接
shared
4.使用动态库
gcc 代码 动态库文件名
gcc 代码   -l库名 -L动态库所在路径
 
标准命名规则:
lib库名.so
        lib库名.a
-l 库名  -L 库所在路径
 
<5>使用libdl.so库
动态库加载的原理 动态库中函数的查找已经封装成库libdl.so
 
dlopen  打开一个动态库
dlsym 在打开动态库找一个函数
dlclose 关闭动态库
//dlerror 返回错误
 
 
7.make工具的使用:
(1). vi  demo.mk
(2)编辑:  demo:
                           gcc -c -fpic test1.c
                           gcc -c -fpic test2.c
                           gcc test1.o  test2.o  -shared  -o libtest.so
                           gcc main.c -l test -o main -L.
(3).执行demo.mk文件:
               make -f demo.mk demo
注意:须将libtest.so 库文件拷贝到/lib或usr/lib目录下
 
 
 
8.使用main方法参数获得环境变量:(直接获取可以用env)
 
int main(int argc,char*argv[],char**arge)
{
        while(*arge)
       {
              printf("%s\n",*arge);
              arge++;
       }
}
 
 
 
9.IO基础
 
<1>.认识内核对象
不允许访问内核设备和内存,
但可以通过内核系统函数去访问.
对每个内核对象进行编号ID.
如果访问内核对象,只能通过ID.
编程模型:
申请得到一个ID
在内核系统函数中使用ID得到对应内核对象数据
<2>.怎么访问文件
使用函数,传递一个文件,系统打开文件,加载文件数据,
返回一个ID.
使用函数,传递ID,得到数据.
使用函数传递ID,告诉系统释放文件.
 
ID:文件描述符号.file description (fd)
 
每个程序执行的时候都有一个目录,存放打开的文件描述符号
 
<3>.每个程序默认打开三个文件设备:
0:标准输入
1:标准输出
2:错误输出
 
<4>.操作文件描述符号
ssize_t write(int fd,
void *buf,//要写入内核对象的数据
size_t size);//写入数据大小
返回:
>0 实际写入的数据
-1 写入错误
 
ssize_t read(int fd,
void *buf,//返回数据的空间
size_t size);//空间大小
返回:
>0:实际读取的数据
=0:碰到文件结束符号EOF (ctrl+d)
-1:读取错误
 
建议:
0:输入
1:输出
2:错误输出
<5>.linux系统下文件的类型:
       目录文件d
       普通文件f
       字符设备文件c
       块设备文件b
       软连接文件l
       管道文件p
       socket文件s
 
 

UnixC学习小结的更多相关文章

  1. flex学习小结

    接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...

  2. Python 学习小结

    python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...

  3. react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)

    react学习小结   本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...

  4. objective-c基础教程——学习小结

    objective-c基础教程——学习小结   提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...

  5. pthread多线程编程的学习小结

    pthread多线程编程的学习小结  pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写     程序员必上的开发者服务平台 —— DevSt ...

  6. ExtJs学习笔记之学习小结LoginDemo

    ExtJs学习小结LoginDemo 1.示例:(登录界面) <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  7. 点滴的积累---J2SE学习小结

    点滴的积累---J2SE学习小结 什么是J2SE J2SE就是Java2的标准版,主要用于桌面应用软件的编程:包括那些构成Java语言核心的类.比方:数据库连接.接口定义.输入/输出.网络编程. 学习 ...

  8. (转) Parameter estimation for text analysis 暨LDA学习小结

    Reading Note : Parameter estimation for text analysis 暨LDA学习小结 原文:http://www.xperseverance.net/blogs ...

  9. dubbo学习小结

    dubbo学习小结 参考: https://blog.csdn.net/paul_wei2008/article/details/19355681 https://blog.csdn.net/liwe ...

随机推荐

  1. C++的单例模式与线程安全单例模式(懒汉/饿汉)

    1 教科书里的单例模式 我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实 ...

  2. 重装win7、vs15、sqlserver08、驱动经验教训

    问自己:为什么要进行系统清洗 1.C盘已经接近爆满,vs2015无法安装. 2.C盘以前的残留软件.文件不知道如何化解,原vs2010卸载困难. 3.整个系统反应迟缓. 改进方案: 1系统C盘 2软件 ...

  3. sp_addlinkedserver '(null)' is an invalid product name

    使用SSMS 2008客户端工具逆向生成了创建链接服务器的脚本时,在测试环境执行是报如下错误:'(null)' is an invalid product name. USE [master] GO ...

  4. 利用nagios搭建打印机监控服务器

    实验背景:公司有很多台HP惠普打印机,管理起来比较麻烦.于是想着能否做个打印机监控服务器,能够快速响应打印机所出现的所有问题.之后上网查了相关资料搭建了一台,使用也没任何问题,于是便拿出来跟大家分享. ...

  5. 通过RTMP play分析FLV格式详解

    最近做了一个rtmp中转服务程序,通过实践,熟悉rtmp play和push中各类格式,这里总结一下. 程序github地址: https://github.com/runner365/rtmp_re ...

  6. less简单入门

    官网地址 http://lesscss.org/ less手册 www.lesscss.net/ bootstrap官网less介绍 http://www.bootcss.com/p/lesscss/ ...

  7. 解决Docker容器时区及时间不同步问题

    今天在系统集成测试时由测试人员提交了一个测试bug,原因是提交业务数据时间与实际时间(北京时间)有偏差,导致统计异常.由于我们集成测试是向测试人员直接提供完整的Docker镜像作为测试环境,原因应该是 ...

  8. golang中的slice翻转存在以及map中的key判断

    //slice翻转 func stringReverse(src []string){ if src == nil { panic(fmt.Errorf("the src can't be ...

  9. Hibernate第三次测试错题解析

    此题目考查的是Hibernate查询缓存适用的场合,对于经常使用的查询语句, 如果启用了查询缓存,当第一次执行查询语句时,Hibernate会把查询结果存放在第二缓存中. 以后再次执行该查询语句时,只 ...

  10. Jenkins学习四:Jenkins 邮件配置

    本文主要对Windows环境 jenkins 的邮件通知进行介绍 jenkins 内置的邮件功能 使用email-ext插件扩展的邮件功能 邮件通知功能主要包含两个部分:全局配置和项目配置. 一. 先 ...