⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000009.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 5 页
字号:
清单&nbsp;13-4&nbsp;&nbsp;一个有错误的&nbsp;C&nbsp;源程序&nbsp;test.c&nbsp;<BR>―――――――――――――――――――――――――――――――――――――――&nbsp;<BR>#include&nbsp;&lt;stdio.h&gt;&nbsp;<BR>#include&nbsp;&lt;stdlib.h&gt;&nbsp;<BR>&nbsp;<BR>static&nbsp;char&nbsp;buff&nbsp;[256];&nbsp;<BR>static&nbsp;char*&nbsp;string;&nbsp;<BR>int&nbsp;main&nbsp;()&nbsp;<BR>{&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;Please&nbsp;input&nbsp;a&nbsp;string:&nbsp;&quot;);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;gets&nbsp;(string);&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;\nYour&nbsp;string&nbsp;is:&nbsp;%s\n&quot;,&nbsp;string);&nbsp;<BR>}&nbsp;<BR>―――――――――――――――――――――――――――――――――――――――&nbsp;<BR>上面这个程序非常简单,其目的是接受用户的输入,然后将用户的输入打印出来。该&nbsp;<BR>程序使用了一个未经过初始化的字符串地址&nbsp;string,因此,编译并运行之后,将出现&nbsp;&nbsp;<BR>Segment&nbsp;Fault&nbsp;错误:&nbsp;<BR>[WeiYM@versa&nbsp;gcc]$&nbsp;gcc&nbsp;-o&nbsp;test&nbsp;-g&nbsp;test.c&nbsp;<BR>[WeiYM@versa&nbsp;gcc]$&nbsp;./test&nbsp;<BR>Please&nbsp;input&nbsp;a&nbsp;string:&nbsp;asfd&nbsp;<BR>Segmentation&nbsp;fault&nbsp;(core&nbsp;dumped)&nbsp;<BR>为了查找该程序中出现的问题,我们利用&nbsp;gdb,并按如下的步骤进行:&nbsp;<BR>1.运行&nbsp;gdb&nbsp;test&nbsp;命令,装入&nbsp;test&nbsp;可执行文件;&nbsp;<BR>2.执行装入的&nbsp;test&nbsp;命令:&nbsp;<BR>(gdb)&nbsp;run&nbsp;<BR>Starting&nbsp;program:&nbsp;/home/WeiYM/projects/study/gcc/test&nbsp;<BR>Please&nbsp;input&nbsp;a&nbsp;string:&nbsp;abcd&nbsp;<BR>&nbsp;<BR>Program&nbsp;received&nbsp;signal&nbsp;SIGSEGV,&nbsp;Segmentation&nbsp;fault.&nbsp;<BR>0x4006a7da&nbsp;in&nbsp;_IO_gets&nbsp;(buf=0x0)&nbsp;at&nbsp;iogets.c:55&nbsp;<BR>iogets.c:55:&nbsp;No&nbsp;such&nbsp;file&nbsp;or&nbsp;directory.&nbsp;<BR>3.使用&nbsp;where&nbsp;命令查看程序出错的地方:&nbsp;<BR>&nbsp;(gdb)&nbsp;where&nbsp;<BR>#0&nbsp;&nbsp;0x4006a7da&nbsp;in&nbsp;_IO_gets&nbsp;(buf=0x0)&nbsp;at&nbsp;iogets.c:55&nbsp;<BR>#1&nbsp;&nbsp;0x8048413&nbsp;in&nbsp;main&nbsp;()&nbsp;at&nbsp;test.c:11&nbsp;<BR>#2&nbsp;&nbsp;0x40030cb3&nbsp;in&nbsp;__libc_start_main&nbsp;(main=0x80483f8&nbsp;&lt;main&gt;,&nbsp;argc=1,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;argv=0xbffffca4,&nbsp;init=0x80482bc&nbsp;&lt;_init&gt;,&nbsp;fini=0x804845c&nbsp;&lt;_fini&gt;,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;rtld_fini=0x4000a350&nbsp;&lt;_dl_fini&gt;,&nbsp;stack_end=0xbffffc9c)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;../sysdeps/generic/libc-start.c:78&nbsp;<BR>where&nbsp;命令的输出显示了函数的调用顺序,最近一次函数调用,即&nbsp;#0&nbsp;调用是&nbsp;C&nbsp;库&nbsp;<BR>函数&nbsp;gets。该函数从&nbsp;test.c&nbsp;的第&nbsp;11&nbsp;行处调用(main&nbsp;函数)。&nbsp;<BR>4.利用&nbsp;list&nbsp;命令查看调用&nbsp;gets&nbsp;函数附近的代码:&nbsp;<BR>(gdb)&nbsp;list&nbsp;test.c:11&nbsp;<BR>6&nbsp;<BR>7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;main&nbsp;()&nbsp;<BR>8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<BR>9&nbsp;<BR>10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;Please&nbsp;input&nbsp;a&nbsp;string:&nbsp;&quot;);&nbsp;<BR>11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gets&nbsp;(string);&nbsp;<BR>12&nbsp;<BR>13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(&quot;\nYour&nbsp;string&nbsp;is:&nbsp;%s\n&quot;,&nbsp;string);&nbsp;<BR>14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>15&nbsp;<BR>5.唯一能够导致&nbsp;gets&nbsp;函数出错的因素就是变量&nbsp;string。用&nbsp;print&nbsp;命令查看&nbsp;string&nbsp;&nbsp;<BR>的值:&nbsp;<BR>(gdb)&nbsp;print&nbsp;string&nbsp;<BR>$1&nbsp;=&nbsp;0x0&nbsp;<BR>显然,为&nbsp;gets&nbsp;函数传递了一个空指针,这就是程序的错误所在。这是因为&nbsp;string&nbsp;是&nbsp;<BR>一个全局变量,运行时初始化为&nbsp;0,即空指针。&nbsp;<BR>6.在&nbsp;gdb&nbsp;中,我们可以直接修改变量的值,只要将&nbsp;string&nbsp;取一个合法的指针值就&nbsp;<BR>可以了,为此,我们在第&nbsp;11&nbsp;行处设置断点:&nbsp;<BR>(gdb)&nbsp;break&nbsp;11&nbsp;<BR>Breakpoint&nbsp;1&nbsp;at&nbsp;0x8048408:&nbsp;file&nbsp;test.c,&nbsp;line&nbsp;11.&nbsp;<BR>(gdb)&nbsp;run&nbsp;<BR>The&nbsp;program&nbsp;being&nbsp;debugged&nbsp;has&nbsp;been&nbsp;started&nbsp;already.&nbsp;<BR>Start&nbsp;it&nbsp;from&nbsp;the&nbsp;beginning?&nbsp;(y&nbsp;or&nbsp;n)&nbsp;y&nbsp;<BR>Starting&nbsp;program:&nbsp;/home/WeiYM/projects/study/gcc/test&nbsp;<BR>&nbsp;<BR>Breakpoint&nbsp;1,&nbsp;main&nbsp;()&nbsp;at&nbsp;test.c:11&nbsp;<BR>11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gets&nbsp;(string);&nbsp;<BR>7.程序重新运行到第&nbsp;11&nbsp;行处停止,这时,我们可以用&nbsp;set&nbsp;variable&nbsp;命令修改&nbsp;string&nbsp;&nbsp;<BR>的取值:&nbsp;<BR>(gdb)&nbsp;set&nbsp;var&nbsp;string=buff&nbsp;<BR>8.然后继续运行,将看到正确的程序运行结果:&nbsp;<BR>(gdb)&nbsp;cont&nbsp;<BR>Continuing.&nbsp;<BR>Please&nbsp;input&nbsp;a&nbsp;string:&nbsp;abcd&nbsp;<BR>&nbsp;<BR>Your&nbsp;string&nbsp;is:&nbsp;abcd&nbsp;<BR>&nbsp;<BR>Program&nbsp;exited&nbsp;with&nbsp;code&nbsp;026.&nbsp;<BR>上面的例子足以说明&nbsp;gdb&nbsp;的一般使用方法,当然,gdb&nbsp;的命令很多,还可用来调试&nbsp;<BR>多线程程序。这些命令的使用,需要读者在实践中学习并掌握。&nbsp;<BR>13.3.5&nbsp;&nbsp;版本控制工具&nbsp;<BR>在小型软件的开发过程中,利用&nbsp;make&nbsp;工具可自动完成一些编译工作。如果涉及到的&nbsp;<BR>开发人员不多,代码的维护是简单的。人们通常利用备份和强制性的代码注释来维护源程&nbsp;<BR>序的修改。但在大型项目中,开发人员和代码规模非常大的情况下,就有必要采用专门的&nbsp;<BR>版本控制软件来维护代码的修订。在&nbsp;Microsoft&nbsp;的开发工具中,有一个称为&nbsp;SourceSafe&nbsp;的&nbsp;<BR>软件,专门用来进行版本控制,在&nbsp;PowerBuilder&nbsp;这样的大型开发工具中,也通常有内置&nbsp;<BR>的版本控制系统。在&nbsp;Linux&nbsp;上,通常使用的版本控制系统叫&nbsp;RCS,即&nbsp;Revision&nbsp;Control&nbsp;&nbsp;<BR>System(修订控制系统)。&nbsp;<BR>利用版本控制系统,开发人员能够在需要时恢复某个文件的特定版本或修订。在使用&nbsp;<BR>版本控制系统时,开发人员对一个文件的修改工作按如下的步骤进行:&nbsp;<BR>1.当开发人员有一个初始的源文件版本时,将该文件归档到版本控制系统中。&nbsp;<BR>2.当开发人员需要对某个文件进行修改时,首先要获得当前版本的一个拷贝。在某&nbsp;<BR>个开发人员获得该文件的一个拷贝时,版本控制系统将确保其他人不能获得该文件。&nbsp;<BR>3.当修改完源文件,并经过测试之后,开发人员将该文件保存为一个新的版本。&nbsp;<BR>4.其后需要修改该文件时,将始终在该文件的最新版本的基础上进行修改。&nbsp;<BR>为此,RCS&nbsp;提供了许多工具帮助维护源代码的修订,主要的工具见表&nbsp;13-5。&nbsp;<BR>表&nbsp;13-5&nbsp;&nbsp;RCS&nbsp;的主要工具&nbsp;<BR>工具名称&nbsp;<BR>功能&nbsp;<BR>ci&nbsp;<BR>建立某个文件的新修订或将某个工作文件添加到&nbsp;RCS&nbsp;文件中。&nbsp;<BR>co&nbsp;<BR>为只读目的获取某个文件的一个工作版本。(co&nbsp;-l&nbsp;可提供一个工作文件并锁定原有&nbsp;<BR>的文件,这样就可以修改工作文件。)&nbsp;<BR>ident&nbsp;<BR>在文件中搜索标识符。&nbsp;<BR>merge&nbsp;<BR>将两个文件合并成为第三个文件。&nbsp;<BR>rcsdiff&nbsp;<BR>就工作文件和&nbsp;RCS&nbsp;维护的文件进行比较。&nbsp;<BR>rcsmerge&nbsp;<BR>合并某个文件的不同版本。&nbsp;<BR>rlog&nbsp;<BR>查看某个文件的修改日志。&nbsp;<BR>&nbsp;<BR>限于篇幅不能详细讲解&nbsp;RCS&nbsp;的使用,详细信息可参阅&nbsp;rcsintro(1)手册页以及相&nbsp;<BR>关帮助信息。&nbsp;<BR>13.3.6&nbsp;&nbsp;Perl&nbsp;简介&nbsp;<BR>Linux&nbsp;为开发人员提供了广阔的活动舞台。开发人员不仅能够利用&nbsp;C/C++、Fortran、&nbsp;<BR>Pacal、Lisp&nbsp;等多种编程语言编写程序,而且能够使用各种脚本语言编写程序,其中包括&nbsp;&nbsp;<BR>Shell&nbsp;脚本、Perl&nbsp;脚本、Tcl/Tk&nbsp;脚本等。通常说来,脚本语言就是一种编程语言,但它&nbsp;<BR>更加贴近自然语言,具有简单、方便的特点,并且在某些方面,比起传统的编程语言来说&nbsp;<BR>更加有优势。&nbsp;<BR>本小节将简单描述在&nbsp;Linux&nbsp;中广为使用的脚本语言&nbsp;Perl。Perl,即&nbsp;Practical&nbsp;&nbsp;<BR>Extraction&nbsp;Report&nbsp;Language(实用析取报表语言),由&nbsp;Larry&nbsp;Wall&nbsp;创立,可用来从文&nbsp;<BR>本文件中析取信息,并利用这些信息建立报表。由于&nbsp;Perl&nbsp;和&nbsp;Linux&nbsp;一样,也是自由软&nbsp;<BR>件,因此,Perl&nbsp;在各种计算机系统中广为流传。各种&nbsp;Linux&nbsp;商业发行版本中均包含有&nbsp;&nbsp;<BR>Perl。&nbsp;<BR>13.3.6.1&nbsp;&nbsp;Perl&nbsp;脚本的执行&nbsp;<BR>和传统的编译语言不同,Perl&nbsp;脚本一般是一些文本文件,由&nbsp;perl&nbsp;程序解释并执行&nbsp;&nbsp;<BR>Perl&nbsp;脚本。例如,下面是一个简单的&nbsp;Perl&nbsp;脚本:&nbsp;<BR>#!/usr/bin/perl&nbsp;<BR>#&nbsp;This&nbsp;is&nbsp;a&nbsp;comment.&nbsp;<BR>print&nbsp;&quot;Hello,&nbsp;World!\n&quot;&nbsp;<BR>该脚本的第一行利用&nbsp;#!&nbsp;指定了脚本的解释程序为&nbsp;/usr/bin/perl,第二行是一个注&nbsp;<BR>释行,第三行打印“Hello,&nbsp;World!”。&nbsp;<BR>执行该脚本之前,首先要将脚本文件设置为可执行模式。如果脚本名称为&nbsp;hello.pl&nbsp;<BR>(.pl&nbsp;一般是&nbsp;Perl&nbsp;脚本的后缀名),则使用如下的命令:&nbsp;<BR>$&nbsp;chmod&nbsp;+x&nbsp;hellol.pl&nbsp;<BR>然后可在命令行直接执行&nbsp;hello.pl:&nbsp;<BR>$&nbsp;./hello.pl&nbsp;<BR>实际上,Linux&nbsp;将按如下命令执行脚本:&nbsp;<BR>/usr/bin/perl&nbsp;./hello.pl&nbsp;<BR>13.3.6.2&nbsp;&nbsp;Perl&nbsp;的基本语法&nbsp;<BR>Perl&nbsp;包含有与其他语言一样的共同特色:&nbsp;<BR>?&nbsp;用来保存不同类型数据的变量。&nbsp;<BR>?&nbsp;利用运算符将变量组合而成的表达式。&nbsp;<BR>?&nbsp;执行动作的表达式。&nbsp;<BR>?&nbsp;可控制语句执行路线的流控制语句。&nbsp;<BR>?&nbsp;划分功能,提供可重用性的函数(子例程或例程)。&nbsp;<BR>Perl&nbsp;程序的书写形式是自由的,和&nbsp;C&nbsp;类似,每个&nbsp;Perl&nbsp;语句以分号(;)结束,#&nbsp;代&nbsp;<BR>表一个注释行,Perl&nbsp;也用与&nbsp;C&nbsp;一样的大括号({...})来定义语句组。&nbsp;<BR>下面的小节讲述&nbsp;Perl&nbsp;变量、运算符和表达式、语句、流控制以及其他的特性。&nbsp;<BR>13.3.6.3&nbsp;&nbsp;变量&nbsp;<BR>在&nbsp;Perl&nbsp;程序中,不必显示定义变量,所有的变量以&nbsp;@、$&nbsp;或&nbsp;%&nbsp;打头,分别代表了&nbsp;Perl&nbsp;&nbsp;<BR>的三种变量类型。&nbsp;<BR>?&nbsp;标量型变量(Scalar&nbsp;Variable)。标量型变量定义了基本的数据类型,包括整&nbsp;<BR>数、浮点数和字符串。标量型变量由&nbsp;$&nbsp;字符开头:&nbsp;<BR>$title&nbsp;=&nbsp;&quot;Linux&nbsp;And&nbsp;Windows&nbsp;NT&quot;;&nbsp;<BR>$count&nbsp;=&nbsp;10;&nbsp;<BR>?&nbsp;数组型变量(Array&nbsp;Variable)。数组型变量是标量型变量的集合,数组型变量&nbsp;<BR>的前缀是&nbsp;@,如下所示:&nbsp;<BR>@commands&nbsp;=&nbsp;(&quot;ls&quot;,&nbsp;&quot;dir&quot;,&nbsp;&quot;cd&quot;,&nbsp;&quot;rm&quot;,&nbsp;&quot;mv&quot;);&nbsp;<BR>@length&nbsp;=&nbsp;(2,&nbsp;3,&nbsp;2,&nbsp;2,&nbsp;2);&nbsp;<BR>可通过类似&nbsp;C&nbsp;语言的下标方法访问数组中的元素

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -