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. javax.net.ssl.SSLHandshakeException(Cas导入证书)

    一.报错: javax.net.ssl.SSLHandshakeException二.原因分析:CAS部署时,常常要涉及到HTTPS的证书发布问题.由于在实验环境中,CAS和应用服务常常是共用一台PC ...

  2. android 获取应用的当前版本号&获取当前android系统的版本号

    (转自:http://www.cnblogs.com/qsl568/archive/2012/03/14/2395636.html) 获取当前应用的版本号: private String getVer ...

  3. Ubuntu搭建Note.Js 平台

    1. 安装nodeJs和npm apt-get install nodejsapt-get install npm 2 .node有一个模块叫n,是专门用来管理node.js的版本的.首先安装n模块: ...

  4. 【php+mysql】博客分页制作思路

    1.首先需要初始化设置每页显示的文章数$page_size,mysql数据库中总的文章数$arc_size,页面数$page 2.利用分页公式 (当前页数 - 1 )X 每页条数 , 每页条数Sele ...

  5. 《python核心编》程课后习题——第三章

    核心编程课后习题——第三章 3-1 由于Python是动态的,解释性的语言,对象的类型和内存都是运行时确定的,所以无需再使用之前对变量名和变量类型进行申明 3-2原因同上,Python的类型检查是在运 ...

  6. 便捷的方式在手机上查看Unity3D的Console Log(调试信息)

    Logs Viewer 功能描述 Using this tool you can easily check your editor console logs inside the game itsel ...

  7. java之多线程 二

    线程的生命周期: 当线程被创建并被启动时,它既不是一启动就进入了执行状态,在线程的生命周期中,它要经过new(新建),就绪(Runnable),运行(Running),阻塞(Blocked),dead ...

  8. 物联网平台设计心得:DateTimePicker实现选择联动

    所谓的选择联动,就是指,当我DateTimePicker1选择2月4号的时候,我DateTimePicker2只能选择2月4号和2月5号两天,当然你可以自行规定要选择的日期.这在一些图表查询条件里面是 ...

  9. request.getcontextPath() 详解

    request.getcontextPath() 详解 文章分类:Java编程 <%=request.getContextPath()%>是为了解决相对路径的问题,可返回站点的根路径. 但 ...

  10. 种子填充算法描述及C++代码实现

    项目需要看了种子填充算法,改进了算法主要去除面积小的部分.种子填充算法分为两种,简单的和基于扫描线的方法,简单的算法如下描述(笔者针对的是二值图像): (1)从上到下,从左到有,依次扫描每个像素: ( ...