收藏 分享(赏)

嵌入式系统PPT第3章:Linux编程基础.ppt

上传人:bubibi 文档编号:20014226 上传时间:2023-12-02 格式:PPT 页数:120 大小:694KB
下载 相关 举报
嵌入式系统PPT第3章:Linux编程基础.ppt_第1页
第1页 / 共120页
嵌入式系统PPT第3章:Linux编程基础.ppt_第2页
第2页 / 共120页
嵌入式系统PPT第3章:Linux编程基础.ppt_第3页
第3页 / 共120页
嵌入式系统PPT第3章:Linux编程基础.ppt_第4页
第4页 / 共120页
嵌入式系统PPT第3章:Linux编程基础.ppt_第5页
第5页 / 共120页
亲,该文档总共120页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、第3章:Linux编程基础第1节GCC编译工具第2节 GDB调试工具第3节Make工程管理第4节Linux应用程序设计第3章:Linux编程基础第1节GCC编译器第2节 GDB调试器第3节Make工具的使用第4节Linux应用程序设计问题:(1)将C程序编译成在windows系统上运行的程序使用的编译器是什么?(2)将C程序编译成在Linux系统上运行的程序使用的编译器是什么?一、一、GCCGCC概述概述 GCC(GNU C Compiler的简称)是一组编译工具的总称,主要任务是预处理和编译,并且提供与编译器相关的运行库的支持。GNU是什么?GNU(GNUs Not Unix,GNU,“不是

2、UNIX”的缩写):自由软件工程项目自由软件工程项目。GCC支持的体系结构有四十余种,如:X86、ARM、PowerPC等系列处理器;能运行在不同的操作系统上,如:Linux、Android、WindowsCE等操作系统;可完成C、C+、ObjectiveC等源文件向运行在特定CPU硬件上的目标代码的转换GCC工具包括:预编译处理程序 cpp、cpp0汇编器 asC编译器 cc、cc1、gccC编译器 c+、cc1plus、g+链接器 ld二进制转换工具 objcopy库文件 libgcc.a、libgcc_eh.a、libgcc_s.so gcc是GCC编译器组件之一,也是GNU软件家族中具

3、有代表性的作品。GCC目前支持几乎所有主流的CPU处理器平台,可完成C、C等源文件向运行在特定CPU硬件上的目标代码的转换。GCC所支持的源文件程序格式后缀说明后缀说明C源程序经过预处理的C+程序由目标文件构成的档案文件(库文件)Objective C源程序C源程序编译后的目标程序头文件汇编语言源程序经过预处理的C程序经过预编译的汇编程序后缀说明后缀说明.c.ii.a.m.C .cc.o.h.s.i.S 使用GCC编译工具将C语言源程序编译成可执行文件,要依次经过四个阶段:二、二、GCCGCC编译过程编译过程预处理(Pre-Processing)使用cpp 生成文件x.i编译(Compilin

4、g)cc1 x.S汇编(Assembling)as x.o链接(Linking)ld x预编译编译汇编连接-E-S-c-o处理头文件与预编译语句。如:宏定义等汇编代码目标文件可执行程序gcc E 1.c o 1.i /vi 1.igcc S 1.i o 1.S /vi 1.Sgcc c 1.S o 1.o /目标文件gcc 1.o o 1 /可执行文件预编译主要完成以下3个具体任务。把include中的头文件复制到要编译的源文件中。用实际值替代define文本。在调用宏的地方进行宏替换。源代码中的预编译指示以“#”为前缀。(1)(1)预处理预处理实例1:文件test.c的内容如下:#defin

5、enumber1+2intmain()intn;n=number*3;return0;请问n的值是多少?为什么?#gccEtest.cotest.ivi test.i的内容如下:#1test.c#1#1#1test.cmain()intn;n=1+2*3;return0;文件test.c的内容如下:#definenumber1+2intmain()intn;n=number*3;return0;预处理预处理编译(Compilation)的主要功能包括2部分,第一部分是检查代码的语法,如果出现语法错误,则给出错误提示代码,并结束编译;只有在代码无语法错误的情况下,才能进入第二部分。第二部分是将预

6、编译后的文件转换成汇编语言,并自动生成后缀为.s的文件。(2)编译)编译#gccStest.c生成文件test.s.filetest.c.text.globlmain.typemain,functionmain:.LFB0:.cfi_startprocpushq%rbp.cfi_def_cfa_offset16movq%rsp,%rbp.cfi_offset6,-16.cfi_def_cfa_register6movl$7,-4(%rbp)movl$0,%eaxleaveret.cfi_endproc.LFE0:.sizemain,.-main.identGCC:(Ubuntu/Linaro4

7、.4.7-1ubuntu2)4.4.7.section.note.GNU-stack,progbits(3)汇编汇编(Assembly)的主要功能是将汇编语言代码变成目标代码(机器代码)。汇编只是将汇编语言代码转换成目标代码,但不进行连接,目标代码不能在CPU上运行。#gcc-ctest.c执行命令后会生成一个名为test.o的目标文件,目标文件是一个二进制文件,所以不能用文本编辑器来查看它的内容。(4)连接连接(Linking)的主要功能是连接目标代码,并生成可执行文件。#gccotesttest.o也可以执行以下命令。#gccotesttest.c执行命令后会生成一个名为test可执行文件

8、。通过执行./test命令,就可以运行指定的程序。问题1:编译过程中“连接”的任务是什么?答:连接的任务是将所有的目标代码连接成一个可执行的文件。如:一个程序它使用了库函数,库函数的目标代码在库文件中,则连接的过程是:将当前的目标代码和库函数代码连接成一个可执行程序。以后程序运行时,将要使用到这个库文件。问题2:头文件、库文件中的内容有什么区别?他们分别在什么时候使用?答:头文件的内容通常是函数声名、宏定义、结构定义等;库文件是实现函数功能的目标文件。头文件要加载到源文件中,编译时会使用它,程序运行时不会使用到头文件;库文件在编译、以及以后的程序运行时,都会使用到它。gcc选项文件名三、三、G

9、CCGCC选项选项缺省参数的编译结果:文件hello.c程序内容如下:#includevoid main()char msg80=“Hello,world!”;printf(“%s/n”,msg);gcchello.c生成一个名为a.out的可执行文件./a.out./表示当前目录Hello,world!gcc编译器的编译选项大约有100多个,其中多数我们很少使用,这里只介绍其中最基本、最常用的参数gcc常用选项选项说明-o FileName指定输出文件名,如果没有指定,缺省文件名是:a.out-c只编译生成目标文件,后缀为.o-g在执行程序中包括标准调试信息-O对程序进行优化编译、链接,提高

10、程序的执行效率。-I DirName将DirName加入到头文件的搜索目录列表中-L DirName将DirName加入到库文件的搜索目录列表中,在缺省情况下gcc只链接共享库。-l FOO链接名为libFOO的函数库-static静态链接库文件实例1:将源文件hello.c编译成可执行文件hellogcchello.cohello/生成一个名为hello的可执行文件./helloHello,world!(1 1)输出文件选项(参数)输出文件选项(参数o o)实例2:将源文件hello.c编译成目标文件hello.ogccchello.c-ohello.ols-l观察一下hello.o和hel

11、lo二个文件的属性。Linux操作系统下的库文件包括两种格式,一种是动态链接库,另一种是静态链接库。动态链接库的后缀为.so,静态链接库的后缀为.a。动态链接库是在程序运行过程中进行动态加载,静态链接库是在编译过程中完成静态加载。(2 2)链接库文件选项(参数)链接库文件选项(参数l l)例如,有一个多线程程序pthread.c,代码如下:#include#includepthread.hvoid*producer(void*data)printf(producerstopped!n);returnNULL;intmain(void)pthread_tth_a;void*retval;pthr

12、ead_create(&th_a,NULL,producer,0);pthread_join(th_a,&retval);return0;#gccpthread.copthread/tmp/ccQEeIpc.o:Infunctionmain:pthread.c:(.text+0 x3c):undefinedreferencetopthread_createpthread.c:(.text+0 x4f):undefinedreferencetopthread_joincollect2:ld返回1显示编译出错,这是因为多线程程序需要用到libpthread.a或libpthread.so库文件(文

13、件保存在/usr/lib目录),而以上命令没有指定库文件。将命令修改如下。#gccpthread.c-lpthread-opthreadGCC在默认情况下,优先使用动态链接库,当需要强制使用静态链接库时,需要加上-static选项。使用静态链接库,编译生成一个名为pthread-s的可执行程序的命令格式如下。#gccpthread.c-static-lpthread-opthread-s可以使用lsl命令查看文件的大小,会发现pthread-s比pthread文件大很多。-rwxrwxr-x1linuxlinux85463月1516:56pthread-rwxrwxr-x1linuxlinux

14、11414483月1516:56pthread-s例如:编写函数chang()实现字符大小写转换功能,并把该函数加入到libnew.so库文件中,最后将库文件复制到/home/test/lib目录(3 3)指定库文件目录(参数)指定库文件目录(参数L L)函数库一般分为静态和共享两种格式。后缀为.a:静态型函数库(静态链接库)后缀为.so:共享型函数库(动态链接库)静态链接是指编译时将库复制到文件中。动态链接是指程序运行时需要调用共享库文件。函数库一般存放在/usr/lib目录。如果存放在其它目录需要指定。gcc指定库文件所在的目录的参数是-L,指定库文件名的参数是-l如何将chang()函数

15、加入到libnew.so库文件中文件chang.c的内容:char chang(char ch)if(ch=A&ch=a&ch=z)ch=ch-32;return ch;my.c/hometestLibnew.solibgcc-c chang.c-o chang.oar rcs libnew.so chang.o如何将chang()函数加入到libzhs.a库文件中my.c/hometestLibnew.solib如何使用libnew.so中的chang()函数文件my.c的内容#include#includecharchang(charch);main()chars=abCD12;inti,

16、n;printf(1-%sn,s);n=strlen(s);for(i=0;in;i+)si=chang(si);printf(2-%sn,s);my.c/hometestLibnew.solib如何使用libnew.so中的chang()函数gccmy.cL/home/test/liblnewomymy.c/hometestLibnew.solib(4 4)指定头文件目录选项(参数)指定头文件目录选项(参数I I)C程序中的头文件包括两种情况:#include#include“b.h”请问:和”有什么区别?是让预处理程序cpp在系统预设的头文件目录(如:/usr/include)中搜寻相应的

17、文件。”是让预处理程序cpp在当前目录中搜寻相应的文件。gcc指定头文件所在的目录的参数是-I例如,程序someapp.c的代码如下:#include#includemain()floats,r=3;s=PI*r*r;printf(s=%6.2fn,s);程序中的头文件someapp.h保存在/home/test/include目录下,someapp.h内容如下。#definePI3.14#gccsomeapp.cI/home/test/includeosomeapp在编译过程中,编译器的警告信息对于程序员来说是非常重要的信息,GCC包含完整的警告提示功能,以便确定代码是否正确,尽可能实现可移

18、植性。(5 5)警告选项)警告选项类型说明-Wall启用所有警告信息-Werror在发生警告时取消编译操作,即将警告看作是错误-w禁用所有警告信息example.c的代码如下。#includeintmain()intx,y;for(x=1;x=5;x+)printf(x=%dn,x);如果加入-Wall选项进行编译,命令如下。#gcc-Wall example.c-o example编译过程将会出现下面的警告信息。example.c:In function mainexample.c:4:warning:unused variable yexample.c:7:warning:control

19、reaches end of non-void function代码通过编译并不代表能正常工作了。可以通过调试器检查代码,以便更好的找到程序中的问题。Linux下主要采用的是GDB调试器。在使用GDB之前,在执行程序中要包括标准调试信息,加入的方法是采用调试选项-g。具体的命令如下。#gccgctest.c#gccgohellohello.o(6 6)调试选项)调试选项实例3:将源文件optimize.c进行优化编译#includeintmain(void)doublecounter;doubleresult;doubletemp;for(counter=0;counter2000.0*200

20、0.0*2000.0/20.0+2020;counter+=(5-1)/4)temp=counter/1979;result=counter;printf(Resultis%lfn,result);return0;(7 7)优化选项(参数)优化选项(参数O O)观察程序运行时间gccoptimize.c-oop_1time./op_1Resultis400002019.000000nreal0m4.203suser0m4.190ssys0m0.020sgcc-Ooptimize.c-oop_2time./op_2Resultis400002019.000000nreal0m1.064suser

21、0m1.060ssys0m0.010s实例4:多个源程序(exam1.c和exam2.c)生成一个可执行文件文件exam1.c的内容intsum(intn)inttemp=0,I;for(i=1;i=n;i+)temp+=I;returntemp;文件exam2.c的内容#includemain()intm;externintsum(intsum);scanf(“%d”,&m);printf(“Thesumis%d”,sum(m);gccexam1.cexam2.c-oexam第3章:Linux编程基础第1节GCC编译器第2节 GDB调试器第3节Make工具的使用第4节Linux应用程序设计1

22、 1、GDBGDB简介简介gdb(GUN Debugger)是一种基于命令行工作模式下的调试器。可以调试多种语言,包括C、C、Java、Pascal、Fortran等语言。2 2、GDBGDB的主要功能的主要功能启动被调用的程序让被调用的程序在指定位置停止当程序被停止时,可检查程序的状态(如变量的值)3 3、GDBGDB快速入门快速入门(1)编译生成可执行程序gcc-gtest.c-otest(2)启动gdbgdbtest(3)设置断点breakmain(4)运行程序run(5)单步执行next(6)继续执行continue(7)退出quit4 4、GDBGDB基本命令基本命令list(l)查

23、看程序break(b)函数名在函断数设置断点break(b)行号在行号设置断点break(b)文件名:行号break(b)行号if 条件info break查看所有设置的断点delete断点编号删除断点run(r)next(n)单步执行(不进入子函数)step(s)单步执行(进入子函数)Continue(c)继续运行程序print(p)变量名查看指定变量的值finish运行程序,直到当前函数结束watch变量名对指定变量进行监控quit(n)退出5 5、GDBGDB实例实例有一个bug.c程序,它的功能是将输入的字符串逆序显示在屏幕上,源代码如下:#include#includeintmain

24、(void)inti,len;charstr=hello;char*rev_string;len=strlen(str);rev_string=(char*)malloc(len+1);printf(%sn,str);for(i=0;ilen;i+)rev_stringlen-i=stri;rev_stringlen+1=0;printf(thereversestringis%sn,rev_string);5 5、GDBGDB实例实例程序的编译和运行结果如下:#gcc-obugbug.c#./bughellothereversestringis以上运行的结果是错误的,正确结果应当如下:hell

25、othereversestringisolleh5 5、GDBGDB实例实例#gcc-g-obugbuge.c#gdbbug执行命令后,进入调试环境,显示如下:(gdb)l-列出源文件内容1#include2#include3intmain(void)45inti,len;6charstr=hello;7char*rev_string;8len=strlen(str);9rev_string=(char*)malloc(len+1);10printf(%sn,str);(gdb)5 5、GDBGDB实例实例printf(%sn,str);(gdb)l11for(i=0;ilen;i+)12re

26、v_stringlen-i=stri;13rev_stringlen+1=0;14printf(thereversestringis%sn,rev_string);155 5、GDBGDB实例实例(gdb)break8-在源代码第8行设置断点Breakpoint1at0 x80483b2:fileexample.c,line8.(gdb)r-运行程序Startingprogram:/lvli/program/bugg/bugBreakpoint1,main()atbug.c:88len=strlen(str);(gdb)n -在第一个断点处停止,n相当于next,单步执行9 rev_strin

27、g=(char*)malloc(len+1);(gdb)printlen-输出变量len的值$1=5(gdb)n-单步执行10printf(%sn,str);(gdb)nhello11for(i=0;ilen;i+)5 5、GDBGDB实例实例通过以上调试过程可见,错误的根源在于没有给rev_string0赋值,所以rev_string0为0,导致字符串输出为空。可以将rev_stringlen-i改成rev_stringlen-1-i,这样结果就是期待的结果。#include#includeintmain(void)inti,len;charstr=hello;char*rev_string

28、;len=strlen(str);rev_string=(char*)malloc(len+1);printf(%sn,str);for(i=0;ilen;i+)rev_stringlen-i=stri;rev_stringlen+1=0;printf(thereversestringis%sn,rev_string);第3章:Linux编程基础第1节GCC编译器第2节 GDB调试器第3节Make工具的使用第4节Linux应用程序设计当你有一个c文件时,你可以用gcc直接编译,但当你的主程序依赖于很多其他c文件时,你再用gcc一条一条的编译便显得很吃力,这时候用make便会使一切变得轻松。ma

29、kemake简介概述简介概述 Make工具可以将大型的开发项目分解成为多个更易于管理的模块,简洁明了的理顺各个源文件之间纷繁复杂的相互依赖关系,最后自动完成编译工作。Make又叫工程管理器,即管理较多的工程文件。它最主要的功能是通过Makefile文件来描述源程序之间的相互依赖关系,并自动完成维护编译工作。Make工具能够根据文件的时间戳自动发现更新过的文件,从而减少编译工作量。Makefile文件需要严格按照语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并定义源文件之间的依赖关系等。Makefile:告诉 make 维护一个大型程序,该做什么。简单的说 makefile

30、 就像批处理的脚本文件,里边写好了一些命令的集合,当运行 make 命令时,便会按着 makefile 提供的命令及顺序来完成编译。1Makefile基本结构规则的格式target:dependencycommand其中:target(目标体)dependency(依赖关系)command(命令)一、一、MakefileMakefile基础知识基础知识Makefile(实例)hello:hello.ogcchello.oohellohello.o:hello.cgccchello.cohello.oclean:rm*.ohello请问有几个规则?各规则的目标名叫什么?2Make工具的使用Mak

31、efile文件编写完成以后,需要通过make工具来执行,make命令的格式如下。maketarget参数target是指要处理的目标体名请问以下3条命令的含义?makemakehellomakecleanhello:hello.ogcchello.oohellohello.o:hello.cgccchello.cohello.oclean:rm*.ohello3Makefile变量Makefile中的变量分为用户自定义变量、预定义变量和自动变量。CC=gccOBJECT=hello.oall:$(OBJECT)$(CC)$(OBJECT)ohello$(OBJECT):hello.c$(CC)

32、chello.co$(OBJECT)clean:rm*.ohello请有几个变量?分别属于那种变量?预定义变量变 量含义AR库文件维护程序的名称,默认值为arAS汇编程序的名称,默认值为asCCC编译器的名称,默认值为ccCPPC预编译器的名称,默认值为$(CC)ECXXC+编译器的名称,默认值为g+FCFORTRAN编译器的名称,默认值为f77RM文件删除命令的名称,默认值为rm fARFLAGS库文件维护程序的名称,无默认值ASFLAGS汇编程序的选项,无默认值CFLAGSC编译器的选项,无默认值CPPFLAGSC预编译的选项,无默认值CXXFLAGSC+编译器的选项,无默认值FFLAGS

33、FORTRAN编译器的选项,无默认值自动变量变 量说 明$规则的目标所对应的文件名$*不包含扩展名的目标文件名称$+所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件$%如果目标是归档成员,则该变量表示目标的归档成员名称$规则中的第一个依赖文件名$规则中所有依赖的列表,以空格为分隔符$?规则中日期新于目标的所有依赖文件的列表,以空格为分隔符$(D)目标文件的目录部分(如果目标在子目录中)$(F)目标文件的文件名部分(如果目标在子目录中)规则的格式:target:prerequisitescommand规则的格式:目标目标:依赖关系依赖关系 命令命令hello.o:hello

34、.cgccchello.cohello.o3 3、MakefileMakefile详细讲解详细讲解all:hello.ogcchello.oohellohello.o:hello.cgccchello.cohello.oclean:rm*.ohello Makefile中把那些没有任何依赖,只有执行动作的目标称为“伪目标”(phony targets)MakefileMakefile中的中的“伪目标伪目标”实例1:用make命令,编译11.c假设在root目录下,有11.c文件,文件内容如下:#includemain()intx;printf(“pleaseinputanumber:”);sc

35、anf(“%d”,&x);printf(“Thenumberis%dn”,x);(1)在root目录下,有11.c文件。(2)在此目录下,再用vi编辑文件Makefile,内容如下:11:11.cgcco1111.c要创建的项目创建的项目所依赖的文件创建的项目使用的命令(3)在此目录下,运行make命令这时会生会一个可执行文件11。以后修改了源程序,只要运行make命令即可。不能用空格,只能用table键为了方便文件的编辑,在编辑makefile时,可以使用变量。引用变量时,只需在变量前面加上$符。变量使用和引用实例:CC=gccEXEC=11$(CC)$(EXEC)MakefileMakef

36、ile中的变量(中的变量(用户自定义变量)用户自定义变量)Makefile中的变量分为用户自定义变量、预定义变量和用户自定义变量、预定义变量和自动变量自动变量。可以将Makefile的内容写为:CC=gccEXEC=11SOURCE=11.c$(EXEC):$(SOURCE)$(CC)o$(EXEC)$(SOURCE)11:11.cgcco1111.c$表示目标的完整名称$表示所有的依赖文件,以空格分开。$第一个依赖的文件请看下面语句的功能11:11.cgcc-o$exam:exam1.cexam2.cgcco$gcco1111.cgccoexamexam1.cexam2.cMake工作时的执

37、行步骤(1)主Makefile(主Makefile中可以引用其他Makefile)(2)读入被include包括的其他的makefile文件(3)初始化文件中的变量(4)推到隐式规则,并分析所有规则(5)为所有的目标文件创建依赖关键链(6)根据依赖关系,决定哪些目标要重新生成(7)执行生成命令4 4、MakeMake工具的使用工具的使用现有7个文件分别是m.c,m.h,study.c,listen.c,visit.c,play.c,watch.c。利用这7个程序生成一个名为m的可执行程序,如何编写Makefile文件。5 5、MakeMake工具应用实例工具应用实例CC=gccTARGET=A

38、llOBJECTS=m.ovisit.olisten.owatch.ostudy.oplay.o$(TARGET):$(OBJECTS)$(CC)$(OBJECTS)omm.o:m.cm.h$(CC).ovisit.o:visit.c$(CC)cvisit.covisit.olisten.o:listen.c$(CC)clisten.colisten.owatch.o:watch.c$(CC)cwatch.cowatch.ostudy.o:study.c$(CC)cstudy.costudy.oplay.o:play.c$(CC)cplay.coplay.oclean:rm*.o现用$、$、$

39、三个预定义变量来改写上述Makefile文件。CC=gccTARGET=AllOBJECTS=m.ovisit.olisten.owatch.ostudy.oplay.o$(TARGET):$(OBJECTS)$(CC)$omm.o:m.cm.h$(CC)c$o$visit.o:visit.c$(CC)c$o$listen.o:listen.c$(CC)c$o$watch.o:watch.c$(CC)c$o$study.o:study.c$(CC)c$o$play.o:play.c$(CC)c$o$clean:rm*.oCC=gccTARGET=AllOBJECTS=m.ovisit.olis

40、ten.owatch.ostudy.oplay.o$(TARGET):$(OBJECTS)$(CC)$(OBJECTS)omm.o:m.cm.h$(CC).ovisit.o:visit.c$(CC)cvisit.covisit.olisten.o:listen.c$(CC)clisten.colisten.owatch.o:watch.c$(CC)cwatch.cowatch.ostudy.o:study.c$(CC)cstudy.costudy.oplay.o:play.c$(CC)cplay.coplay.oclean:rm*.o从修改后的Makefile文件看出,各个文件的编译命令几乎没

41、有区别,所以还进一步用%和*两个通配符来简化:CC=gccTARGET=AllOBJECTS=m.ovisit.olisten.owatch.ostudy.oplay.o$(TARGET):$(OBJECTS)$(CC)$om*.o:*.c$(CC)c$o$clean:rm*.oCC=gccSRC_DIR=./OBJ_DIR=./obj/INC_DIR=./include/TARGET=all$(TARGET):$(OBJ_DIR)m.o$(OBJ_DIR)visit.o$(OBJ_DIR)listen.o$(OBJ_DIR)watch.o$(OBJ_DIR)study.o$(OBJ_DIR)

42、play.o$(CC)$-o$(SRC_DIR)m$(OBJ_DIR)m.o:$(SRC_DIR)m.c$(INC_DIR)m.h$(CC)I$(INC_DIR)co$(OBJ_DIR)visit.o:$(SRC_DIR)visit.c$(CC)c$o$(OBJ_DIR)listen.o:$(SRC_DIR)listen.c$(CC)c$o$(OBJ_DIR)watch.o:$(SRC_DIR)watch.c$(CC)c$o$(OBJ_DIR)study.o:$(SRC_DIR)study.c$(CC)c$o$(OBJ_DIR)play.o:$(SRC_DIR)play.c$(CC)c$o$c

43、lean:rm$(OBJ_DIR)*.o第3章:Linux编程基础第1节GCC编译器第2节 GDB调试器第3节Make工具的使用第4节Linux应用程序设计第4节Linux应用程序设计4.1文件操作编程4.2时间编程4.3多线程编程文件编程包括2种:系统调用-文件访问(Linux)C库函数-文件访问(C语言)4.1 文件操作编程文件操作编程1 1、库函数调用(文件编程)、库函数调用(文件编程)(1)打开和关闭文件函数FILE*fopen(constchar*filename,constchar*mode);intfclose(FILE*stream);其中:filename表示需要打开的文件名

44、mode为文件打开模式(2)读取文件数据函数size_tfread(void*ptr,size_tsize,size_tn,FILE*stream);intfgetc(FILE*stream);char*fgets(char*s,intsize,FILE*stream);(3)向文件写数据函数size_tfwrite(constvoid*ptr,size_tsize,size_tn,FILE*stream);intfputc(intc,FILE*stream);intfputs(constchar*s,FILE*stream);阅读程序file_copy.c#include#include#d

45、efineBUFFER_SIZE1024intmain(intargc,char*argv)FILE*fileFrom,*fileTo;charbufferBUFFER_SIZE=0;intlength=0;if(argc!=3)printf(Usage:%sfileFromfileTon,argv0);exit(0);/*打开源文件*/fileFrom=fopen(argv1,rb+);if(fileFrom=NULL)printf(OpenFile%sFailedn,argv1);exit(0);/*打开或创建目标文件*/fileTo=fopen(argv2,wb+);if(fileTo=

46、NULL)printf(OpenFile%sFailedn,argv2);exit(0);/*复制文件内容*/while(length=fread(buffer,1,BUFFER_SIZE,fileFrom)0)fwrite(buffer,1,length,fileTo);/*关闭文件*/fclose(fileFrom);fclose(fileTo);return0;执行命令#gccfile_copy.c-ofile_copy#./file_copyhello.czhs.c2.利用Linux系统调用完成文件操作编程C语言库中的fopen、fclose、fwrite、fread等函数,其实是由操

47、作系统的API函数封装而来,如fopen内部其实调用的是open函数,fwrite内部调用的是write函数。用户也可以直接利用Linux系统的API函数来完成文件操作编程。常用的Linux系统API函数有open、close、write、read等,这些API函数在5.1.3节有介绍。下面通过一个实例加深理解。#defineMAX40main()intfd,n,ret;charwritebufMAX=Thisisatestdata!;/打开文件,如果文件不存在,则会创建文件fd=open(“a.txt”,O_RDWR|O_CREAT);/向文件写入字符串ret=write(fd,writeb

48、uf,strlen(writebuf);if(ret0)perror(WriteError!);return1;elseprintf(write%dcharacters!n,ret);/保存文件close(fd);思考:如果文件名从命令行输入,如何改写程序?时间函数的说明包含在time.h头文件中1time函数函数格式:函数格式:time_ttime(time_t*tloc);函数功能:函数功能:获取日历时间日历时间,即从1970年1月1日0点到现在所经历的秒数,结果保存在tloc。如果操作成功,则返回值为经历的秒数;若操作失败,则返回值为(time_t)-1),错误原因存于errno中。4.

49、2 时间编程时间编程请编写一个程序获得当前的日历时间4.2 时间编程时间编程#include#includemain()time_tlt;lt=time(NULL);printf(TheCalenderTimeNow:%dn”,lt);#gcctime1.c-ot1#./t1TheCalenderTimeNow:13376044732gmtimelocaltime函数函数格式函数格式:structtm*gmtime(consttime_t*timep);函数功能:将日历时间转化为格林威治标准时间,并将数据保存在tm结构中。localtime函数格式函数格式:structtm*localtime

50、(consttime_t*timep);函数功能:将日历时间转化为本地时间(北京时间),并将数据保存在tm结构中。4.2 时间编程时间编程tm结构的定义如下:structtminttm_sec;/秒inttm_min;/分inttm_hour;/时inttm_mday;/日inttm_mon;/月inttm_year;/年inttm_wday;/本周第几日inttm_yday;/本月第几日inttm_isdst;/日光节约时间;4.2 时间编程时间编程请编写一个程序获得本地时间(显示小时)4.2 时间编程时间编程#include#includemain()structtm*local;time

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 网络技术 > 前端技术

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:文库网官方知乎号:文库网

经营许可证编号: 粤ICP备2021046453号世界地图

文库网官网©版权所有2025营业执照举报