169编号Unix_Linux核心编程(精简)

上传人:玩*** 文档编号:144815463 上传时间:2020-09-14 格式:PPT 页数:370 大小:4.70MB
返回 下载 相关 举报
169编号Unix_Linux核心编程(精简)_第1页
第1页 / 共370页
169编号Unix_Linux核心编程(精简)_第2页
第2页 / 共370页
169编号Unix_Linux核心编程(精简)_第3页
第3页 / 共370页
169编号Unix_Linux核心编程(精简)_第4页
第4页 / 共370页
169编号Unix_Linux核心编程(精简)_第5页
第5页 / 共370页
点击查看更多>>
资源描述

《169编号Unix_Linux核心编程(精简)》由会员分享,可在线阅读,更多相关《169编号Unix_Linux核心编程(精简)(370页珍藏版)》请在金锄头文库上搜索。

1、,Unix/Linux 核心编程,课程内容,Unix/Linux操作系统简介 GNU编译工具GCC GNU C 内存管理 文件I/O 进程管理 信号 进程间通信 多线程 网络通信,Unix/Linux操作系统,Unix操作系统,UNIX操作系统,是美国AT return 0; ,#include、#include_next,1.系统头文件使用#include 2.用户头文件使用#include “” 规则: 1.系统头文件会在I参数指定得目录中查找。 2.用户头文件会在当前目录查找。 3.Unix标准系统目录 /usr/local/include /usr/lib/gcc-lib/版本/inc

2、lude /usr/include 4.编译C+优先查找/usr/include/g+ 5.#include 会在所有标准目录的子目录sys中查找time.h 6.#include的文件名含扩展,*、?无意义。除非文件名中包含*。,#line,int re=0; printf(Hello gcc使用!n); for(int i=0;i200) re+=i; printf(out:%dn,re); /代码行数被修改 #line 200 printf(out:%dn,re,a);/人为错误 printf(out:%dn,re);,#pragma,所有GCC的pragma都定义两个词GCC +其他

3、#pragma GCC dependency 文件名 提示符号 测试文件的时间戳,当指定文件比当前文件新的时候产生警告。 #pragma GCC poison 每次使用指定名字就会产生警告 pragma pack(1) ,#pragma有一个等价的宏_Pragam,#include #pragma GCC dependency ch02.c /#pragma GCC poison printf add int main() int re=0; printf(Hello gcc使用!n); int i; _Pragma(GCC poison printf add) for(i=0;i200;i+

4、) re+=i; printf(out:%dn,re); return 0; ,预定义宏介绍,编译环境变量,C_INCLUDE_PATH: 查找头文件的目录。C。 CPATH:查找头文件,相当于-l选项。 CPLUS_INCLUDE_PATH :查找头文件的目录。C+。 LD_LIBRARY_PATH:编译没有影响,主要影响运行。指定目录便于定位共享库。 LIBRARY_PATH:查找连接文件,相当于-l选项,生成汇编,编译成汇编 gcc -S ch01.c ch01_1.c 编译汇编 gcc ch01.s ch01_1.s -o main,创建静态库,编译静态库 gcc -c -static

5、 ch01_1.c 其中-static可选,可阻止gcc使用共享库 不使用共享库会使可执行文件变大,但会减少运行时间开销 ar指令 ar -r libmy.a ch01_1.o 语法:ar 选项 归档文件名 目标文件列表 指令ar的常用选项,使用静态库,gcc -o main ch01.c libmy.a 如果libmy.a在LIBRARY_PATH的指定目录中,还可以采用如下方式编译。 gcc ch01.c -o main lmy,创建共享库,编译共享库 编译共享库分成两个部分: 编译成位置独立代码的目标文件,选项-fpic 编译成共享库,选项-shared gcc -c -fpic ch0

6、1_1.c gcc -shared ch01_1.o -o libmy.so 使用一条指令的效果一样 gcc -fpic -shared ch01_1.c -o libmy.so,定位共享库,共享库编译的时候与静态库一样依赖LIBRARAY_PATH,运行的时候依赖LD_LIBRARY_PATH。 规则: 查找LD_LIBRARY_PATH,目录使用冒号分隔。 /ect/ld.so.cache中找到的列表。工具ldconfig维护。 目录/lib 目录/usr/lib,使用共享库,gcc ch01.c libmy.so -o main 在代码中动态加载共享库: 共享库代码 int add(in

7、t a,int b) int c=a+b; c=c/2; return c; ,共享库的四个函数,#include void *dlopen(const char *filename, int flag); char *dlerror(void); void *dlsym(void *handle, const char *symbol); int dlclose(void *handle); 其中dlopen的参数flag的含义如下: RTLD_LAZY:符号查找时候才加载。 RTLD_NOW:马上加载。,其他工具简介,库工具程序介绍,ldconfig ldconfig是一个动态链接库管理命

8、令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令-ldconfig. ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表 ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.,ldconfig选项,(1) -v或-verbose : 用此选

9、项时,ldconfig将显示正在扫描的目录及搜索到的动态链接库,还有它所创建的连接的名字. (2) -n : 用此选项时,ldconfig仅扫描命令行指定的目录,不扫描默认目录(/lib,/usr/lib),也不扫描配置文件/etc/ld.so.conf所列的目录. (3) -N : 此选项指示ldconfig不重建缓存文件(/etc/ld.so.cache).若未用-X选项,ldconfig照常更新文件的连接. (4) -X : 此选项指示ldconfig不更新文件的连接.若未用-N选项,则缓存文件正常更新. (5) -f CONF : 此选项指定动态链接库的配置文件为CONF,系统默认为/

10、etc/ld.so.conf. (6) -C CACHE : 此选项指定生成的缓存文件为CACHE,系统默认的是/etc/ld.so.cache,此文件存放已排好序的可共享的动态链接库的列表.,(7) -r ROOT : 此选项改变应用程序的根目录为ROOT(是调用chroot函数实现的).选择此项时,系统默认的配置文件/etc/ld.so.conf,实际对应的为 ROOT/etc/ld.so.conf.如用-r /usr/zzz时,打开配置文件/etc/ld.so.conf时,实际打开的是/usr/zzz/etc/ld.so.conf文件.用此选项,可以大大增加动态链接库管理的灵活性. (8

11、) -l : 通常情况下,ldconfig搜索动态链接库时将自动建立动态链接库的连接.选择此项时,将进入专家模式,需要手工设置连接.一般用户不用此项. (9) -p或-print-cache : 此选项指示ldconfig打印出当前缓存文件所保存的所有共享库的名字. (10) -c FORMAT 或 -format=FORMAT : 此选项用于指定缓存文件所使用的格式,共有三种:old(老格式),new(新格式)和compat(兼容格式,此为默认格式). (11) -V : 此选项打印出ldconfig的版本信息,而后退出.(12) -? 或 -help 或 -usage : 这三个选项作用相

12、同,都是让ldconfig打印出其帮助信息,而后退出.,ldd,列出共享库的依赖关系:ldd libmy.so,objdump,显示二进制文件信息 以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息 -source -S 尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时, 效果比较明显。隐含了-d参数。 -show-raw-insn 反汇编的时候,显示每条汇编指令对应的机器码,除非指定了 -prefix-addresses,这将是缺省选项。 -no-show-raw-insn 反汇编时,不显示汇编指令的机器码,这是指定 -prefix-addresses 选项时的缺省设

13、置。,错误处理,异常处理方式,根据函数返回值判断异常 返回一般用户数据 -1:表示异常,其他就是用户数据 返回指针用户数据 NULL指针,OXFFFFFFFF指针表示错误 其他就是指针用户数据 返回值不是用户数据,只是用来指明函数调用状态。 0:成功 -1:失败 返回void。一般不会发生错误,异常处理方式,使用外部全局变量errno获取异常原因 根据errno得到异常编号 errno在函数调用正确不会被修改 绝对不要通过errno判定错误 把errno转换为字符串 strerror函数 perror函数 printf函数 printf()的格式输出%m格式,环境变量,环境表 每个程序都会接收

14、到一张环境表,是一个字符指针数组。数组以null做为结束。 全局变量environ保存了该数组的首地址。 环境变量操作函数,内存管理在语言结构上的变化,从malloc/free到new/delete C+是强类型语言,new/delete的主要成果也就是加强了类型观念,减少了强制类型转换的需求。但是从内存管理角度看,这个变革并没有多少的突破性 从new/delete到内存配置器(allocator) allocator的引入也是C+内存管理一个突破。留意一下你就可以发现,整个STL所有组件的内存均从allocator分配。也就是说,STL并不推荐使用new/delete进行内存管理,而是推荐使

15、用allocator.,Unix/Linux内存管理,Unix/Linux低层采用三层结构,实际使用中可以方便映射到两层或者三层结构,以适用不同的硬件结构。最下层的申请内存函数get_free_page。之上有三种类型的内存分配函数 1.kmalloc类型。内核进程使用,基于切片(slab)技术,用于管理小于内存页的内存申请。思想出发点和应用层面的内存缓冲池同出一辙。但它针对内核结构,特别处理,应用场景固定,不考虑释放。 2.vmalloc类型。内核进程使用。用于申请不连续内存。 3.brk/mmap类型。用户进程使用。malloc/free实现的基础。,进程与内存,所有进程(执行的程序)都必

16、须占用一定数量的内存 对任何一个普通进程来讲,它都会涉及到5种不同的数据段 代码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存种的镜像。代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作它是不可写的。 数据段:数据段用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量。 BSS段:BSS段包含了程序中未初始化全局变量,在内存中 bss段全部置零。 Block started by symbol,堆和栈,堆(heap):堆是用于存放进程运行中被动态分配的内存段,它大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减) 栈:栈是用户存放程序临时创建的局部变量,也就是说我们函数括弧“”中定义的变量(但不包括static声明的变量,static意味这在数据段中存放变量)。除此以外在函数被调用时,其参数也会被

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号