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

下载本文档

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

文档简介

1、v理解:程序设计环境(用户空间和系统空间)理解:程序设计环境(用户空间和系统空间)v理解:基于操作系统的程序设计(系统调用)理解:基于操作系统的程序设计(系统调用)v掌握:掌握: C/C+编辑器编辑器 GCCv掌握:掌握: GNU make和和makefile的编写规则的编写规则v了解了解 :C/C+调试器调试器 GDBv了解:常用系统调用及库函数的使用方法了解:常用系统调用及库函数的使用方法v了解:常用函数库了解:常用函数库glib的使用的使用v了解:程序管理软件了解:程序管理软件SCCSCVSv理想的程序设计环境理想的程序设计环境 单任务环境单任务环境-单用户、单进程单用户、单进程v多任务

2、环境下的程序设计多任务环境下的程序设计 用户程序不能直接控制系统的硬件设备用户程序不能直接控制系统的硬件设备 用户程序通过操作系统来控制系统的资源用户程序通过操作系统来控制系统的资源 存储中存在:用户程序空间和系统空间存储中存在:用户程序空间和系统空间程序程序程序程序程序程序系统核心空间(内核)系统核心空间(内核)v建立系统编程的思想建立系统编程的思想 站在资源管理者的角度来分析问题,充分考虑系站在资源管理者的角度来分析问题,充分考虑系统为用户程序提供哪些服务和资源,以实现对系统为用户程序提供哪些服务和资源,以实现对系统资源的有效利用统资源的有效利用嵌入式系统嵌入式系统v系统调用系统调用 用户

3、程序通过系统调用实现对系统内核功能的使用户程序通过系统调用实现对系统内核功能的使用及对各种硬件资源的访问用及对各种硬件资源的访问 了解:系统调用的使用方法了解:系统调用的使用方法 输入、输出控制类输入、输出控制类 进程、线程管理类:创建、终止、同步、互斥等进程、线程管理类:创建、终止、同步、互斥等 内存及辅存管理类内存及辅存管理类 设备控制类设备控制类 本地进程通信管理类本地进程通信管理类 网络进程通信管理类网络进程通信管理类v系统调用与库函数的关系系统调用与库函数的关系 系统调用是操作系统系统调用是操作系统层面提供的服务,库层面提供的服务,库函数是高级语言提供函数是高级语言提供的服务的服务用

4、户程序用户程序库函数库函数用户程序用户程序系统调用系统调用v编程语言编程语言 低级语言低级语言 机器语言机器语言: 能够由机器直接执行。能够由机器直接执行。 汇编语言汇编语言: 包含一些助记符,需要由汇编程序包含一些助记符,需要由汇编程序将其翻译成机器语言。将其翻译成机器语言。 高级语言:需要由编译程序和解释语言将其翻译高级语言:需要由编译程序和解释语言将其翻译成机器语言成机器语言 COBOL、BASIC、C/C+、PASCAL、FORTRAN、JAVAv建立可执行程序的步骤建立可执行程序的步骤 建立源文件建立源文件 建立目标文件建立目标文件 建立可执行文件建立可执行文件v源代码源代码v目标代

5、码:由目标代码:由和和把源代码翻译成把源代码翻译成机器能够理解的语言。目标代码不是可执行文件,机器能够理解的语言。目标代码不是可执行文件,它还缺少它还缺少。v可执行代码可能包含其它程序代码,由可执行代码可能包含其它程序代码,由将将目标代码和其它程序代码链接在一起,形成完整的目标代码和其它程序代码链接在一起,形成完整的可执行程序可执行程序库文件指的是为用户程库文件指的是为用户程序和操作系统之间提供序和操作系统之间提供接口的程序接口的程序v区别编译程序和解释程序区别编译程序和解释程序v编译程序:把高级语言翻译成机器语言。它一次编编译程序:把高级语言翻译成机器语言。它一次编译所有的程序代码,在编译完

6、成之前没有任何结果译所有的程序代码,在编译完成之前没有任何结果反馈;反馈;v解释程序:把高级语言翻译成机器语言。它一次翻解释程序:把高级语言翻译成机器语言。它一次翻译一行代码,并立即将执行结果反馈。译一行代码,并立即将执行结果反馈。 编译程序产生更好且效率更高的目标代码;编译程序产生更好且效率更高的目标代码; 解释程序在每次执行时都会重新解释源代码,解释程序在每次执行时都会重新解释源代码,效率较低效率较低Linux中的中的C/C+编译程序是编译程序是GCCLinux中的中的SHELL解释程序是解释程序是BASHvGCC(GNU C Compiler)是是GNU推出的功能强大、推出的功能强大、性

7、能优越的多平台编译器,性能优越的多平台编译器,gcc编译器能将编译器能将C、C+语言源程序、汇编语言和目标程序编译、链接成可语言源程序、汇编语言和目标程序编译、链接成可执行文件,以下是执行文件,以下是gcc支持编译的一些源文件的后支持编译的一些源文件的后缀及其解释(缀及其解释(点击点击) 使用使用gcc将将C源代码文件生成可执行文件,需要经源代码文件生成可执行文件,需要经历历4个相关的步骤:预处理,编译,汇编,链接个相关的步骤:预处理,编译,汇编,链接预处理预处理链链接接编编译译组组译译源 程 序源 程 序(*.c)可执行文件可执行文件预处理器预处理器编译器编译器组译器组译器链接器链接器vgc

8、c的基本用法:的基本用法:gcc 选项选项 文件名列表文件名列表vgcc的选项说明:的选项说明:- c只编译并生成目标文件只编译并生成目标文件(.o)- g生成调试信息生成调试信息- o file 指定生成的文件名指定生成的文件名这里的文件名列表指的是需要这里的文件名列表指的是需要编译和链接编译和链接的文件,例的文件,例如如C, C+源文件,目标文件,汇编程序代码等。源文件,目标文件,汇编程序代码等。gcc的选项非常多,可以使用的选项非常多,可以使用man gcc来查看,我们经常来查看,我们经常使用的选项是使用的选项是 -c -g -ovhello.c gcc -o hello hello.c

9、/. hellov计算阶乘的程序计算阶乘的程序 将多个源程序编译成一个可执行文件将多个源程序编译成一个可执行文件 gcc -o factorial factorial_main.c factorial.c /. factorial nv编译一个编译一个C+程序程序 GCC编译器可通过后缀名判断编译器可通过后缀名判断c(.c)或或c+程序程序(.C/.cpp),使用,使用g+进行编译进行编译 g+ -o hello_C hello.cppv如果源程序有误,希望将错误信息重定向到某个文如果源程序有误,希望将错误信息重定向到某个文件,以便于逐一纠错,可使用如下语句件,以便于逐一纠错,可使用如下语句

10、gcc hello_error.c -o hello_error 2errorv重定向标准错误重定向标准错误 1 file: 标准输出设备的重定向标准输出设备的重定向 2 file: 标准错误输出的重定向标准错误输出的重定向rootstu1 no10# cat errorhello_error.c: In function main:hello_error.c:9: syntax error before printfvGNU make vmakefile 基本结构基本结构 vmakefile 变量变量 vGNU make 的主要预定义变量的主要预定义变量 v隐含规则隐含规则 vmakefil

11、e 范例范例 v运行运行 makev利用利用 make 工具来自动完成编译工作。这些工作包工具来自动完成编译工作。这些工作包括:括:如果仅修改了某几个源文件,则只重新编译这如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件译所有包含该头文件的源文件。利用这种自动编译。利用这种自动编译可大大简化开发工作,避免不必要的重新编译。可大大简化开发工作,避免不必要的重新编译。vmake 工具通过一个称为工具通过一个称为 makefile 的文件来完成并的文件来完成并自动维护编译工作。自动维护编译工作。

12、makefile 需要按照某种语法进需要按照某种语法进行编写,其中说明了行编写,其中说明了,并,并。 当修改了其中某个源文件时,如果其他源文件依赖当修改了其中某个源文件时,如果其他源文件依赖于该文件,则也要重新编译所有依赖该文件的源文于该文件,则也要重新编译所有依赖该文件的源文件。件。v默认情况下,默认情况下,GNU make 工具在当前工作目录中按工具在当前工作目录中按如下顺序搜索如下顺序搜索 makefile GNU makefile makefile Makefile 在在 UNIX 系统中,习惯使用系统中,习惯使用 Makefile作为作为 makefile文件。如果要使用其他文件作为

13、文件。如果要使用其他文件作为 makefile,则可利用类似下面的,则可利用类似下面的 make 命令选项命令选项指定指定 makefile 文件:文件: vmakefile 中一般包含如下内容:中一般包含如下内容: 需要由需要由 make工具创建的项目,通常是工具创建的项目,通常是和和。通常使用。通常使用“目标(目标(target)”一一词来表示要创建的项目。词来表示要创建的项目。 要创建的项目依赖于哪些文件;要创建的项目依赖于哪些文件; 创建每个项目时需要运行的命令;创建每个项目时需要运行的命令;例子:假设你现在有一个例子:假设你现在有一个 C+ 源文件源文件 test.C,该源文件,该源

14、文件包含有自定义的头文件包含有自定义的头文件 test.h,则目标文件,则目标文件 test.o 明确依明确依赖于两个源文件:赖于两个源文件:test.C 和和 test.h。另外你可能只希望利。另外你可能只希望利用用 g+ 命令来生成命令来生成 test.o 目标文件。目标文件。 这时就可以利用如这时就可以利用如下的下的 makefile 来定义来定义 test.o 的创建规则的创建规则 v 实例实例1演示:例演示:例1当当 test.C 或或 test.h 文件在编译之后又被修改,则文件在编译之后又被修改,则 make 工具可自动重新编译工具可自动重新编译 test.o,如果在前后两,如果

15、在前后两次编译之间,次编译之间,test.C 和和 test.h 均没有被修改,而且均没有被修改,而且 test.o 还存在的话,就没有必要重新编译。还存在的话,就没有必要重新编译。test.o: test.C test.h g+ -c -g test.C指定指定 test.o 为目标为目标依赖文件依赖文件指定了如何从目标所依赖的文件建立目标指定了如何从目标所依赖的文件建立目标一个一个 makefile 文件中可定义多个目标,利用文件中可定义多个目标,利用 make target 命令可指定要编译的目标,如果不指定目标,命令可指定要编译的目标,如果不指定目标, 则则使用第一个目标。通常,使用第

16、一个目标。通常,makefile 中定义有中定义有 clean 目标,目标,可用来清除编译过程中的中间文件,例如:可用来清除编译过程中的中间文件,例如: clean: rm -f *.o 运行运行 make clean 时,将执行时,将执行 rm -f *.o 命令,最终删命令,最终删除所有编译过程中产生的所有中间文件。除所有编译过程中产生的所有中间文件。Network: Subrs.o network.o gcc -o Network Subrs.o network.oSubrs.o: Subrs.c Netdefs.h gcc -c Setwork.o: network.c Netdefs

17、.h gcc -c network.cclean: rm -f *.o演示:例演示:例2vGNU 的的 make 工具除提供有建立目标的基本功能之工具除提供有建立目标的基本功能之外,还有许多便于表达依赖性关系以及建立目标的外,还有许多便于表达依赖性关系以及建立目标的命令的特色。其中之一就是命令的特色。其中之一就是。如果你要以相同的编译选项同时编译十几个如果你要以相同的编译选项同时编译十几个 C 源文源文件,而为件,而为,将是非常乏味的。但利用简单的变量定义,可避免将是非常乏味的。但利用简单的变量定义,可避免这种乏味的工作这种乏味的工作# Define macros for name of co

18、mpiler CC = gcc # Define a macro for the CC flags CFLAGS = -c -g # A rule for building a object file test.o: test.c test.h $(CC) $(CFLAGS) test.c v GNU make 有许多预定义的变量,这些变量具有特殊的含义,可在规则中使用。表 1-5 给出了一些主要的 预定义变量,除这些变量外,GNU make 还将所有的环境变量作为自己的预定义变量。 vGNU make包含有一些包含有一些内置的或隐含的规则内置的或隐含的规则,这些,这些规则定义了如何规则定义了

19、如何从不同的依赖文件建立特定类型的从不同的依赖文件建立特定类型的目标目标。 GNU make 支持两种类型的隐含规则:支持两种类型的隐含规则: 后缀规则(后缀规则(Suffix Rule):后缀规则是定义隐含):后缀规则是定义隐含规则的老风格方法。后缀规则定义了将一个具有规则的老风格方法。后缀规则定义了将一个具有某个后缀的文件某个后缀的文件(例如,例如,.c 文件文件)转换为具有另外转换为具有另外一种后缀的文件一种后缀的文件(例如,例如,.o 文件文件)的方法。每个后的方法。每个后缀规则以两个成对出现的后缀名定义,例如,缀规则以两个成对出现的后缀名定义,例如,将将 .c 文件转换为文件转换为

20、.o 文件的后缀规则可定义为:文件的后缀规则可定义为: .c .o: $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $ $ 模式规则(模式规则(pattern rules):这种规则更加通用,):这种规则更加通用,因为可以利用模式规则定义更加复杂的依赖性规因为可以利用模式规则定义更加复杂的依赖性规则。则。 模式规则看起来非常类似于正则规则,但模式规则看起来非常类似于正则规则,但在目标名称的前面多了一个在目标名称的前面多了一个 % 号,同时可用来号,同时可用来定义目标和依赖定义目标和依赖 文件之间的关系,例如下面的文件之间的关系,例如下面的模式规则定义了如何将任意一个模式规

21、则定义了如何将任意一个 x.c 文件转换为文件转换为 x.o 文件:文件: %.c:%.o $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $ $ vGNU make 命令还有一些其他选项命令还有一些其他选项v根据图示依赖关系编写一个根据图示依赖关系编写一个makefile文件,依赖关文件,依赖关系图如下:系图如下:演示:例演示:例3ns.exe: link.o node.o ns.ogcc -o ns.exe link.o node.o ns.olink.o: link.c link.h.config.hgcc -c ode.o: node.c node.h config

22、.hgcc -c s.o: ns.c ns.h config.hgcc -c ns.cclean:rm -f *.ov在开始使用在开始使用automake和和autoconf之前,请先确认系之前,请先确认系统已经安装以下的软件:统已经安装以下的软件: GNU automake GNU autoconf GNU m4 Perl GNU Libtool (如果你需要产生如果你需要产生shared library)automake 所产生的所产生的 makefile 除了可以做到程序的编译和除了可以做到程序的编译和链接,也已经把如何产生程序文件的操作,以及把安装程序链接,也已经把如何产生程序文件的操

23、作,以及把安装程序都考虑进去了,所以源程序所存放的目录架构最好符合都考虑进去了,所以源程序所存放的目录架构最好符合GNU的标准惯例,下面用的标准惯例,下面用hello.c来作为例子进行说明。来作为例子进行说明。v在工作目录下建立一个新的子目录在工作目录下建立一个新的子目录4,再在,再在4下建立下建立一个一个hello的子目录,这个目录将作为存放的子目录,这个目录将作为存放 hello 这这个程序及其相关文件的地方:个程序及其相关文件的地方:#include int main(int argc, char* argv) printf(Hello, GNU!n); return 0;演示:例演示:

24、例4v具体步骤具体步骤 autoscan 产生一个产生一个configure.in的模板,执行的模板,执行 autoscan 后会产生一个后会产生一个configure.scan 的文件,的文件,可以用它做为可以用它做为configure.in文件的模板:文件的模板: 编辑编辑configure.scan文件,如下所示,并且把文件文件,如下所示,并且把文件名改成名改成configure.in 执行执行aclocal和和autoconf,分别会产生,分别会产生 aclocal.m4 及及 configure 两个文件:两个文件: 编辑编辑Makefile.am文件,内容如下:文件,内容如下: 执

25、行执行automake -add-missing,Automake 会根据会根据 Makefile.am产生一些文件,包含最重要的产生一些文件,包含最重要的Makefile.in: 最后执行最后执行 ./configure :v现在你的目录下已经产生了一个现在你的目录下已经产生了一个Makefile文件,执文件,执行行make命令就可以开始编译命令就可以开始编译hello.c 成执行文件,成执行文件,最后执行最后执行./hello:# makegcc -DPACKAGE=hello -DVERSION=1.0 -I. -I. -g -O2 -c hello.cgcc -g -O2 -o hel

26、lo hello.o# ./helloHello! GNU!vLinux系统中包含了系统中包含了GNU 调试程序调试程序gdb,它是一个,它是一个用来调试用来调试C和和 C+ 程序的调试器。可以使程序开发程序的调试器。可以使程序开发者在程序运行时观察程序的内部结构和内存的使用者在程序运行时观察程序的内部结构和内存的使用情况。情况。gdb所提供的一些功能如下所示:所提供的一些功能如下所示: 运行程序,设置所有的能影响程序运行的参数和运行程序,设置所有的能影响程序运行的参数和环境;环境; 控制程序在指定的条件下停止运行;控制程序在指定的条件下停止运行; 当程序停止时,可以检查程序的状态;当程序停止

27、时,可以检查程序的状态; 修改程序的错误,并重新运行程序;修改程序的错误,并重新运行程序; 动态监视程序中变量的值;动态监视程序中变量的值; 可以单步执行代码,观察程序的运行状态。可以单步执行代码,观察程序的运行状态。 vgdb程序调试的对象是可执行文件,而不是程序的程序调试的对象是可执行文件,而不是程序的源代码文件。源代码文件。 如果要让产生的可执行文件可以用来调试,需如果要让产生的可执行文件可以用来调试,需在执行在执行gcc指令编译程序时,指令编译程序时,指定,指定程序在编译时包含调试信息。程序在编译时包含调试信息。 调试信息包含程序里的每个变量的类型和在可调试信息包含程序里的每个变量的类

28、型和在可执行文件里的地址映射以及源代码的行号。执行文件里的地址映射以及源代码的行号。gdb 利用这些信息使源代码和机器码相关联。利用这些信息使源代码和机器码相关联。可在可在 makefile 中如下定义中如下定义 CFLAGS 变量:变量: CFLAGS = -g rootstu1 no10# gcc -g hello_error.c -o hello_error rootstu1 no10# gdbv在在 gdb 提示符处键入提示符处键入help,将列出命令的,将列出命令的分类,键入分类,键入 help 后跟后跟命令的分类名,可获命令的分类名,可获得该类命令的详细清得该类命令的详细清单。单。

29、 v如果想要了解某个具如果想要了解某个具体命令体命令(比如比如break)的的帮助信息,在帮助信息,在gdb提提 示符下输入下面的命示符下输入下面的命令:令:help breakbreak的作用是设置断的作用是设置断点点aliases:命令别名:命令别名breakpoints:断点定义:断点定义data:数据查看:数据查看iles:指定并查看文件:指定并查看文件internals:维护命令:维护命令running:程序执行:程序执行stack:调用栈查看:调用栈查看statu:状态查看:状态查看tracepoints:跟踪程序执行。:跟踪程序执行。另一个获得另一个获得gdb帮助的方法是浏帮助的

30、方法是浏览览gdb的手册页。的手册页。# man gdbvgdb的基本命令的基本命令gdb filename 其中其中filename是要调试的可执行文件。用这种方是要调试的可执行文件。用这种方式运行式运行gdb可以直接指定想要调试的程序。这和可以直接指定想要调试的程序。这和启动启动gdb后执行后执行file filename命令效果完全一样。命令效果完全一样。vgdb支持很多的命令且能实现不同的功能。这些命支持很多的命令且能实现不同的功能。这些命令从简单的令从简单的到到的复杂命令,下面列出了在使用的复杂命令,下面列出了在使用gdb 调试时会用调试时会用到的一些命令。到的一些命令。 file命

31、令命令:装入想要调试的可执行文件:装入想要调试的可执行文件 cd命令:改变工作目录命令:改变工作目录 pwd命令:打印当前工作日录。命令:打印当前工作日录。 run命令命令:执行当前被调试的程序。:执行当前被调试的程序。 list命令命令:列出正在调试的应用程序的源代码。:列出正在调试的应用程序的源代码。 break命令命令:设置断点。:设置断点。 kill命令命令:停止正在调试的应用程序。:停止正在调试的应用程序。 tbreak命令;设置临时断点。它的语法与命令;设置临时断点。它的语法与break相相同。区别在于用同。区别在于用tbreak设置的断点执行一次之后设置的断点执行一次之后立即消失

32、。立即消失。 watch命令:设置监视点,监视表达式的变化。命令:设置监视点,监视表达式的变化。 continue命令命令: 继续正在执行调试的程序。该命继续正在执行调试的程序。该命令用在程序由于处理信号或断点而导致停止运行令用在程序由于处理信号或断点而导致停止运行的情况。的情况。 awatch命令:设置读写监视点。当要监视的表达命令:设置读写监视点。当要监视的表达式被读或写时将应用程序挂起。它的语法与式被读或写时将应用程序挂起。它的语法与watch命令相同。命令相同。 rwatch命令:设置读监视点,当监视表达式被读命令:设置读监视点,当监视表达式被读时将程序挂起,等侍调试。此命令的语法与时

33、将程序挂起,等侍调试。此命令的语法与watch相同。相同。 next命令命令:执行下一条源代码,但是不进入函数:执行下一条源代码,但是不进入函数内部。也就是说,将一条函数调用作为一条语句内部。也就是说,将一条函数调用作为一条语句执行。执行这个命令的前提是已经执行。执行这个命令的前提是已经run,开始了,开始了代码的执行。代码的执行。 step命令命令:执行下一条源代码,进入函数内部。如:执行下一条源代码,进入函数内部。如果调用了某个函数,会跳到函数所在的代码中等候果调用了某个函数,会跳到函数所在的代码中等候一步步执行。执行这个命令的前提是已经用一步步执行。执行这个命令的前提是已经用run开开始

34、执行代码。始执行代码。 display命令命令:在应用程序每次停止运行时显示表达:在应用程序每次停止运行时显示表达式的值。式的值。 info break命令命令:显示当前断点列表,包括每个断:显示当前断点列表,包括每个断点到达的次数点到达的次数 info files命令命令:显示调试文件的信息。:显示调试文件的信息。 info func命令命令:显示所有的函数名。:显示所有的函数名。 info local命令命令:显示当前函数的所有局部变量的:显示当前函数的所有局部变量的信息。信息。 info prog命令命令:显示调试程序的执行状态。:显示调试程序的执行状态。 print命令命令;显示表达式

35、的值。;显示表达式的值。 delete命令命令:删除断点。指定一个断点号码,则:删除断点。指定一个断点号码,则删除指定断点。不指定参数则删除所有的断点。删除指定断点。不指定参数则删除所有的断点。 Shell命令:执行命令:执行Linux Shell命令。命令。 make命令命令:不退出:不退出gdb而重新编译生成可执行文而重新编译生成可执行文件。件。 quit命令命令:退出:退出gdb。#include static char buff256;static char *string;int main() printf(please input a string:n); gets(string); printf(your

温馨提示

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

评论

0/150

提交评论