linux编程指南PPT课件.ppt_第1页
linux编程指南PPT课件.ppt_第2页
linux编程指南PPT课件.ppt_第3页
linux编程指南PPT课件.ppt_第4页
linux编程指南PPT课件.ppt_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

shell编程 在shell接口执行一个复杂任务时 可将多个shell命令组合为一个shell脚本程序脚本文件中可定义变量 使用循环 条件控制命令的执行脚本文件中也可以构造表达式进行算术和比较运算一个shell程序可看作一个新的复杂shell命令Linux套件支持bash tcsh cshell 他们有其各自的shell程序设计语言 其语法略有差别 我们主要以bashshell为例说明 1 脚本文件的构建 是一个包含shell命令的文本文件 可使用任何文本编辑器进行编辑脚本文件的执行 Myshell sh shmyshell sh chmodu xmyshell sh chmod700myshell sh 2 脚本文件的注释 脚本文件 myshell sh 如下 thefollowingisascriptcaninitializetheinterface Cd home niu project1Echowelcome Date 3 脚本文件引用其他脚本文件 脚本文件中可执行shell命令 定义shell变量 执行其他脚本文件执行脚本文件即初始化一个新进程 如果脚本中调用另一个脚本文件 另一个进程开始运行 本脚本文件进程则等待 4 脚本文件的输出变量 如果需要将本脚本文件中定义的变量为调用的脚本文件使用 需要使用命令export变量名完成 为该进程产生的每个子进程定义一个变量拷贝实例如下 5 DispfileMyfile list ExportmyfileEcho display myfile Pr t n myfileprintfile PrintfileEcho printing myfile Lp myfile displayDisplayinglist1screen2modem3paperPrintinglist 6 Shell的算术运算和关系运算 let 该运算用于shell程序流程控制Hello3prgAgain 1Whilelet again 3 doecho againhellolet again again 1 done hello3prg1hello2hello3hello 7 Shell程序的控制结构实现 控制程序的两个部分 测试条件判断为真执行命令 为假不执行命令控制结构种类条件 if case循环 while for for in 8 实现比较操作的test命令 命令语法 testvalue optionvalue teststring string选项决定比较的内容 整数字符串逻辑文件测试等详见p213 214 9 使用vi编辑器打开文件前做一个备份 mycpfile1file2 具体的形式如下 bin shifcp 1 2 thenvi 1 elseecho Failedtocreatebackupcopy fi 10 这个脚本说明了if then else结构的语法 也显示了cp命令的出口状态值是如何被if结构用来决定下一步操作 假如cp的返回值是0 脚本将调用vi编辑这个文件 否则 脚本将显示故障信息 然后退出 不要忘记结束符fi 它的作用是结束if结构 忘记使用fi是Bash脚本中常见的错误之一 11 标准 for 循环简单示例 usr bin envbashforxinonetwothreefourdoechonumber xdone 12 输出 numberonenumbertwonumberthreenumberfour 13 在本例中 指定了四个英语单词 但是字列表也可以引用磁盘上的文件 甚至文件通配符 看看下面的例子 该例演示如何使用标准shell通配符 14 usr bin envbashformyfilein etc r doif d myfile thenecho myfile dir elseecho myfile fidone 15 输出 etc rc d dir etc resolv conf etc resolv conf etc rpc 16 以上代码列出在 etc中每个以 r 开头的文件 要做到这点 bash在执行循环之前首先取得通配符 etc r 然后扩展它 用字符串 etc rc d etc resolv conf etc resolv conf etc rpc替换 一旦进入循环 根据myfile是否为目录 d 条件运算符用来执行两个不同操作 如果是目录 则将 dir 附加到输出行 还可以在字列表中使用多个通配符 甚至是环境变量 17 修改扩展名 txt改为 doc文档 bin shFILES ls txt txt fortxtin FILES dodoc echo txt sed s txt doc mv txt docdone这样可以将 txt文档修改成 doc文档 18 输入 meowfile1file2 相当于 catfile1file2 文件meow bin sh Filename meowfori docat idone 19 输入 listbin 相当于 ls bin 文件listbin bin sh Filename listbinforiin bin doecho idone 20 找出 etc rc d rcX d S 并执行 foriin etc rc d rc runlevel d S do Checkifthescriptisthere f i continue Checkifthesubsystemisalreadyup subsys i etc rc d rc runlevel d S f var lock subsys subsys f var lock subsys subsys init continue Bringthesubsystemup istartdone 21 编译器 函数库 编程工具 Linux可提供实用程序创建可执行程序GCC工具提供C语言和C 语言的编译器符号调试器GDB可定位运行时错误编辑源代码工具 软件打包工具 其他语言的编译工具应用程序的开发需要使用函数库 如Xwindows函数库 GDBM函数库 22 C编译器 GCC GNU版本的C编译器 Linux下命令GCC调用GNUC编译器 GCC命令依次调用以下四个部件 预处理器 处理预编译命令编译器 产生汇编代码汇编装配器 产生目标代码链接器 使目标代码产生可执行程序 23 24 本小节目录 运行gcc egcsgcc egcs的主要选项gdbgdb的常用命令gdb使用范例其他程序 库工具 ar objdump nm size strings strip 创建和使用静态库创建和使用共享库使用高级共享库特性 25 运行gcc Linux中最重要的软件开发工具是GCC GCC是GNU的C和C 编译器 实际上 GCC能够编译三种语言 C C 和ObjectC C语言的一种面向对象扩展 利用gcc命令可同时编译并连接C和C 源程序 例如 有两个源文件main c和factorial c 现在要编译生成一个计算阶乘的程序 26 factorial c include includeintfactorial intn if n includeintfactorial intn intmain intargc char argv intn if argc 2 printf Usage sn n argv 0 return 1 else n atoi argv 1 printf Factorialof dis d n n factorial n return0 27 编译生成可执行文件 并执行 编译链接 gcc ofactorialmain cfactorial c运行可执行程序 factorial5Factorialof5is120 GCC可同时用来编译C程序和C 程序 一般来说 C编译器通过源文件的后缀名来判断是C程序还是C 程序 在Linux中 C源文件的后缀名为 c 而C 源文件的后缀名为 C或 cpp 28 编译并连接C 源文件 通常使用g 命令来完成C 程序的编译和连接 该程序会自动调用gcc实现编译 对于如下的C 源文件 hello C includevoidmain void cout Hello world endl 则可以如下调用g 命令编译 连接并生成可执行文件 g ohellohello C hello结果 Hello world 29 文件扩展名 Gcc通过识别文件 c o s C cpp 30 gcc的主要选项 option s生成汇编代码 p预编译的输出结果 c编译生成目标代码 g使用GNU调试器 lDIRECTORY指定文件包含路径 lLIBRARY连接时搜索指定函数库路径 oFILE生成指定的输出文件 shared生成共享目标文件 通常用在建立共享库时 static禁止使用共享连接 31 编译链接分别进行提高效率 gccmain cfactorial o ofactorial选项的作用 gcc ofactorialmain cfactorial c 32 ELF和a out二进制格式 可执行程序采用的格式 a out 早期格式 与共享库格式不同ELF executableandlinkingformat 采用的标准格式 便于引用共享库 33 gdb GNU的调试器称为gdb 该程序是一个交互式工具 工作在字符模式 在XWindow系统中 有一个gdb的前端图形工具 称为xxgdb gdb是功能强大的调试程序 可完成如下的调试任务 设置断点 监视程序变量的值 程序的单步执行 修改变量的值 34 在可以使用gdb调试程序之前 必须使用 g选项编译源文件 可在makefile中如下定义CFLAGS变量 CFLAGS g运行gdb调试程序时通常使用如下的命令 gdbprogname在gdb提示符处键入help 将列出命令的分类 主要的分类有 aliases 命令别名 breakpoints 断点定义 data 数据查看 files 指定并查看文件 internals 维护命令 running 程序执行 stack 调用栈查看 statu 状态查看 tracepoints 跟踪程序执行 键入help后跟命令的分类名 可获得该类命令的详细清单 35 1 7 4gdb的常用命令 命令解释breakNUM在指定的行上设置断点 bt显示所有的调用栈帧 该命令可用来显示函数的调用顺序 clear删除设置在特定源文件 特定行上的断点 其用法为 clearFILENAME NUM continue继续执行正在调试的程序 该命令用在程序由于处理信号或断点而导致停止运行时 displayEXPR每次程序停止后显示表达式的值 表达式由程序定义的变量组成 36 fileFILE装载指定的可执行文件进行调试 helpNAME显示指定命令的帮助信息 infobreak显示当前断点清单 包括到达断点处的次数等 infofiles显示被调试文件的详细信息 infofunc显示所有的函数名称 infolocal显示当函数中的局部变量信息 infoprog显示被调试程序的执行状态 infovar显示所有的全局和静态变量名称 37 kill终止正被调试的程序 list显示源代码段 make在不退出gdb的情况下运行make工具 next在不单步执行进入其他函数的情况下 向前执行一行源代码 printEXPR显示表达式EXPR的值 38 1 7 5gdb使用范例 一个有错误的C源程序bugging c include includestaticcharbuff 256 staticchar string intmain printf Pleaseinputastring gets string printf nYourstringis s n string 39 这个程序的功能是接受用户的输入 然后将用户的输入打印出来 该程序使用了一个未经过初始化的字符串地址string 因此 编译并运行之后 将出现SegmentFault错误 gcc otest gtest c testPleaseinputastring asfdSegmentationfault coredumped 40 利用gdb查找程序出现的问题 1 运行gdbbugging命令 装入bugging可执行文件 2 执行装入的bugging命令 3 使用where命令查看程序出错的地方 4 利用list命令查看调用gets函数附近的代码 5 唯一能够导致gets函数出错的因素就是变量string 用print命令查看string的值 6 在gdb中 我们可以直接修改变量的值 只要将string取一个合法的指针值就可以了 为此 我们在第11行处设置断点 7 程序重新运行到第11行处停止 这时 我们可以用setvariable命令修改string的取值 8 然后继续运行 将看到正确的程序运行结果 41 1 7 6其他程序 库工具 strip nm size string 42 创建和使用函数库 C语言程序中经常使用一些标准的任务 以目标代码形式存在 预编译时将这些函数与源代码生成的目标程序进行链接 生成可执行程序 避免重新编译常用的函数库有 常置于路径 usr lib下 LibdbmLibmXlib11Libc 43 函数库的三种形式 静态 函数库代码编译时包含在程序中共享 运行时代码载入函数代码 编译时验证函数原型 主要方式 ELF格式确保可行 动态 运行时根据指令执行需要载入运行 可以卸载 代码量小 44 函数库连接示例 gccmain cio c obook lm 连接数学库函数 gccmain cio c obook lm lncurses 连接数学库函数和光标控制库函数 45 动态链接库技术 在Windows和Linux系统中都有动态库的概念 采用动态库可以有效的减少程序大小 节省空间 提高效率 增加程序的可扩展性 便于模块化管理 但不同操作系统的动态库由于格式不同 在需要不同操作系统调用时需要进行动态库程序移植 46 动态库 DynamicLinkLibraryabbr DLL 技术是程序设计中经常采用的技术 其目的减少程序的大小 节省空间 提高效率 具有很高的灵活性 采用动态库技术对于升级软件版本更加容易 与静态库 StaticLinkLibrary 不同 动态库里面的函数不是执行程序本身的一部分 而是根据执行需要按需载入 其执行代码可以同时在多个程序中共享 47 Linux共享对象技术 在Linux操作系统中 采用了很多共享对象技术 SharedObject 虽然它和Windows里的动态库相对应 但它并不称为动态库 相应的共享对象文件以 so作为后缀 Linux系统的 lib以及标准图形界面的 usr X11R6 lib等目录里面 就有许多以so结尾的共享对象 同样 在Linux下 也有静态函数库这种调用方式 相应的后缀以 a结束 Linux采用该共享对象技术以方便程序间共享 节省程序占有空间 增加程序的可扩展性和灵活性 Linux还可以通过LD PRELOAD变量让开发人员可以使用自己的程序库中的模块来替换系统模块 48 在Linux中创建和使用动态库 编译函数库源程序时加上 shared选项即可 这样所生成的执行程序就是动态链接库 通常这样的程序以so为后缀 在Linux动态库程序设计过程中 通常流程是编写用户的接口文件 通常是 h文件 编写实际的函数文件 以 c或 cpp为后缀 再编写makefile文件 对于较小的动态库程序可以不用如此 但这样设计使程序更加合理 49 编译

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论