UnixLinux核心编程精简课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《UnixLinux核心编程精简课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UnixLinux 核心 编程 精简 课件
- 资源描述:
-
1、Tar naUnix/Linux 核心编程课程内容Unix/Linux操作系统简介GNU编译工具GCCGNU C内存管理文件I/O进程管理信号进程间通信多线程网络通信UNIX/LINUX操作系统Unix操作系统 UNIX操作系统,是美国AT&T公司于1971年在PDP-11上运行的操作系统。具有多用户、多任务的特点,支持多种处理器架构,最早由肯汤普逊(Kenneth Lane Thompson)、丹尼斯里奇(Dennis MacAlistair Ritchie)和Douglas McIlroy于1969年在AT&T的贝尔实验室开发。Unix的三大派生版本 System V Berkley Hy
2、bridSystem V AIX Solaris HP-UX IRIXBerkleyFreeBSD 一种类UNIX操作系统,但不是真正意义上的UNIX操作系统,它是由经过BSD、386BSD和4.4BSD发展而来的Unix的一个重要分支NetBSD 是一份免费,安全的具有高度可定制性的类Unix操作系统,适于多种平台,从64位AMDAthlon服务器和桌面系统到手持设备和嵌入式设备OpenBSD 一个从NetBSD衍生出来的类Unix操作系统Mac OS X 是苹果公司开发的专属操作系统Mac OS的最新版本。它是一套Unix基础的操作系统,包含两个主要的部份:核心名为Darwin,是以Fre
3、eBSD源代码和Mach微核心为基础,由苹果公司和独立开发者社区协力开发;及一个由苹果电脑开发,名为Aqua之专有版权的图形用户界面。Hybrid Minix 名称取自英语Mini UNIX,是一个迷你版本的类Unix操作系统(约300MB)Linux 是一类Unix计算机操作系统的统称Unix族谱Linux简介 Linux是一种自由和开放源码的类Unix操作系统。目前存在着许多不同的Linux,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,从手机、平板电脑、路由器和视频游戏控制台,到台式计算机、大型机和超级计算机。Linux是一个领先的操作系统,世界上运算最快的10台
4、超级计算机运行的都是Linux操作系统。严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。Linux得名于计算机业余爱好者Linus Torvalds。Tux(一只企鹅,全称为tuxedo)是Linux的标志和Linux相关 MINIX 操作系统 MINIX 系统是由Andrew S.Tanenbaum(AST)开发的。AST 是在荷兰Amsterdam 的Vrije 大学数学与计算机科学系统工作,是ACM 和IEEE 的资深会员 GNU 计划 POSIX 标准 GPL通用公共许可
5、证GNU计划 GNU Project由Richard Stallman发起开始于1984年,由自由软件基金(FSF:Free Software Foundation)支持。GNU的基本原则是共享。GNU的主旨在于发展一个类似 Unix,并且为自由软件的完整操作系统:GNU 系统。目前已经有各种使用 Linux 作为内核的 GNU 操作系统正被广泛地使用著;这些系统通常被称作为“Linux”,但准确的说应该被称GNU/Linux”系统。POSIX 标准 POSIX(Portable Operating System Interface for Computing Systems)是由IEEE 和
6、ISO/IEC 开发的一簇标准。该标准是基于现有的UNIX 实践和经验,描述了操作系统的调用服务接口,用于保证编制的应用程序可以在源代码一级上在多种操作系统上移植运行。POSIX.1 仅规定了系统服务应用程序编程接口(API),仅概括了基本的系统服务标准 在90 年代初,POSIX 标准的制定正处在最后投票敲定的时候,Linux刚刚起步,这个UNIX 标准为Linux 提供了极为重要的信息,使得Linux 的能够在标准的指导下进行开发,能够与绝大多数UNIX 系统兼容。GPL通用公共许可证 GNU通用公共许可证(GPL)一个法定的版权声明,但附带(或,在技术上去除了某些限制),在条款中,允许对
7、某项成果以及由它派生的其余成果的重用,修改和复制对所有人都是自由的。非版权(copyleft)copyleft带有标准的Copyright声明,确认作者的所有权和标志。但它放弃了标准copyright中的某些限制。它声明:任何人不但可以自由分发该成果,还可以自由地修改它。但你不能声明你做了原始的工作,或声明是由他人做的。最终,所有派生的成果必须遵循这一条款(相当于继承关系)版本命名早期版本 第一个版本的内核是0.01。其次是0.02,0.03,0.10,0.11,0.12(第一GPL版本),0.95,0.96,0.97,0.98,0.99及1.0。旧计划(1.0和2.6版之间),版本的格式为A
8、.B.C,其中A,B,C代表:A大幅度转变的内核。这是很少发生变化,只有当发生重大变化的代码和核心发生才会发生。在历史上曾改变两次的内核:1994年的1.0及1996年的2.0。B是指一些重大修改的内核。内核使用了传统的奇数次要版本号码的软件号码系统(用偶数的次要版本号码来表示稳定版本)。C是指轻微修订的内核。这个数字当有安全补丁,bug修复,新的功能或驱动程序,内核便会有变化。第三次,自2.6.0(2003年12月)发布后,人们认识到,更短的发布周期将是有益的。自那时起,版本的格式为A.B.C.DLinux特点 遵循GNU/GPL 开放性 多用户 多任务 设备独立性 供了丰富的网络功能 可靠
9、的系统安全 良好的可移植性Linux发行版 大众的Ubuntu 优雅的Linux Mint 锐意的Fedora 华丽的openSUSE 自由的Debian 简洁的Slackware 老牌的RedHatGNU 编译工具GCC编译工具-GCC 编译,如C、C+、Object C、Java、Fortran、Pascal、Ada等语言。GCC是可以在多种硬件平台上编译出可执行 在使用GCC编译程序时,编译过程可以细分为4个阶段:a.预处理。b.编译。c.汇编。d.链接。程序员可以对编译过程进行控制,同时GCC提供了强大的代码优化功能。查看gcc的版本:gcc vC程序中的文件后缀名扩展名扩展名说明说明
10、.a静态对象库静态对象库.c需要预处理的需要预处理的C语言源代码语言源代码.hC语言源代码头文件语言源代码头文件.i不需要预处理的不需要预处理的C语言源代码语言源代码.o目标文件目标文件.s汇编语言代码汇编语言代码.so共享对象库共享对象库编译单源程序 语法:gcc 选项参数 c文件 通用选项参数说明如下:1、指定输出文件名-o 指定输出文件例子:gcc -o main ch01.c 2、警告与提示.-pedantic检测不符合ANSI/ISO C语言标准的源代码,使用扩展语法的地方将产生警告信息。-Wall 生成尽可能多的警告信息。-Werror 要求编译器将警告当做错误进行处理。3、指定编
11、译文件类型-x 指定编译代码类型,c、c+、assembler,none。None根据扩展名自动确认。例子:gcc x c -Wall o main ch01.c 4、生成调试信息与优化-g 生成调试信息-O优化 5、建议:在编译任何程序的时候都带上-Wall选项。编译多源程序 语法:gcc 选项 C源代码1 C源代码2 C源代码3 思考:头文件的作用是什么?预处理 语法:gcc -E C源代码文件 示例:gcc-E-o ch01.i ch01.c gcc-E-o ch01_1.i ch01_1.c 注意:预处理每次只能处理一个文件。不能处理多个文件,就是每个.c文件对应一个.i文件。不指定
12、o 选项,预处理的结果输出到标准输出设备。预处理指令介绍预编译指示符号预编译指示符号说明说明#define定义宏#elifelse if 多选分支#else与#if、#ifndef、#ifdef结合使用#error产生错误,挂起预处理程序#if判定#endif结束判定#ifdef判定宏是否定义#ifndef判定宏是否定义#include将指定的文件插入#include的位置#include_next与#include一样,但从当前目录之后的目录查找#line指定行号#pragma提供额外信息的标准方法,可用来指定平台#undef删除宏#warning创建一个警告#连接操作符号,用于宏内连接两个
13、字符串#error、#warning#include#define VERSION 3/*演示编译器gcc*/#if(VERSION 2)#error 版本低#else#warning 版本高#endif int main()printf(Hello gcc使用!n);return 0;#include、#include_next1.系统头文件使用#include 2.用户头文件使用#include“”规则:1.系统头文件会在I参数指定得目录中查找。2.用户头文件会在当前目录查找。3.Unix标准系统目录/usr/local/include/usr/lib/gcc-lib/版本/include
14、/usr/include4.编译C+优先查找/usr/include/g+5.#include 会在所有标准目录的子目录sys中查找time.h6.#include的文件名含扩展,*、?无意义。除非文件名中包含*。#line int re=0;printf(Hello gcc使用!n);for(int i=0;i200)re+=i;printf(out:%dn,re);/代码行数被修改#line 200printf(out:%dn,re,a);/人为错误printf(out:%dn,re);#pragma 所有GCC的pragma都定义两个词GCC+其他#pragma GCC dependen
15、cy 文件名 提示符号测试文件的时间戳,当指定文件比当前文件新的时候产生警告。#pragma GCC poison每次使用指定名字就会产生警告pragma pack(1)#pragma有一个等价的宏_Pragam#include#pragma GCC dependency ch02.c/#pragma GCC poison printf addint main()int re=0;printf(Hello gcc使用!n);int i;_Pragma(GCC poison printf add)for(i=0;i200;i+)re+=i;printf(out:%dn,re);return 0;
16、预定义宏介绍宏宏说明说明_BASE_FILE_源代码的完整路径源代码的完整路径_cplusplusC+有效,程序不符合标准为有效,程序不符合标准为1,否则是标准的年月否则是标准的年月_DATE_日期日期_FILE_源代码文件名源代码文件名_func_当前函数名当前函数名_FUNCTION_同上同上_INCLUDE_LEVEL_包含层数包含层数,基本的为基本的为0_LINE_行数行数_TIME_时间时间编译环境变量 C_INCLUDE_PATH:查找头文件的目录。C。CPATH:查找头文件,相当于-l选项。CPLUS_INCLUDE_PATH:查找头文件的目录。C+。LD_LIBRARY_PAT
17、H:编译没有影响,主要影响运行。指定目录便于定位共享库。LIBRARY_PATH:查找连接文件,相当于-l选项生成汇编 编译成汇编 gcc-S ch01.c ch01_1.c 编译汇编 gcc ch01.s ch01_1.s-o main创建静态库编译静态库 gcc-c-static ch01_1.c 其中-static可选,可阻止gcc使用共享库 不使用共享库会使可执行文件变大,但会减少运行时间开销ar指令 ar-r libmy.a ch01_1.o 语法:ar 选项 归档文件名 目标文件列表 指令ar的常用选项选项选项说明说明-d从归档文件删除指定目标文件列表。从归档文件删除指定目标文件列
18、表。-q将指定目标文件快速附加到归档文件末尾。将指定目标文件快速附加到归档文件末尾。-r将指定目标文件插入文档,如果存在则更新。将指定目标文件插入文档,如果存在则更新。-t显示目标文件列表显示目标文件列表-x把归档文件展开为目标文件把归档文件展开为目标文件使用静态库 gcc-o main ch01.c libmy.a 如果libmy.a在LIBRARY_PATH的指定目录中,还可以采用如下方式编译。gcc ch01.c -o main lmy创建共享库 编译共享库 编译共享库分成两个部分:编译成位置独立代码的目标文件,选项-fpic 编译成共享库,选项-shared gcc-c-fpic ch
19、01_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(int a,int b)int
20、 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是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令-ldco
21、nfig.ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表 ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.ldconfig选项(1)-v或-verbose:用此选项时,ldconfig将显示正在扫描的目录及搜索到的动态链接库,还有它所创建的连接的名
22、字.(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,系统默认为/etc/ld.so.conf.(6)-C CACHE:此选项指定生成的缓存文件为CACHE,系统默认的是/etc/ld
23、.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)-l:通常情况下,ldconfig搜索动态链接库时将自动建立动态链接库的连接.选择此项时,将进入专家模式,需要手工设置连接.一般用户不用
24、此项.(9)-p或-print-cache:此选项指示ldconfig打印出当前缓存文件所保存的所有共享库的名字.(10)-c FORMAT 或-format=FORMAT:此选项用于指定缓存文件所使用的格式,共有三种:old(老格式),new(新格式)和compat(兼容格式,此为默认格式).(11)-V:此选项打印出ldconfig的版本信息,而后退出.(12)-?或-help 或-usage:这三个选项作用相同,都是让ldconfig打印出其帮助信息,而后退出.ldd 列出共享库的依赖关系:ldd libmy.soobjdump显示二进制文件信息以一种可阅读的格式让你更多地了解二进制文件
25、可能带有的附加信息-source-S 尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。-show-raw-insn 反汇编的时候,显示每条汇编指令对应的机器码,除非指定了 -prefix-addresses,这将是缺省选项。-no-show-raw-insn 反汇编时,不显示汇编指令的机器码,这是指定-prefix-addresses 选项时的缺省设置。错误处理异常处理方式 根据函数返回值判断异常 返回一般用户数据-1:表示异常,其他就是用户数据 返回指针用户数据 NULL指针,OXFFFFFFFF指针表示错误 其他就是指针用户数据 返回值不是用户
展开阅读全文