您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > Linux平台C及C++软件开发入门
Linux平台C及C++软件开发入门邢延超2009年秋季学期主要内容•Linux操作系统的安装及使用•gcc、gdb及makefile文件•内存分配与函数调用•文件和目录操作•网络编程基础•多线程编程•进程间通信Linux操作系统•操作系统属性–基本的系统软件,是硬件的第一级扩充–基本特征•多任务并行:分时服务•资源共享–使用用户可以充分地利用系统资源–用户可忽略硬件设备控制细节,只需提出要求•操作系统负责操纵设备以完成所希望的工作–资源分配策略(如根据优先级)–通过控制、调度、分配、管理计算机系统资源,达到对计算机的自动控制操作系统主要功能•存贮管理–为每个程序分配足够的存贮空间•CPU管理–为程序分配优先级–采用一定调度方法,以时间片轮转方式轮流占用CPU•设备管理–控制外部设备的操作–在多个作业间分配设备•独占设备,如打印机–按一定策略轮流分配给用户使用•共享设备:磁盘阵列•文件管理–文件的建立、删除、读取、或写入等方面的服务•进程与线程管理、调度等Linux的发展•1991年8月,核心由25岁的芬兰大学生LinusTorvalds发布–Linux=Linus+Minix(Linux编写的类似Minix的系统)–Minix=MiniUNIX,约300MB(还有Idris,Coherent,Uniflex等)–都是重新发展的,并没有使用任何AT&T的程序码•发布到Internet上后不断修改和完善,几年后在全球普及•应用平台–最初针对的是Intel构架的个人计算机–在服务器领域:Sun公司的Sparc工作站、DEC公司的Alpha工作站等–嵌入式开发方面具有无可比拟的优势•特色–源代码是自由分发的,完全公开,完全免费–涵盖了Unix的所有特诊,融合了其它OS的东西•真正的多任务、虚拟存储、快速的TCP/IP实现、共享库、多用户、支持32位和64位多任务•Linux应用逐渐普及–服务器–家庭机Linux操作系统的特点•内核特点:短小精悍,具有更高的灵活性和适应性•最大特点:源代码完全公开(核心、驱动,应用程序等)•主要特点–(1)多用户、多任务的操作系统•多个用户可以同时在相同计算机上操作(通过终端或虚拟控制台)•可同时执行多个进程,提供了进程间通信方式,使各进程能协同工作•具有进程间内存地址保护(当某个进程出错时,不会波及整个系统)–(2)支持多种文件系统•Ext2FS、ISOFS、Minix、Xenix、FAT16、FAT32、NTFS等•自己还有一个先进的文件系统(4TB)•KiloByteMegaByteGigaByteTeraByte(万亿)–(3)符合POSIX1003.1标准•能够使用Unix等OS上丰富的应用程序–(4)较好的可移植性•只有小于10%的源代码采用汇编语言编写,其余均采用C–(5)支持多平台和多处理器–(6)全面支持TCP/IP网络协议•TCP、IPv4、IPX、DDP、AX.25等Linux与Windows的不同•Linux的应用目标是网络而不是打印–纯文本易于跨网络工作,Linux配置文件和数据都以文本为基础•Linux开发更多关注的是其内在功能而非表面的东西•图形环境并没有集成到Linux中–是运行于系统之上的单独一层,可选择•Linux不使用文件名扩展来识别文件的类型–Linux通过文件访问权限来判断文件是否为可执行文件•一旦开始运行将保持运行状态,直到受到外来因素的影响–除了Linux内核之外,其他软件的安装、启动、停止和重新配置都不用重新引导系统•可以远程地完成Linux中的很多工作•如果系统中一个特定的服务出现了问题,可以在进行故障诊断的同时让其他服务继续运行•命令区分大小写•用户操作没有Windows系列方便Linux系统的安装•一般安装–分配单独的硬盘分区;设置为Linux支持的硬盘格式•虚拟机安装–定义:软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统–可以在一台物理计算机上模拟出一台或多台虚拟的计算机•完全就像真正的计算机那样进行工作–安装操作系统、安装应用程序、访问网络资源等–对用户,虚拟机只是运行在物理计算机上的一个应用程序–对虚拟机中运行的应用程序,它就像是一个真正的计算机–虚拟机中发生的系统崩溃只是虚拟机上的操作系统•不是物理计算机上的操作系统•使用“Undo”功能,可以马上恢复虚拟机到安装软件前的状态–当前主流虚拟机•VMware(VMWareACE)–在多操作系统支持和执行效率上都明显高出一筹•VirtualPCLinux的使用1•图形化界面–Mozilla、文本编辑器、目录管理器、CD播放器•控制台–文本界面•高效•开发•系统管理•目录结构–惟一根目录–权限设置•文件–PATH变量Linux的使用2•部分Linux命令的简单介绍–man–pwd–ls–cp–mv–chmod–cd–echo–mkdir–rm–su–netstatLinux的使用3•系统管理员–构建各种服务器–用户管理–系统运行情况监测•服务器被攻击•开发人员–图形化开发工具(如Qt)–非图形化开发工具(gcc)•一般用户–很多时候利用图形化界面完成工作•娱乐•文档编辑•上网gcc及其使用•GNU之父Stallman开发的Linux下的编译器–GCC=GNUCompilerCollection•目前可以编译的语言–C,C++,Objective-C,Fortran,Java,andAda•从源文件到可执行文件–gcc-E完成预处理,输出域名(展开)•#include;#define;etc–gcc-s不进行汇编,只生成汇编语言•某些代码直接就是用汇编写的–gcc-c将原文件编程.o文件(即二进制文件)•仍然不可执行,为什么?–gcc-o指定输出文件的名字,重新命名•不加-o,输出a.outmakefile-1•“自动化编译”,提高效率–写好后,只需调用make,整个工程完全自动编译•大多数的IDE都有这个命令–Delphi的make–VisualC++的nmake–Linux下GNU的make•Make工具最主要也是最基本的功能–通过makefile文件来描述源程序之间的相互关系–自动维护编译工作•makefile文件需要按照某种语法进行编写–说明如何编译各个源文件并连接生成可执行文件–定义源文件之间的依赖关系•-f选项–缺省文件名为Makefile或makefile–make–fMyMakefilemakefile-2•#Itisaexamplefordescribingmakefile•prog:filea.ofileb.ofilec.o•ccfilea.ofileb.ofilec.o-LS-oprog•filea.o:filea.ca.hdefs•cc-cfilea.c•fileb.o:fileb.cb.hdefs•cc-cfileb.c•filec.o:filec.cc.h•cc-cfilec.c•注1:一定要用Tab键•注2:目标vs依赖关系(最小重建)makefile-3•Makefile中的宏定义–OBJECTS=filea.ofileb.ofilec.o–LIBES=-LS–prog:$(OBJECTS)–cc$(OBJECTS)$(LIBES)-oprog•GNUmake的主要预定义变量–$*:不包含扩展名的目标文件名称–$+:所有依赖文件(可重复),空格分开,以出现先后为序–$:第一个依赖文件的名称–$?:所有依赖文件,空格分开,修改日期比目标创建日期晚–$@:目标的完整名称–$^:所有依赖文件,以空格分开,不包含重复的依赖文件–$%:若目标是归档成员,则该变量表示目标的归档成员名称makefile-4•Makefile中定义模式规则–使用模式规则来定义一个隐含规则–把所有的[.c]文件都编译成[.o]文件–%.o:%.c–$(CC)-c$(CFLAGS)$(CPPFLAGS)$-o$@–取消内建的隐含规则,只要不在后面写命令就行–%.o:%.s•-l(小L)参数–添加库文件•-I(大i)参数–添加include文件路径gdb的使用1•GDB主要完成下面四个方面的功能–启动程序,按照自定义的要求随心所欲地运行程序–设置断点(断点可以是条件表达式)–程序停住时,可以检查此时程序中所发生的事–动态改变程序的执行环境(变量值等)•使用条件–编译时要设置-g参数–编译结果包含调试信息•使用方式–利用gdb启动程序–指定进程ID,gdb自动attach上去并调试–同时调试一个运行程序和core文件gdb的使用2•1、使用gdb启动程序–gdbmyprogram•2、设置断点(breakpointb)–(gdb)bfilename:line-number–(gdb)bfilename:function-name–(gdb)b46iftestsize==100(当前文件的46行)•3、开始执行(runr)•4、变量的检查和赋值–whatis:识别数组或变量的类型–ptype:比whatis的功能更强,可以提供一个结构的定义–setvariable:将值赋予变量–print:显示一个变量的值外;还可以用来赋值gdb的使用3•5、继续执行(continuec)•6、单步执行–next(n):不进入的单步执行–step(s):进入的单步执行–finish:想退出该函数返回到它的调用函数中•7、函数的调用–(gdb)callgen_and_sork(1234,1,0)•8、显示数据–(gdb)printp(p为变量名)–(gdb)printfind_entry(1,0)•9、程序参数–(gdb)setargs–b–x–(gdb)showargs•10、断点管理–(gdb)infobreak–(gdb)deletebreakpoint1–(gdb)disable/enablebreakpoint1变量的作用域与内存分配•全局变量•临时变量•类成员(C++)•namespace•内存分配原则–全局变量存放在数据区–局部变量存放在栈区–动态变量存放在堆区•栈–是系统提供并管理,快速高效,无须释放(自动释放)–对进程/线程是惟一的–普通的栈数据结构,LIFO–局部变量安排在那里,可以在一个函数结束后平衡堆栈–缺点是有限制,数据不灵活变量的作用域与内存分配•堆(动态区)–函数库提供,灵活方便,数据适应面广泛--程序员管理–对进程/线程不一定唯一–程序编译时产生的一块用于产生动态内存分配使用的块–操作比栈麻烦,分配和回收时的效率比栈低•分配时要判断最优地址:防止产生无用的内存碎片–需要精确的申请内存/释放内存匹配•分静态分配–编译器完成的,比如自动变量(auto)的分配•动态分配–由alloc函数完成–栈的动态分配无需释放(是自动的)•静态变量(static)–作用域可以是局部的–静态区的一次存取(具有记忆性)堆栈区别的小结•使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小•使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大•虽然堆栈、堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因函数调用的过程•压入参数–将调用者给出的参数一一压入堆栈•压入断点–程序执行到Call指令时,当前语句地址作为断点地址压入堆栈•跳转–当前指令下一条指令的地址被重设为被调函数的起始地址•堆栈中已分配给局部变量的内存空间的初始化•顺序执行函数内语句–此时函数的堆栈位于所有局部变量的内存空间之后•返回–为保障调用的正常返回,函数内应当保证规范使用堆栈–使即将返回的时候“下一条指令地址”值恢复为执行第一条语句前的状态–每一条push都要有相应的pop•为什么值参的修改不起作用?编程辅助工具•版本管理–CVS:ConcurrentVersionSystem–VSS:VisualSourceSafe•BeyondC
本文标题:Linux平台C及C++软件开发入门
链接地址:https://www.777doc.com/doc-3352893 .html