第六章UNIX系统编程基础_第1页
第六章UNIX系统编程基础_第2页
第六章UNIX系统编程基础_第3页
第六章UNIX系统编程基础_第4页
第六章UNIX系统编程基础_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

第6章Unix系统编程基础理解:程序设计环境(用户空间和系统空间)理解:基于操作系统的程序设计(系统调用)掌握:C/C++编辑器GCC掌握:GNUmake和makefile的编写规则了解

:C/C++调试器GDB了解:常用系统调用及库函数的使用方法了解:常用函数库glib的使用了解:程序管理软件SCCS\CVS6.1程序设计环境理想的程序设计环境单任务环境->单用户、单进程多任务环境下的程序设计用户程序不能直接控制系统的硬件设备用户程序通过操作系统来控制系统的资源存储中存在:用户程序空间和系统空间程序程序程序系统核心空间(内核)6.2基于操作系统支持的程序设计建立系统编程的思想站在资源管理者的角度来分析问题,充分考虑系统为用户程序提供哪些服务和资源,以实现对系统资源的有效利用——嵌入式系统系统调用用户程序通过系统调用实现对系统内核功能的使用及对各种硬件资源的访问了解:系统调用的使用方法输入、输出控制类进程、线程管理类:创建、终止、同步、互斥等内存及辅存管理类6.2基于操作系统支持的程序设计设备控制类本地进程通信管理类网络进程通信管理类系统调用与库函数的关系系统调用是操作系统层面提供的服务,库函数是高级语言提供的服务用户程序库函数用户程序系统调用6.3在UNIX中完成C程序开发编程语言低级语言机器语言:能够由机器直接执行。汇编语言:包含一些助记符,需要由汇编程序将其翻译成机器语言。高级语言:需要由编译程序和解释语言将其翻译成机器语言COBOL、BASIC、C/C++、PASCAL、FORTRAN、JAVA6.3在UNIX中完成C程序开发建立可执行程序的步骤建立源文件建立目标文件建立可执行文件源代码目标代码:由编译程序和解释程序把源代码翻译成机器能够理解的语言。目标代码不是可执行文件,它还缺少库文件。可执行代码可能包含其它程序代码,由链接程序将目标代码和其它程序代码链接在一起,形成完整的可执行程序库文件指的是为用户程序和操作系统之间提供接口的程序6.3在UNIX中完成C程序开发区别编译程序和解释程序编译程序:把高级语言翻译成机器语言。它一次编译所有的程序代码,在编译完成之前没有任何结果反馈;解释程序:把高级语言翻译成机器语言。它一次翻译一行代码,并立即将执行结果反馈。编译程序产生更好且效率更高的目标代码;解释程序在每次执行时都会重新解释源代码,效率较低Linux中的C/C++编译程序是GCCLinux中的SHELL解释程序是BASH6.3.1GCC:C/C++编译器GCC(GNUCCompiler)是GNU推出的功能强大、性能优越的多平台编译器,gcc编译器能将C、C++语言源程序、汇编语言和目标程序编译、链接成可执行文件,以下是gcc支持编译的一些源文件的后缀及其解释(点击)使用gcc将C源代码文件生成可执行文件,需要经历4个相关的步骤:预处理,编译,汇编,链接预处理链接编译组译源程序(*.c)可执行文件预处理器编译器组译器链接器gcc支持编译的源文件后缀GCC的使用方法gcc的基本用法: gcc[选项][文件名列表]

gcc的选项说明:-c 只编译并生成目标文件(.o)-g 生成调试信息-ofile 指定生成的文件名这里的文件名列表指的是需要编译和链接的文件,例如C,C++源文件,目标文件,汇编程序代码等。gcc的选项非常多,可以使用mangcc来查看,我们经常使用的选项是-c-g-ogcc命令的常用选项几个简单的C程序实例hello.cgcc-ohellohello.c./hello计算阶乘的程序将多个源程序编译成一个可执行文件gcc-ofactorialfactorial_main.cfactorial.c./factorialn编译一个C++程序GCC编译器可通过后缀名判断c(.c)或c++程序(.C/.cpp),使用g++进行编译g++-ohello_Chello.cpp改正错误及重定向标准错误如果源程序有误,希望将错误信息重定向到某个文件,以便于逐一纠错,可使用如下语句gcchello_error.c-ohello_error2>error重定向标准错误1>file:标准输出设备的重定向2>file:标准错误输出的重定向[root@stu1no10]#caterrorhello_error.c:Infunction`main':hello_error.c:9:syntaxerrorbefore"printf"6.3.2GNUmake和makefile文件GNUmakemakefile基本结构makefile变量GNUmake的主要预定义变量隐含规则makefile范例运行makeGNUmake利用make工具来自动完成编译工作。这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不必要的重新编译。make工具通过一个称为makefile的文件来完成并自动维护编译工作。makefile需要按照某种语法进行编写,其中说明了如何编译各个源文件并链接生成可执行文件,并定义了源文件之间的依赖关系。当修改了其中某个源文件时,如果其他源文件依赖于该文件,则也要重新编译所有依赖该文件的源文件。GNUmake默认情况下,GNUmake工具在当前工作目录中按如下顺序搜索makefileGNUmakefilemakefileMakefile在UNIX系统中,习惯使用Makefile作为makefile文件。如果要使用其他文件作为makefile,则可利用类似下面的make命令选项指定makefile文件:make-fMakefile.debugmakefile的基本结构makefile中一般包含如下内容:需要由make工具创建的项目,通常是目标文件和可执行文件。通常使用“目标(target)”一词来表示要创建的项目。要创建的项目依赖于哪些文件;创建每个项目时需要运行的命令;

例子:假设你现在有一个C++源文件test.C,该源文件包含有自定义的头文件test.h,则目标文件test.o明确依赖于两个源文件:test.C和test.h。另外你可能只希望利用g++命令来生成test.o目标文件。这时就可以利用如下的makefile来定义test.o的创建规则

Makefile基本结构实例1演示:例1当test.C或test.h文件在编译之后又被修改,则make工具可自动重新编译test.o,如果在前后两次编译之间,test.C和test.h均没有被修改,而且test.o还存在的话,就没有必要重新编译。test.o:test.Ctest.h g++-c-gtest.C指定test.o为目标依赖文件指定了如何从目标所依赖的文件建立目标Makefile基本结构一个makefile文件中可定义多个目标,利用maketarget命令可指定要编译的目标,如果不指定目标,则使用第一个目标。通常,makefile中定义有clean目标,可用来清除编译过程中的中间文件,例如:clean: rm-f*.o运行makeclean时,将执行rm-f*.o命令,最终删除所有编译过程中产生的所有中间文件。makefile实例2Network:Subrs.onetwork.ogcc-oNetworkSubrs.onetwork.oSubrs.o:Subrs.cNetdefs.hgcc-cSetwork.o:network.cNetdefs.hgcc-cnetwork.cclean:rm-f*.o演示:例2Makefile变量GNU的make工具除提供有建立目标的基本功能之外,还有许多便于表达依赖性关系以及建立目标的命令的特色。其中之一就是变量或宏的定义能力。如果你要以相同的编译选项同时编译十几个C源文件,而为每个目标的编译指定冗长的编译选项的话,将是非常乏味的。但利用简单的变量定义,可避免这种乏味的工作#Definemacrosfornameofcompiler CC=gcc#DefineamacrofortheCCflags CFLAGS=-c-g#Aruleforbuildingaobjectfiletest.o:test.ctest.h $(CC)$(CFLAGS)test.c

GNUmake的主要预定义变量GNUmake有许多预定义的变量,这些变量具有特殊的含义,可在规则中使用。表1-5给出了一些主要的预定义变量,除这些变量外,GNUmake还将所有的环境变量作为自己的预定义变量。

GNUmake的主要预定义变量隐含规则(1)GNUmake包含有一些内置的或隐含的规则,这些规则定义了如何从不同的依赖文件建立特定类型的目标。GNUmake支持两种类型的隐含规则:后缀规则(SuffixRule):后缀规则是定义隐含规则的老风格方法。后缀规则定义了将一个具有某个后缀的文件(例如,.c文件)转换为具有另外一种后缀的文件(例如,.o文件)的方法。每个后缀规则以两个成对出现的后缀名定义,例如,将.c文件转换为.o文件的后缀规则可定义为: .c.o: $(CC)$(CFLAGS)$(CPPFLAGS)-c-o$@$<隐含规则(2)模式规则(patternrules):这种规则更加通用,因为可以利用模式规则定义更加复杂的依赖性规则。模式规则看起来非常类似于正则规则,但在目标名称的前面多了一个%号,同时可用来定义目标和依赖文件之间的关系,例如下面的模式规则定义了如何将任意一个x.c文件转换为x.o文件: %.c:%.o $(CC)$(CFLAGS)$(CPPFLAGS)-c-o$@$<make运行GNUmake命令还有一些其他选项makefile范例根据图示依赖关系编写一个makefile文件,依赖关系图如下:演示:例3make的实例ns.exe:link.onode.ons.o

gcc-ons.exelink.onode.ons.olink.o:link.clink.h.config.h gcc-clink.c node.o:ode.hconfig.h gcc-cnode.c ns.o:s.hconfig.h gcc-cns.c clean: rm-f*.o 使用automake和autoconf产生makefile在开始使用automake和autoconf之前,请先确认系统已经安装以下的软件:GNUautomakeGNUautoconfGNUm4PerlGNULibtool(如果你需要产生sharedlibrary)automake所产生的makefile除了可以做到程序的编译和链接,也已经把如何产生程序文件的操作,以及把安装程序都考虑进去了,所以源程序所存放的目录架构最好符合GNU的标准惯例,下面用hello.c来作为例子进行说明。使用automake和autoconf产生makefile在工作目录下建立一个新的子目录4,再在4下建立一个hello的子目录,这个目录将作为存放hello这个程序及其相关文件的地方:#include<stdio.h>intmain(intargc,char**argv){printf("Hello,GNU!\n");return0;}演示:例4使用automake和autoconf产生makefile具体步骤autoscan产生一个configure.in的模板,执行autoscan后会产生一个configure.scan的文件,可以用它做为configure.in文件的模板:编辑configure.scan文件,如下所示,并且把文件名改成configure.in执行aclocal和autoconf,分别会产生aclocal.m4及configure两个文件:编辑Makefile.am文件,内容如下:执行automake--add-missing,Automake会根据Makefile.am产生一些文件,包含最重要的Makefile.in:使用automake和autoconf产生makefile最后执行./configure:现在你的目录下已经产生了一个Makefile文件,执行make命令就可以开始编译hello.c成执行文件,最后执行./hello:#makegcc-DPACKAGE="hello"-DVERSION="1.0"-I.-I.-g-O2-chello.cgcc-g-O2-ohellohello.o#./helloHello!GNU!6.3.3GDB:Linux调试工具Linux系统中包含了GNU调试程序gdb,它是一个用来调试C和C++程序的调试器。可以使程序开发者在程序运行时观察程序的内部结构和内存的使用情况。gdb所提供的一些功能如下所示:运行程序,设置所有的能影响程序运行的参数和环境;控制程序在指定的条件下停止运行;当程序停止时,可以检查程序的状态;修改程序的错误,并重新运行程序;动态监视程序中变量的值;可以单步执行代码,观察程序的运行状态。

GDB调试说明gdb程序调试的对象是可执行文件,而不是程序的源代码文件。如果要让产生的可执行文件可以用来调试,需在执行gcc指令编译程序时,加上-g参数,指定程序在编译时包含调试信息。调试信息包含程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb利用这些信息使源代码和机器码相关联。可在makefile中如下定义CFLAGS变量:CFLAGS=-g[root@stu1no10]#

gcc-ghello_error.c-ohello_error[root@stu1no10]#gdbGDB的帮助在gdb提示符处键入help,将列出命令的分类,键入help后跟命令的分类名,可获得该类命令的详细清单。如果想要了解某个具体命令(比如break)的帮助信息,在gdb提示符下输入下面的命令:helpbreak break的作用是设置断点aliases:命令别名breakpoints:断点定义data:数据查看iles:指定并查看文件internals:维护命令running:程序执行stack:调用栈查看statu:状态查看tracepoints:跟踪程序执行。另一个获得gdb帮助的方法是浏览gdb的手册页。#mangdbGDB的常用命令gdb的基本命令 gdbfilename其中filename是要调试的可执行文件。用这种方式运行gdb可以直接指定想要调试的程序。这和启动gdb后执行filefilename命令效果完全一样。gdb支持很多的命令且能实现不同的功能。这些命令从简单的文件装入到允许你检查所调用的堆栈内容的复杂命令,下面列出了在使用gdb调试时会用到的一些命令。file命令:装入想要调试的可执行文件cd命令:改变工作目录gdb常用命令pwd命令:打印当前工作日录。run命令:执行当前被调试的程序。list命令:列出正在调试的应用程序的源代码。break命令:设置断点。kill命令:停止正在调试的应用程序。tbreak命令;设置临时断点。它的语法与break相同。区别在于用tbreak设置的断点执行一次之后立即消失。watch命令:设置监视点,监视表达式的变化。continue命令:继续正在执行调试的程序。该命令用在程序由于处理信号或断点而导致停止运行的情况。gdb常用命令awatch命令:设置读写监视点。当要监视的表达式被读或写时将应用程序挂起。它的语法与watch命令相同。rwatch命令:设置读监视点,当监视表达式被读时将程序挂起,等侍调试。此命令的语法与watch相同。next命令:执行下一条源代码,但是不进入函数内部。也就是说,将一条函数调用作为一条语句执行。执行这个命令的前提是已经run,开始了代码的执行。gdb常用命令step命令:执行下一条源代码,进入函数内部。如果调用了某个函数,会跳到函数所在的代码中等候一步步执行。执行这个命令的前提是已经用run开始执行代码。display命令:在应用程序每次停止运行时显示表达式的值。infobreak命令:显示当前断点列表,包括每个断点到达的次数infofiles命令:显示调试文件的信息。infofunc命令:显示所有的函数名。gdb常用命令infolocal命令:显示当前函数的所有局部变量的信息。infoprog命令:显示调试程序的执行状态。print命令;显示表达式的值。delete命令:删除断点。指定一个断点号码,则删除指定断点。不指定参数则删除所有的断点。Shell命令:执行LinuxShell命令。make命令:不退出gdb而重新编译生成可执行文件。quit命令:退出gdb。GDB的简单实例#include<stdio.h>staticcharbuff[256];staticchar*string;intmain(){printf("pleaseinputastring:\n");gets(string);printf("yourstringis:%s\n",string);}上面程序的目的是接受用户的

温馨提示

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

评论

0/150

提交评论