Linux 环境下的C语言编程ppt课件.ppt
《Linux 环境下的C语言编程ppt课件.ppt》由会员分享,可在线阅读,更多相关《Linux 环境下的C语言编程ppt课件.ppt(103页珍藏版)》请在三一办公上搜索。
1、Linux 环境下的 C语言编程,第一部分: Linux下的C编程实战之开发平台搭建,准备工作,建议在PC内存足够大的情况下,不要直接安装Linux操作系统,最好把它安装在运行VMWare虚拟机软件的Windows平台上,如下图:,1. Vim和Emacs编辑器,在Linux平台下,可用任意一个文本编辑工具编辑源代码。Vim(vi improve)是Linux下功能强大的编辑器,是由UNIX系统下的传统文本编辑器vi发展而来,是vi的一个增强版本,有彩色和高亮等特性,对编程有很大帮助。主菜单-编程-vi Improved命令来运行x-windows下的vim。Emacs即Editor MACr
2、oS(编辑器宏)的缩写,是一种强大的文本编辑器,在程序员和其他以技术工作为主的计算机用户中广受欢迎。,使用vim编辑helloworld程序,使用emacs编辑helloworld程序,2.GCC编译器,GCC是Linux平台下最重要的开发工具,它是GNU的C和C+编译器,其基本用法为:gcc options filenames 该命令按编译选项(参数options)指定的操作对给定的文件进行编译处理。编译一输出“Hello World”的程序: main() printf(Hello Worldn);,2.GCC编译器,最简单的编译方法是不指定任何编译选项,它会为目标程序生成默认的文件名 a
3、.outgcc helloworld.co选项:编译来为将产生的可执行文件指定一个文件名。例如,将上述名为helloworld.c的C程序编译为名叫helloworld的可执行文件,输入如下命令:gcc -o helloworld helloworld.c,2.GCC编译器-常用选项,c选项:告诉GCC仅把源代码(.c文件)编译为目标代码(.o文件)而跳过汇编和连接的步骤;它能使编译多个C程序时的速度更快且容易管理。例如用户将已编辑好的test.c文件编译成名为test.o的目标文件。可以使用命令 gcc -c test.cs选项:告诉GCC 在为 C代码产生了汇编语言文件后停止编译。GCC
4、产生的汇编语言文件的缺省扩展名是.s。将生成helloworld.c的汇编代码,使用的是AT&T汇编。用emacs打开汇编代码如下图。,用emacs打开的Hello.c的汇编代码,2.GCC编译器-常用选项,E选项:指示编译器仅对输入文件进行预处理,但不汇编和连接O(-O1)选项:告诉GCC对源代码进行基本优化从而使得程序执行地更快;而-O2选项告诉GCC产生尽可能小和尽可能快的代码。使用-O2选项编译的速度比使用-O时慢,但产生的代码执行速度会更快。Wall 选项:显示附加的警告信息。例如在上述程序中去掉 return 0;语句,之后重新编译 gcc Wall o hello hello.c
5、将得到的警告信息:hello.c : 5:warning:control reaches end of non-void function,3. GDB 调试器,GCC用于编译程序,而Linux的另一个GNU工具gdb则用于调试程序。gdb是一个用来调试C和C+程序的强力调试器,通过它进行一系列调试工作。gdb主要提供一下功能:监视程序中变量的值得变化设置断点,使程序在指定的代码上暂停执行,便于观察单步执行代码分析崩溃程序产生的core文件,3. GDB 调试器,gdb最常用的命令如下file:装入想要调试的可执行文件。kill:终止正在调试的程序。 list:列表显示源代码。 next:执行
6、一行源代码但不进入函数内部。 step:执行一行源代码而且进入函数内部。 run:执行当前被调试的程序 quit:终止gdbwatch:监视一个变量的值 break:在代码里设置断点,程序执行到这里时挂起,3. GDB 调试器,举例说明怎样用GDB调试一个求0+1+2+3+99的程序:/* Filename:sum.c */main() int i, sum; sum = 0; for (i = 0; i 100; i+) sum + = i; printf(the sum of 1+2+.+ is %d, sum);,3. GDB 调试器,3. GDB 调试器,执行如下命令编译sum.c(加
7、-g选项产生debug信息): gcc g o sum sum.c在命令行上键入gdb sum并按回车键就可以开始调试sum了,再运行run命令执行sum,屏幕上将看到如下内容:,3. GDB 调试器,list命令:list命令用于列出源代码,对上述程序运行list,将出现如下画面(源代码被标行号):,3. GDB 调试器,根据列出的源程序,如果将断点设置在第4行,只需在gdb 命令行提示符下键入如下命令设置断点:(gdb)break 4Breakpoint 1 at 0 x8048338:file sum.c line 4这时再run,程序会停止在第4行:Starting program:/
8、root/sumBreakpoint 1,main() at sum.c line 44 sum=0,3. GDB 调试器,设置断点的另一种语法是 break ,它在进入指定函数(function)时停住。相反的,clear用于清除所有的已定义的断点clear 清除设置在函数上的断点;clear 则清除设置在指定行上的断点。,3. GDB 调试器,watch命令:用于观查变量或表达式的值watch命令观查sum变量只需要运行:watch sumwatch命令观查表达式:watch 为表达式(变量)expr设置一个观察点,变量表达式值有变化时,程序会停止执行。要观查当前设置的watch,可以使用
9、info watchpoints命令。,3. GDB 调试器,next、step命令:next、step用于单步执行,在执行的过程中,被watch变量的变化情况将实时呈现(分别显示Old value和New value),如下图:next、step命令的区别在于step遇到函数调用,会跳转到该函数定义的开始行去执行,而next则不进入到函数内部,它把函数调用语句当作一条普通语句执行。,4.Make,编译和连接的区别编译器使用源码文件来产生某种形式的目标文件,在编译过程中,外部的符号参考并没有被解释或替换(即外部全局变量和函数并没有被找到)。因此,在编译阶段所报的错误一般都是语法错误。连接器则用
10、于连接目标文件和程序包,生成一个可执行程序。在连接阶段,一个目标文件中对别的文件中的符号的参考被解释,如果有符号不能找到,会报告连接错误。,4.Make,编译和连接的一般步骤是:第一阶段把源文件一个一个的编译成目标文件,第二阶段把所有的目标文件加上需要的程序包连接成一个可执行文件。这样的过程需要使用大量的gcc命令。而make则使从大量源文件的编译和连接工作中解放出来,综合为一步完成。,4.Make,GNU Make的主要工作是读进一个文本文件,称为makefile。makefile文件记录了哪些文件(目的文件,目的文件不一定是最后的可执行程序,它可以是任何一种文件)由哪些文件(依靠文件)产生
11、,用什么命令来产生。Make依靠此makefile中的信息检查磁盘上的文件,如果目的文件的创建或修改时间比它的一个依靠文件旧的话,make就执行相应的命令,以便更新目的文件。,4.Make,makefile文件的编写makefile文件是一个文本文件,用于描述整个项目和各个文件之间的依赖关系。它由多个规则组成。makefile文件的规则遵循以下结构#remark 注释行target:file1 file2 二进制文件或者目标文件command1 命令command2,4.Make,例如: 下面三个文件,add.h用于声明add函数,add.c提供两个整数相加的函数体,而main.c中调用add
12、函数: /* filename:add.h */extern int add(int i, int j);/* filename:add.c */int add(int i, int j) return i + j;,/* filename:main.c */#include add.hmain() int a, b; a = 2; b = 3; printf(the sum of a+b is %d, add(a + b);,怎样为上述三个文件产生makefile呢?,4.Make,为上述三个文件产生makefile的方法如下: test : main.o add.o gcc main.o
13、add.o -o test main.o : main.c add.h gcc -c main.c -o main.o add.o : add.c add.h gcc -c add.c -o add.o,4.Make,上述makefile文件的含义利用add.c和add.h文件执行gcc -c add.c -o add.o命令产生add.o目标代码。利用main.c和add.h文件执行gcc -c main.c -o main.o命令产生main.o目标代码。最后利用main.o和add.o文件(两个模块的目标代码)执行gcc main.o add.o -o test命令产生可执行文件test
14、。可以使用gcc -MM main.c自动寻找源文件中的头文件,并形成依赖关系。输出为:main.o main.c add.h,4.Make,可在makefile中加入变量。另外,环境变量在make过程中也被解释成make的变量。这些变量是大小写敏感的,一般使用大写字母。要定义一个变量,只需要在一行的开始写下这个变量的名字,后面跟一个=号,再跟变量的值。引用变量的方法是写一个$符号,后面跟(变量名)。,4.Make,把前面的 makefile 利用变量重写一遍(并假设使用-Wall -O g编译选项):OBJS = main.o add.oCC = gccCFLAGS = -Wall -O -
15、gtest : $(OBJS)$(CC) $(OBJS) -o testmain.o : main.c add.h$(CC) $(CFLAGS) -c main.c -o main.oadd.o : add.c add.h$(CC) $(CFLAGS) -c add.c -o add.o,4.Make,makefile 中还可定义清除(clean)目标,可用来清除编译过程中产生的中间文件,例如在上述makefile文件中添加下列代码: clean: rm -f *.o运行make clean时,将执行rm -f *.o命令,删除所有编译过程中产生的中间文件。,4.Make,Make的运行GUN
16、 make默认在当前的目录下一次查找GUNmake文件,Makefile文件和makefile文件,找到后读取文件执行。给make命令指定一个特殊名字的makefile文件make f hchen.mk,4.Make,自己动手编写makefile仍然是很复杂和烦琐的,而且很容易出错。因此,GNU也提供了Automake和Autoconf来辅助快速自动产生makefile。,4.Make,使用autoconf和automake来进行自动化配置和生成Makefile的流程可以概括如下:运行autoscan命令。将configure.scan文件重命名为configure.in,并修改configu
17、re.in文件。运行aclocal命令得到aclocal.m4文件。运行autoconf命令得到configure文件。在工程目录下新建Makefile.am文件,如果存在子目录,子目录中也要创建此文件。将/usr/share/automake-1.X/目录下的depcomp和compile文件复制到需要处理目录下。运行automake -a命令得到Makefile.in文件。运行./configure脚本,4.Make,从例子程序helloworld开始。过程如下:新建三个文件: helloworld.cconfigure.inMakefile.am然后执行 aclocal; autocon
18、f; automake -add-missing; ./configure; make; ./helloworld Makefile被产生出来,而且可以将helloworld.c编译通过。,小结,本部分主要阐述了Linux程序的编写、编译、调试方法及make,实际上是引导学习怎样在Linux下编程,为后续章节做好准备。,第二部分 Linux下的C编程实战之文件系统编程,Linux平台下文件编程,在Linux平台下对文件编程可以使用两类函数:Linux操作系统文件API;C语言I/O库函数。 前者依赖于Linux系统调用,后者实际上与操作系统是独立的,因为在任何操作系统下,使用C语言I/O库函数
19、操作文件的方法都是相同的。,1. Linux文件API-创建,创建int create(const char *filename, mode_t mode); 参数mode指定新建文件的存取权限,它同umask一起决定文件的最终权限(mode 该调用将umask设置为newmask,然后返回旧的umask,它只影响读、写和执行权限。,1. Linux文件API-创建,mode可以是以下情况的组合,可以通过上述宏进行“或”逻辑产生标志。,1. Linux文件API-创建,mode可以是以下情况的组合,可以通过上述宏进行“或”逻辑产生标志。,1. Linux文件API-创建,用数字来表示:Linu
20、x总共用5个数字来表示文件的各种权限:第一位表示设置用户ID;第二位表示设置组ID;第三位表示用户自己的权限位;第四位表示组的权限;最后一位表示其他人的权限。每个数字可以取1(执行权限)、2(写权限)、4(读权限)、0(无)或者是这些值的和。,1. Linux文件API-创建,用数字来表示:例如,要创建一个用户可读、可写、可执行,但是组没有权限,其他人可以读、可以执行的文件,并设置用户ID位。应该使用的模式是1(设置用户ID)、0(不设置组ID)、7(1+2+4,读、写、执行)、0(没有权限)、5(1+4,读、执行)即10705,1. Linux文件API-打开,打开int open(cons
21、t char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode); 如果文件打开成功,open函数会返回一个文件描述符,以后对该文件的所有操作就可以通过对这个文件描述符进行操作来实现。open函数有两个形式,其中pathname是要打开的文件名(包含路径名称,缺省是认为在当前路径下面) 。,1. Linux文件API-打开,打开flags可以是下面的一个值或者是几个值的组合,O_RDONLY、O_WRONLY、O_RDWR三个标志只能使用任意的一个。,1. Linux文件API-打开,打开如果
22、使用了O_CREATE标志,则使用的函数是int open(const char *pathname,int flags,mode_t mode); 这时要指定mode标志,用来表示文件的访问权限。以O_CREAT为标志的open实际上实现了文件创建的功能。例如: open(test, O_CREAT, 10705); open(test, O_CREAT, S_IRWXU | S_IROTH | S_IXOTH | S_ISUID );,1. Linux文件API-读写,读写Linux中提供文件读写的系统调用是read、write函数: int read(int fd, const void
23、 *buf, size_t length); int write(int fd, const void *buf, size_t length);参数buf为指向缓冲区的指针,length为缓冲区的大小(以字节为单位)。,1. Linux文件API-读写,int read(int fd, const void *buf, size_t length);函数read实现从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲区中,返回值为实际读取的字节数。int write(int fd, const void *buf, size_t length);函数write实现将把le
24、ngth个字节从buf指向的缓冲区中写到文件描述符fd所指向的文件中,返回值为实际写入的字节数。,1. Linux文件API-定位,定位:对于随机文件,我们可以随机的指定位置读写,使用如下函数进行定位: int lseek(int fd, offset_t offset, int whence);lseek()将文件读写指针相对whence移动offset个字节。操作成功时,返回文件指针相对于文件头的位置。参数whence可使用下述值:SEEK_SET:相对文件开头SEEK_CUR:相对文件读写指针的当前位置SEEK_END:相对文件末尾,1. Linux文件API-定位,定位:offset可
25、取负值,例如下述调用可将文件指针相对当前位置向前移动5个字节: lseek(fd, -5, SEEK_CUR);由于lseek函数的返回值为文件指针相对于文件头的位置,因此下列调用的返回值就是文件的长度: lseek(fd, 0, SEEK_END);,1. Linux文件API-关闭,关闭当操作完成以后,要关闭文件,只要调用close即可,其中fd是要关闭的文件描述符: int close(int fd);,1. Linux文件API-编程实例,例程:编写一个程序,在当前目录下创建用户可读写文件“hello.txt”,在其中写入“Hello, software weekly”,关闭该文件。再
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 环境下的C语言编程ppt课件 环境 语言 编程 ppt 课件

链接地址:https://www.31ppt.com/p-1376664.html