©2005博创科技北京博创兴业科技有限公司BEIJNGUNIVERSALPIONEERINGTECHNOLOGYCo.,LTD博创科技嵌入互动Linux开发基础原仓周博创科技嵌入互动©2006博创科技第二章Linux程序设计基础—C环境Linux编程概述文本编辑器viLinux下函数库GCC及其使用调试工具gdbGNUmake和makefile博创科技嵌入互动©2006博创科技Linux编程概述Linux软件开发一直在Internet环境下讲行。这个环境是全球性的,编程人员来自世界各地。只要能够访问Web站点,就可以启动一个以Linux为基础的软件项目。Linux开发工作经常是在Linux用户决定共同完成一个项目时开始的。当开发工作完成后,该软件就被放到Internet站点上,任何用户都可以访问和下载它。由于这个活跃的开发环境,新的以Linux为基础的软件功能日益强大,而且呈现爆炸式的增长态势。大多数Linux软件是经过自由软件基金会(FreeSoftwareFoundation)提供的GNU(GNU即GNU’snotUNIX)公开认证授权的,因而通常被称作GNU软件。GNU软件免费提供给用户使用,并被证明是非常可靠和高效的。许多流行的Linux实用程序如C编译器、shell和编辑器都是GNU软件应用程序。博创科技嵌入互动©2006博创科技Linux程序需要首先转化为低级机器语言即所谓的二进制代码以后,才能被操作系统执行。例如编程时,先用普通的编程语言生成一系列指令,这些指令可被翻译为适当的可执行应用程序的二进制代码。这个翻译过程可由解释器一步步来完成,或者也可以立即由编译器明确地完成。shell编程语言如BASH、TCSH、GAWK、Perl、Tcl和Tk都利用自己的解释器。用这些语言编制的程序尽管是应用程序文件,但可以直接运行。编译器则不同,它将生成一个独立的二进制代码文件然后才可以运行。博创科技嵌入互动©2006博创科技Linux编程风格GNU风格Linux内核编程风格博创科技嵌入互动©2006博创科技GNU风格(1/2)函数返回类型说明和函数名分两行放置,函数起始字符和函数开头左花括号放到最左边。尽量不要让两个不同优先级的操作符出现在相同的对齐方式中,应该附加额外的括号使得代码缩进可以表示出嵌套。按照如下方式排版do-while语句:do{}while()每个程序都应该以一段简短的说明其功能的注释开头。请为每个函数书写注释,说明函数是做什么的,需要哪些入口参数,参数可能值的含义和用途。如果用了非常见的、非标准的东西,或者可能导致函数不能工作的任何可能的值,应该进行特殊说明。如果存在重要的返回值,也需要说明。不要声明多个变量时跨行,每一行都以一个新的声明开头。博创科技嵌入互动©2006博创科技GNU风格(2/2)当一个if中嵌套了另一个if-else时,应用花括号把if-else括起来。要在同一个声明中同时说明结构标识和变量或者结构标识和类型定义(typedef)。先定义变量,再使用。尽量避免在if的条件中进行赋值。请在名字中使用下划线以分割单词,尽量使用小写;把大写字母留给宏和枚举常量,以及根据统一惯例使用的前缀。例如,应该使用类似ignore_space_change_flag的名字;不要使用类似iCantReadThis的名字。用于表明一个命令行选项是否给出的变量应该在选项含义的说明之后,而不是选项字符之后被命名。博创科技嵌入互动©2006博创科技Linux内核编程风格Linux内核缩进风格是8个字符。Linux内核风格采用K&R标准,将开始的大括号放在一行的最后,而将结束的大括号放在一行的第一位。命名尽量简洁。不应该使用诸如ThisVariableIsATemporaryCounter之类的名字。应该命名为tmp,这样容易书写,也不难理解。命名全局变量,应该用描述性命名方式,例如应该命名“count_active_users()”,而不是“cntusr()”。本地变量应该避免过长。函数最好短小精悍,一般来说不要让函数的参数多于10个,否则应该尝试分解这个过于复杂的函数。通常情况,注释说明代码的功能,而不是其实现原理。避免把注释插到函数体内,而写到函数前面,说明其功能,如果这个函数的确很复杂,其中需要有部分注释,可以写些简短的注释来说明那些重要的部分,但是不能过多。博创科技嵌入互动©2006博创科技文本编辑器vivi的模式vi的进入命令模式插入模式末行模式博创科技嵌入互动©2006博创科技vi的模式CommandMode(命令模式)这是执行vi后的缺省模式此时键盘输入当作命令命令有大小写之区分InputMode(插入模式)使用a、i、o、c、r、s进入插入模式用户输入的任何字符都被vi当做文件内容保存起来,并将其显示在屏幕上按下ESC键即可回到CommandMode博创科技嵌入互动©2006博创科技vi的模式LastMode(末行模式)在CommandLine按下:即可进入该模式用来进行保存文件、打开文档或环境的设定命令有大小写之分博创科技嵌入互动©2006博创科技博创科技嵌入互动©2006博创科技vi的进入和内容输入进入:vi文件名输入文件内容(进入插入模式)新增(append)a从光标所在位置后面开始新增内容A从光标所在行最后面的地方开始新增内容。插入(insert)i从光标所在位置前面开始插入内容I从光标所在行的第一个非空白字符前面开始插入资料。开始(open)o在光标所在行下新增一行并进入输入模式。O在光标所在行上新增一行并进入输入模式。(命令模式)博创科技嵌入互动©2006博创科技命令模式1、光标的移动h左移一个字符l右移一个字符j下移一行k上移一行w,W跳至后一个字的开头(W忽略标点)b,B跳至前一个字的开头(B忽略标点)e移动到后一个字的末尾^至本行第一个非空字符$至行尾0至行首H移动到当前窗口的第一列M移动到当前窗口的中间列L移动到视窗的最后一列)光标所在位置到下个句子的第一个字母(光标所在位置到该句子的第一个字母}光标所在位置到该段落的最后一个字母{光标所在位置到该段落的第一个字母博创科技嵌入互动©2006博创科技命令模式1、光标的移动(续)nH将光标移到屏幕的第n行nL将光标移到屏幕的倒数第n行CTRL-d向下半页CTRL-f向下一页CTRL-u向上半页CTRL-b向上一页n-减号移动到上一行的第一个非空白字符,前面加上数字可以指定移动到以上n行n+加号移动到下一行的第一个非空白字符,前面加上数字可以指定移动到以下n行博创科技嵌入互动©2006博创科技命令模式2、删除x删除光标所在字符X删除光标前面的字符s删除光标所在字符,并进入输入模式S删除光标所在的行,并进入输入模式dd删除光标所在的行D从光标位置开始删除到行尾d与光标移动命令的组合博创科技嵌入互动©2006博创科技命令模式3、修改r修改光标所在字符,r后接着要修改的字符。如,rc可以用字符“c”替换光标所指向的当前字符R进入替换状态,新增内容会覆盖原先内容,直到按[ESC]回到命令模式下为止cc修改光标所在行C修改从光标位置到该行末尾的内容c与光标移动命令的组合博创科技嵌入互动©2006博创科技命令模式4、复制和移动yy复制当前行到内存缓冲区nyy复制n行内容到内存缓冲区y与光标移动的组合p将缓冲区的内容粘贴到光标的后面P将缓冲区的内容粘贴到光标的前面另:在末行模式下实现移动:n1,n2mn3:把n1到n2行内容搬到第n3行后博创科技嵌入互动©2006博创科技5、搜索字符串/pattern移至下一个包含pattern的行?pattern移至上一个包含pattern的行/往下重复查找?往上重复查找n在同一方向重复查找N在相反方向重复查找/pattern/+n移至下一个pattern所在行后的第n行?pattern?-n移至上一个Pattern所在行前的第n行6、其他u撤销前一条命令的结果*.$^[]{}\/包含在查找字符串中,要用转义字符(\)命令模式博创科技嵌入互动©2006博创科技末行模式1、文件的保存和退出:w保存:q退出:w!强制保存:q!强制退出:wq保存退出:wq!强制保存退出博创科技嵌入互动©2006博创科技末行模式2、字符串的替换:s/str1/str2/用字符串str2替换行中首次出现的字符串str1:s/str1/str2/g用字符串str2替换行中所有出现的字符串str1:.,$s/str1/str2/g用字符串str2替换正文当前行到末尾所有出现的字符串str1:1,$s/str1/str2/g用字符串str2替换正文中所有出现的字符串str1:g/str1/s//str2/g功能同上博创科技嵌入互动©2006博创科技末行模式其他::n将光标移到第n行编辑多个文件vifile1file2…:n编辑下一个文件:efilename编辑指定文件博创科技嵌入互动©2006博创科技Linux下函数库(1/3)一个“程序函数库”就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。可分为两种类型:静态函数库(staticlibraries):是一个普通的目标文件的集合,一般用“.a”作为文件的后缀。静态函数库和共享函数库相比有很多的缺点,占用内存空间多。但使用ELF格式的静态库函数生成的代码可以比使用共享函数库的程序运行速度上快一些。可以用ar这个程序来创建一个静态函数库文件,或者往一个已经存在地静态函数库文件添加新的目标代码。例如,把file1.o和file2.o加入到my_library.a这个函数库文件:arrcsmy_library.afile1.ofile2.o然后运行ranlib,以给库加入一些索引信息博创科技嵌入互动©2006博创科技Linux下函数库(2/3)共享函数库(sharedlibraries):当一个可执行程序在启动的时候被加载的函数。每个共享函数库都有个特殊的名字,称作“soname”。soname名字命名必须以“lib”作为前缀,然后是函数库的名字,然后是“.so”,最后是版本号信息。优点:多进程使用同一函数库;修改函数库不需重新连编。安装一个新版本的函数库的时候,要先将这些函数库文件拷贝到一些特定的目录中,运行ldconfig就可以。ldconfig检查已经存在的库文件,然后创建soname的符号链接到真正的函数库,同时设置/etc/ld.so.cache这个缓冲文件。例如,创建两个目标文件(a.o和b.o),然后创建一个包含a.o和b.o的共享函数库。gcc-fPIC-g-c-Walla.cgcc-fPIC-g-c-Wallb.cgcc-shared-Wl,-soname,liblusterstuff.so.1-oliblusterstuff.so.1.0.1a.ob.o–lc注:”-fPIC”是位置无关参数,”-g”和“-Wall”参数不是必须的。博创科技嵌入互动©2006博创科技Linux下函数库(3/3)函数库和头文件的保存位置a.函数库/lib:系统必备共享函数库/usr/lib:标准共享函数库和静态函数库/usr/i486-linux-libc5/lib:libc5兼容性函数库/usr/X11R6/lib:X11R6的函数库/usr/local/lib:本地函数库b.头文件/usr/include:系统头文件/usr/local/include:本地头文件c.共享函数库的相关配置和命令/etc/ld.so.conf:包含共享库的搜索位置ldconfig:共享库管理工具,一般在更新了共享库之后要运行该命令ldd:可查看可执行文件所使用的共享函数库博创科技嵌入互动©2006博创科技使用GNUcc开发应