1/52Linux网络编程第一单元Linux下C编程环境2/57第一单元Linux下C编程环境•1.1UNIX/Linux概述•1.2常用命令•1.3Linux下C程序开发•1.4命令行参数3/571.1UNIX/Linux概述•1.1.1UNIX操作系统•1.1.2Linux操作系统4/57UNIX概述•1969年:KenThompson汇编语言•1973年:与DennisRitchie用C语言重写UNIXⅢ•UNIX分为SystemV和BSD两大主流1978年:加利福尼亚大学伯克利分校以UNIX第六版为基础改进成BSD系列UNIX。1983年:SystemV版本1发布,第一个商业UNIX版本SystemV版本4是较成功的,或称为SVR41992年,版权纠纷,伯克利分校删除原UNIX代码,重写内核,1994年诞生4.4BSD版本,成为现代BSD基本版本。5/57UNIX概述•UNIX操作系统体系结构6/571.1UNIX/Linux概述•1.1.1UNIX操作系统•1.1.2Linux操作系统7/57Linux概述•1987年:荷兰的Vrije大学的AndrewS.Tanenbaum开发MINIX,用于操作系统课程的教学•1991年:Linus学习MINIX并发布了Linux内核。•2003年:Linux2.6版本内核发布•Linux版本的两种说法内核版本:Linux2.4.20,Linux2.6等r.x.y:r-主版本号,x-偶数稳定奇数开发,y-错误修补次数发行版本:RedHatLinux9.0,SUSE10,Ubuntu等厂家将Linux内核与外围实用程序和文档包装,提供安装界面和系统配置、管理工具等,形成的操作系统。8/57Linux概述•Linux特点优点:内核开源开放性、多用户、多任务、用户界面、设备独立性、丰富的网络功能、可靠的系统安全、良好的可移植性。缺点:操作界面不直观,普通人不容易入门和使用9/57Linux概述•几个术语GNU:GNU'sNotUNIX革奴,GNU软件遵循GPL协议GPL:GeneralPublicLicense通用公共许可与软件是否免费无关,只要是自由的POSIX:PortableOperatingSystemInterface可移植操作系统接口,正在完善,目的是提高类UNIX环境下应用程序的可移植性。10/57第一单元Linux下C编程环境•1.1UNIX/Linux概述•1.2常用命令•1.3Linux下C程序开发•1.4命令行参数11/571.2常用命令•1.2.1目录与文件•1.2.2进程•1.2.3在线文档介绍12/57目录•ls:显示文件列表ls–l长格式用户对文件的操作权限-a目录名•pwd:显示当前目录路径•cd:切换目录•mkdir:创建目录•rmdir:删除空目录•rm:删除非空目录-r强制删除-f13/57文件•lessmorecatheadtail查看内容•touch创建空文件•rm删除文件•cp复制,mv移动•wc统计数字14/57文件•find在目录中查找文件find路径-name文件名find路径-name“s*”----查找以s开头的文件•grep在文件中查找字符串grep字符串文件名grep字符串*-----在当前目录下所有文件中查找15/571.2常用命令•1.2.1目录与文件•1.2.2进程•1.2.3在线文档介绍16/57进程•ps-A查看系统当前所有进程•kill进程pid结束某个进程•kill-9进程pid强制结束某个进程17/571.2常用命令•1.2.1目录与文件•1.2.2进程•1.2.3在线文档介绍18/57在线文档介绍•man手册•man常用格式:man数字查看的主题如:man2open数字(小节)1命令,2系统调用,3函数库调用,5文件格式和约定,8系统管理命令一般来说,命令可以直接使用“man命令”格式如果命令与函数名字相同,直接使用man查看的是命令帮助,加上小节才是函数帮助。如chmod。19/57练习•/root下新建文件夹student•在student中创建文件group1•复制文件group1至/home中、并重命名文件为group2•删除/root下student文件夹20/57第一单元Linux下C编程环境•1.1UNIX/Linux概述•1.2常用命令•1.3Linux下C程序开发•1.4命令行参数21/571.3Linux下C程序开发•1.3.1编辑工具(Vim)•1.3.2编译工具(GCC)•1.3.3Make工具与Makefile文件•1.3.4调试方法•1.3.5获取错误信息22/57Vim的工作模式•三种模式插入模式:键盘按键被当作文本命令模式:键盘按键被当作命令底行模式:输入“:”“?”“/”后进入,完成某些功能。23/57Vim的基本用法•启动命令提示符后输入“vim文件名”•以下vim的用法都是在命令模式和底行模式下,所以在插入模式时要先Esc退出编辑状态进入命令模式。•保存不退出:w•另存为:w新文件名•退出:wq保存并退出:q!不保存退出24/57Vim的高级用法•文本操作复制yy(行)yw(词)nyynyw剪切dd(行)dw(词)nddndw粘贴pP•行数跳转到某行数字G底行模式,“setnu”显示行号setnonu取消显示行号•撤销u•重做.•搜索/?25/57Vim练习•在/home下创建目录linuxnet,进入linuxnet,创建目录1•使用Vim编写源文件main.c和factorial.c,内容见下页PPT。•注意编写风格26/57编码风格•有很多规范,尽量按规范编程。一般注意:函数定义时的{}在最左边,其他要用tab缩进变量小写,用_分隔单词,宏大写函数功能最好简单,功能多再定义其他函数实现。注释:函数定义时说明功能,形参,返回值。函数内部关键位置加上注释。27/57//factorial.c#includestdio.h#includestdlib.hintfactorial(intn){if(n=1)return1;elsereturnfactorial(n-1)*n;}//main.c#includestdio.h#includestdlib.hintfactorial(intn);intmain(intargc,char**argv){intn;if(argc2){printf(Usage:%sn\n,argv[0]);return-1;}else{n=atoi(argv[1]);printf(Factorialof%dis%d.\n,n,factorial(n));}return0;}28/571.3Linux下C程序开发•1.3.1编辑工具(Vim)•1.3.2编译工具(GCC)•1.3.3Make工具与Makefile文件•1.3.4调试方法•1.3.5获取错误信息29/57编译器——GCC•GCC——GNUCCompiler功能强大的编译器,源代码到可执行文件有4个步骤:30/57GCC基本用法•基本格式gcc[选项][源文件名,如ex1.c]•生成可执行文件gcc-o可执行文件名源文件名或gcc源文件名-o可执行文件名•要用GDB工具调试最后加上-g选项•显示附加的警告信息最后加上-Wall选项31/57GCC练习•进入/home/linuxnet/1目录•将factorial.c和main.c编译生成factorial可执行文件。gcc-ofactorialfactorial.cmain.c•如果直接返回命令提示符则编译无错,使用ls命令查看当前目录下应该存在factorial文件。•如果编译出错,按照提示的文件以及对应行,查找相关错误。32/571.3Linux下C程序开发•1.3.1编辑工具(Vim)•1.3.2编译工具(GCC)•1.3.3Make工具与Makefile文件•1.3.4调试方法•1.3.5获取错误信息33/57make•make编译•makefile被编译文件•makefile文件中存在gcc相关命令的文本•运行make自动调用makefile文件,运行其中的命令生成可执行文件34/57make•对于大型的开发项目来说,可能包括很多源文件,使用make工具和makefile文件可以清晰地理顺各个源文件之间的关系。•Make工具主要是通过make命令调用makefile文件,通过makefile文件描述源程序之间的相互依赖关系,并自动维护编译工作。调用格式:“make目标”,查找makefile文件中指定的目标一般都省略目标直接用make来查找makefile文件中的第一个目标。35/57Makefile文件内容•(1)显式规则•(2)隐含规则•(3)变量定义•(4)指示符•(5)注释:#后为注释,行注释•只介绍显式规则和变量定义36/57显式规则•显式规则•格式:目标:依赖[tab]命令注意:[tab]位置按键盘上的tab键•举例hello:hello.cgcc–ohellohello.c如果hello不存在则进行编译。如果hello日期没有hello.c日期新则进行编译。37/57变量定义•变量类似C语言的宏,大小写敏感(推荐大小写搭配名字)$@.$^等都是自动化变量$@目标文件$^所有依赖文件声明时赋初值,使用时变量名前加$,最好用()将名字括起。如:OBJ=test.ofun1.ofun2.otest:$(OBJ)gcc–o$@$^38/57Makefile练习•进入/home/linuxnet/1目录•编写makefile文件,内容为将factorial.c和main.c编译生成factorial可执行文件。•首先将GCC时生成的factorial可执行文件删除,然后使用make命令重新编译生成factorial可执行文件Makefile文件内容:factorial:factorial.cmain.cgcc-o$@$^39/57make执行过程•当前目录下按照GNUmakefile、makefile、Makefile的顺序查找makefile文件•查找文件中的第一个目标文件如edit。•若edit不存在,edit后依赖的文件都存在,或edit修改时间比依赖文件的时间早,则会执行命令。•若edit依赖的.o文件不存在,则在当前文件中查找目标为依赖文件的规则,生成.o文件。•通常clean伪目标是用来清除中间文件的,而不是要生成clean文件。一般的makefile文件都加入clean。40/57Makefile内容•edit:main.okbd.ocommand.odisplay.o\insert.ogcc-oeditmain.okbd.ocommand.odisplay.o\insert.omain.o:main.cdefs.hgcc-cmain.ckbd.o:kbd.cdefs.hcommand.hgcc-ckbd.ccommand.o:command.cdefs.hcommand.hgcc-ccommand.cdisplay.o:display.cdefs.hbuffer.hgcc-cdisplay.cinsert.o:insert.cdefs.hbuffer.hgcc-cinsert.cclean:rmmain.okbd.ocommand.odisplay.o\insert.o41/571.3Linux下C程序开发•1.3.1编辑工具(Vim)•1.3.2编译工具(GCC)•1.3.3Make工具与Makefile文件•1.3.4调试方法•1.3.5获取错误信息42/57错误分类•编译错误:gcc时出现错误根据错误提示找到错误,从第一个错误开始找。到网上搜索错误提示总结编译错误的解决方法•运行错误:gcc正确,运行时出现错误需要调试43/57调试方法•调试器:GDB•打印调试在程序适当位置加printf提示