﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-远风工作室-随笔分类-Linux编程</title><link>http://www.cppblog.com/amazon/category/11064.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 30 Sep 2011 09:10:47 GMT</lastBuildDate><pubDate>Fri, 30 Sep 2011 09:10:47 GMT</pubDate><ttl>60</ttl><item><title>Shell脚本基本内容</title><link>http://www.cppblog.com/amazon/archive/2010/03/11/109440.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Thu, 11 Mar 2010 09:01:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2010/03/11/109440.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/109440.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2010/03/11/109440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/109440.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/109440.html</trackback:ping><description><![CDATA[<p>#!/bin/bash<br>#脚本用途：<br>#创建日期：<br>#Written by someone<br>正文......<br><br>在shell中，所有没有声明的变量都默认是呈现字符串形式，所以var=5*7;$var就成为字符串形式"5*7"，而不会进行任何算术运算。声明变量使用declare指令。<br>delcare [-afirx] var=...<br>-a&nbsp;定义为数组<br>-f&nbsp;定义为函数<br>-i&nbsp;定义为整数<br>-r&nbsp;定义为只读&nbsp;<br>-x&nbsp;定义为通过环境输出变量<br><br>read name<br>read的功能是将用户在键盘上输入的内容放到变量name中。<br>read name &lt; file的形式通过重定向改变了输入源为file。<br><br>脚本的参数代号：<br>$0&nbsp;脚本的文件名<br>$1&nbsp;第一个附加参数<br>$2&nbsp;第二个附加参数<br>$3&nbsp;......<br>$# 传递给脚本的参数个数<br>$@ 传递给脚本的所有参数<br>$$ 脚本的进程号，通常用它来生成唯一的临时文件：/tmp/tmpfile_$$<br><br>逻辑判断式：<br><br>关于文件与目录的逻辑判断，格式是-&#215;&#215; file或者! -&#215;&#215; file（注意!和-xx和file之间有空格）<br>-f&nbsp;检测文件是否存在<br>-d&nbsp;将测目录是否存在<br>-b&nbsp;检测是否为block文件<br>-c&nbsp;检测是否为character文件<br>-L&nbsp;检测是否为符号链接文件<br>-S&nbsp;检测是否为socket标签文件<br>-e&nbsp;检测某个东西是否存在，可以是任何东西<br><br>关于程序的逻辑判断，格式是-&#215;&#215; proc<br>-G&nbsp;检测是否由GID所执行的程序拥有<br>-O&nbsp;检测是否由UID所执行的程序拥有<br><br>关于文件的属性检测，格式是-&#215;&#215; file<br>-r&nbsp;检测是否为可读属性<br>-w&nbsp;检测是否为可写属性<br>-x&nbsp;检测是否为可执行属性<br>-s&nbsp;检测是否为非空白文件<br>-u&nbsp;检测是否具有SUID属性<br>-g&nbsp;检测是否具有SGID属性<br>-k&nbsp;检测是否具有sticky bit属性<br><br>两个文件的判断与比较，格式是file1 -&#215;&#215; file2<br>-nt&nbsp;第一个文件比第二个文件新<br>-ot&nbsp;第一个文件比第二个文件旧<br>-ef&nbsp;第一个文件和第二个文件为同一个文件（诸如链接文件）<br><br>逻辑与、逻辑或<br>&amp;&amp;&nbsp;逻辑与<br>||&nbsp;逻辑或<br><br>运算符：<br>-eq&nbsp;等于<br>-ne&nbsp;不等于<br>-lt&nbsp;小于<br>-gt&nbsp;大于<br>-le&nbsp;小于或等于<br>-ge&nbsp;大于或等于<br>-a&nbsp;双方都成立（and）<br>-o&nbsp;单方成立（or）<br><br>字符串比较：<br>= 两个字符串相同<br>!= 两个字符串不同<br>-z&nbsp;空字符串<br>-n&nbsp;非空字符串<br><br>条件判断：<br>if [条件判断1] &amp;&amp;/|| [条件判断2]; then<br>&nbsp;&nbsp;&#8230;&#8230;<br>elif [条件判断1] &amp;&amp;/|| [条件判断4]; then<br>&nbsp;&nbsp;&#8230;&#8230;<br>else<br>&nbsp;&nbsp;&#8230;&#8230;<br>fi<br>注意：在[]中，只能有一个判断式；在[]与[]之间，可以使用&amp;&amp;或者||结合判断式；[]中每一个独立的组件之间需要用空格键隔开，这一点尤其要注意，其中组件是指[、]、变量、运算符号和字符串、值等。例如：<br>if [ "$var" = "yes" ]; then<br><br>case var in<br>方式一 | 方式&#215;)<br>&nbsp;&nbsp;程序段<br>&nbsp;&nbsp;;;<br>方式二 | 方式&#215;)<br>&nbsp;&nbsp;程序段<br>&nbsp;&nbsp;;;<br>*)<br>&nbsp;&nbsp;echo "Usage {方式一|方式二}"&nbsp;<br>&nbsp;&nbsp;exit 1<br>esac<br>&nbsp;<br>循环：<br>for((条件1;条件2;条件3))<br>do<br>&nbsp;程序段<br>done<br><br>for var in var_list&nbsp;&nbsp;&nbsp;&nbsp; //var_list是以空格键分开的选择项，多为字符串，例如for var in yes no other或者for var in "yes" "no" "other"<br>do<br>&nbsp;程序段<br>done<br>看下面一段脚本程序，该程序演示了$(command)的用法，for命令的参数来自$()中的命令的结果：<br>for file in $(ls *.sh)<br>do<br>&nbsp;lpr $file<br>done<br><br>while [条件]<br>do<br>&nbsp;程序段<br>done<br><br>until [条件]<br>do&nbsp;<br>&nbsp;程序段<br>done</p>
<p>调试脚本：<br>sh [-nvx] scripts<br>-n&nbsp;不执行脚本，查询脚本内的语法，若有错误则列出<br>-v&nbsp;在执行脚本之前，先将脚本的内容显示在屏幕上<br>-x&nbsp;将用到的脚本内容显示在屏幕上，与-v稍微不同<br><br><strong>注意：<br>1.在条件判断时一般使用"$var"的形式，这是为了防止出现var为空的情况，例如：if [ $var =&nbsp;"yes"&nbsp;]中，如果var为空，那么会出现if [ = "yes"&nbsp;]的情况，这是不合法的，而if [ "$var" =&nbsp;"yes"]则不会出现该问题。<br><br></strong></p>
<img src ="http://www.cppblog.com/amazon/aggbug/109440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2010-03-11 17:01 <a href="http://www.cppblog.com/amazon/archive/2010/03/11/109440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>进程在前台与后台之间切换</title><link>http://www.cppblog.com/amazon/archive/2010/02/01/106948.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Mon, 01 Feb 2010 08:30:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2010/02/01/106948.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/106948.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2010/02/01/106948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/106948.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/106948.html</trackback:ping><description><![CDATA[在前台运行某个命令，终端被该作业占据，而在后台运行作业时，不会占据终端。下面将介绍几种在前台与后台之间切换的方法。<br><br><strong>前台转入后台</strong><br><br>第一种，在要运行的命令后面加上&amp;，命令自动转入后台运行，不占用前台终端。例如运行一个不断打印字符串到标准输出的可执行程序，输入如下：<br>$ vi test.c<br>#include &lt;stdio.h&gt;<br>main()<br>{<br>&nbsp;&nbsp;&nbsp;while(1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("ok \n");<br>}<br>$ gcc -o test test.c<br>$ ./test &amp;<br>此时test程序将转入后台继续执行，并在标准输出即控制台上打印出字符。停止该程序的方法是利用ps命令找到该程序的对应进程号num，然后运行kill num。注意：在控制台中不断出现的打印字符会淹没输入的命令，但是没有任何影响，命令依然可以被正确解析。<br><br>第二种，运行./test后，使用ctrl+z使正在运行的命令./test暂停（ctrl+c是终止），用命令jobs查看想要转入后台的命令编号n，然后运行bg n即可。注意，该命令的最终作用等价于将./test命令后面加上&amp;符号。<br><br>第三种，使用nohup+命令的运行方式，在缺省情况下该命令的所有输出都被重定向到一个名为nohup.out的文件中，除非有指定的重定向文件。例如：<br>nohup command &amp;<br>nohup command &gt;result 2&gt;&amp;1 &amp;<br>而且使用nohup转入后台的命令，在关闭shell后重新登录，该命令依然处于运行状态，但通过ps命令不会显示，而是使用ps x或者ps &#8211;A命令方可显示。<br>注意：如果是执行脚本并重定向输出的话，不应该在脚本内部写，而是写成：<br>nohup ./***.sh &gt;result 2&gt;&amp;1 &amp;<br><br>以上三种方法的特点是：第一、二种方法在退出该shell进程后命令均不存在。第三种方法即使退出shell进程后，命令依然存在，而命令的控制权交给了init。<br><br><strong>后台转入前台</strong><br><br>使用jobs命令查看要转入前台的命令编号n，然后运行fg n即可。fg命令即"front ground"。<br><br>
<img src ="http://www.cppblog.com/amazon/aggbug/106948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2010-02-01 16:30 <a href="http://www.cppblog.com/amazon/archive/2010/02/01/106948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux串口编程</title><link>http://www.cppblog.com/amazon/archive/2010/01/28/106644.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Thu, 28 Jan 2010 08:16:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2010/01/28/106644.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/106644.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2010/01/28/106644.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/106644.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/106644.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.串口操作需要的头文件#include &lt;stdio.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//标准输入输出定义#include &lt;stdlib.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//标准函数库定义#include &lt;unist...&nbsp;&nbsp;<a href='http://www.cppblog.com/amazon/archive/2010/01/28/106644.html'>阅读全文</a><img src ="http://www.cppblog.com/amazon/aggbug/106644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2010-01-28 16:16 <a href="http://www.cppblog.com/amazon/archive/2010/01/28/106644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tar命令的C参数</title><link>http://www.cppblog.com/amazon/archive/2010/01/13/105571.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Wed, 13 Jan 2010 07:10:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2010/01/13/105571.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/105571.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2010/01/13/105571.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/105571.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/105571.html</trackback:ping><description><![CDATA[问题：在/home/usr1目录下，想要打包/home/usr2目录中的文件file2，应该使用什么样的tar命令？<br><br>解答1：<br><span style="COLOR: #000000">$ tar -cvf file2.tar /home/usr2/file2</span><br>tar: Removing leading '/' from members names<br>home/usr2/file2<br>该命令可以将/home/usr2/file2文件打包到当前目录下的file2.tar中，需要注意的是：<span style="COLOR: #ff0000">使用绝对路径标识的源文件，在用tar命令压缩后，文件名连同绝对路径（这里是home/usr2/，根目录'/'被自动去掉了）一并被压缩进来</span>。使用tar命令解压缩后会出现以下情况：<br>$ tar -xvf file2.tar<br>$ ls<br>&#8230;&#8230; &#8230;&#8230; home &#8230;&#8230; &#8230;&#8230; <br>解压缩后的文件名不是想象中的file2，而是home/usr2/file2。<br><br>解答2：<br><strong>$ tar -cvf file2.tar -C&nbsp;/home/usr2 file2<br></strong>该命令中的-C dir参数，将tar的工作目录从当前目录改为/home/usr2，将file2文件（不带绝对路径）压缩到file2.tar中。注意<span style="COLOR: #ff0000">：-C dir参数的作用在于改变工作目录，其有效期为该命令中下一次-C dir参数之前</span>。<br>使用tar的-C dir参数，同样可以做到在当前目录/home/usr1下将文件解压缩到其他目录，例如：<br><strong>$ tar -xvf file2.tar -C /home/usr2</strong><br>而tar不用-C dir参数时是无法做到的：<br>$ tar -xvf file2.tar /home/usr2<br>tar: /tmp/file: Not found in archive<br>tar: Error exit delayed from previous errors<br><br>
<img src ="http://www.cppblog.com/amazon/aggbug/105571.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2010-01-13 15:10 <a href="http://www.cppblog.com/amazon/archive/2010/01/13/105571.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>库文档的开发与使用</title><link>http://www.cppblog.com/amazon/archive/2010/01/12/105471.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Tue, 12 Jan 2010 02:41:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2010/01/12/105471.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/105471.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2010/01/12/105471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/105471.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/105471.html</trackback:ping><description><![CDATA[软件开发者可以使用某种语言的库函数，这些库函数通常放在/lib和/usr/lib目录中，而大多数的库函数放在/usr/lib中，比如标准C库函数文件/usr/lib/libc.a和标准C++库函数/usr/lib/libstdc++.a。<br>库对应的头文件有两种，包括公有头文件和私有头文件。公有头文件声明的资源对其他程序是有效的，而私有头文件声明的资源只能被对应的库代码使用。<span style="COLOR: red">为了使库成为公有的，应将它安装在目录/usr/lib中，并将它的头文件放在/usr/include中，并在用户程序中使用#include &lt;&gt;的方式引入库头文件</span>。将头文件的路径名放置在引号中，就可将私有头文件放入程序中，比如#include "hello.h"，预处理程序会首先在当前目录查找hello.h头文件，如果写成#include "-/include/hello.h"，预处理程序就会在目录~/include中搜索头文件hello.h。<br>库文档必须以.a扩展名结束，一旦为一组目标模块创建了一个库文件，通过制定库文档作为参数，这些模块就可以被C程序根据-l*链接使用。<span style="COLOR: red">对于标准库，例如C中的libc.a，只需要在用户程序中添加相应的头文件比如stdio.h、stdlib.h、ctype.h等，而不需要明确地用-l编译程序选项去链接该库；但还有许多库不是标准库，例如数学库libm.a，除了需要添加相应头文件之外，还必须明确地用编译程序选项-lm链接该库</span>，其中-l编译选项在lib和.a之间指定子串，不明确指定的话会在编译器产生错误。<br>注意：<br>1.标准C语言库libc.a在编译程序的链接阶段自动被链接。<br>2.一些常见的与库相关的编程错误：<br>没有为库加入头文件<br>没有明确链接一个库，而这个库不能被程序自动链接<br>使用了错误版本的库<br>链接了不兼容的库<br><br>------------------------------------------------------------------------------------------------------<br><br><strong>库的开发</strong><br><br>使用ar程序可以执行各种与库相关的任务，比如在库文件中创建、修改和提取模块等。与linux命令不同，ar命令的关键字不需要使用-连字符。<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000"><strong>ar&nbsp;关键字&nbsp;库文档名&nbsp;文件列表<br></strong><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">d&nbsp;&nbsp;&nbsp;&nbsp;在库文档中删除一个文件<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">q&nbsp;&nbsp;&nbsp;&nbsp;在现有库文档中添加一个文件，若库文档不存在，则创建之<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">r&nbsp;&nbsp;&nbsp;&nbsp; 新建一个库文档或覆盖一个现有库文档<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">t&nbsp;&nbsp;&nbsp;&nbsp; 显示一个库文档目录<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">s&nbsp;&nbsp;&nbsp;&nbsp;强制生成库文档符号表<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">x&nbsp;&nbsp;&nbsp;&nbsp; 从一个库文档中提取一个或多个文件，并将它们保存在当前的工作目录中<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">v&nbsp;&nbsp;&nbsp;&nbsp;生成一个详细的输出</span></div>
<p>假设已存在main.c、compute.c、input.c、main.h、compute.h、input.h这些文件，且compute.c使用了数学库libm.a，下面的例子用于库文档的创建和追加等。<br><strong>ar r libmath.a input.o compute.o</strong><br>该命令创建了文件input.o和compute.o的库文档文件libmath.a，如果该库文档已存在则会被覆盖。上述命令当libmath不存在时，可以使用<strong>ar q libmath.a input.o compute.o</strong>代替，该命令在libmath.a中追加新文件，当libmath.a不存在时自动创建；当想将当前目录中所有目标文件都放入库文件中，也可以使用<strong>ar r libmath.a *.o</strong>或者<strong>ar r libmath.a `ls *.o`</strong>这样的命令。<br><strong>gcc main.c libmath.a -o power -lm</strong><br>该命令将库文档中的input.o和compute.o链接到main.o上，使用-lm链接数学库libm.a，因为在compute.o中使用了pow函数。将libmath.a安装到/usr/lib后，就可以通过-lmath的方式使用了。<br><strong>rm compute.o input.o</strong><br>创建目标模块的库文档后，就可以删除原有模块。<br><strong>ar t libmath.a</strong><br>该命令用于显示库文档libmath.a的目录，同理可以使用ar vt libmath.a命令获得更详细的输出。<br><strong>ar d libmath.a input.o</strong><br>该命令用于从库文档libmath.a中删除一个或多个目标模块。<br><strong>ar x libmath.a compute.o</strong><br>该命令下哦那个库文档libmath.o中提取一个或多个目标模块，并放在当前目录中。<br><br>在makefile中也可以使用ar命令，这样创建了软件的可执行文件之后，也可以创建目标文档的库文档，具体方法如下：<br>CC=gcc<br>OPTIONS=-03<br>OBJECTS=main.o input.o compute.o<br>SOURCES=main.c input.c compute.c<br>HEADERS=main.h input.h compute.h<br>ARCHIVE=compute.o input.o<br>LIBRARY=libmath.a<br>AR_KEYS=qv<br>complete : power<br>&nbsp;&nbsp;&nbsp; @echo "Build complete"<br>power : $(OBJECTS)<br>&nbsp;&nbsp;&nbsp; $(CC) $(OPTIONS) -o $@ $^ -lm<br>&nbsp;&nbsp;&nbsp; @echo "The executable is in the 'power' file"<br>main.o : main.h input.h compute.h<br>compute.o : compute.h<br>input.o : input.h<br><span style="COLOR: red">buldle : <br>&nbsp;&nbsp;&nbsp; @echo "Archiving object modules..."<br>&nbsp;&nbsp;&nbsp; ar $(AR_KEYS) $(LIBRARY) $(ARCHIVE)<br>&nbsp;&nbsp;&nbsp; @echo "Archiving is complete."<br></span>power.tar : makefile $(HEADERS) $(SOURCES)<br>&nbsp;&nbsp;&nbsp; tar -cvf $@ $^<br>clean :<br>&nbsp;&nbsp;&nbsp; rm -f *.o<br><br>---------------------------------------------------------------------------------------------<br><br><strong>库的使用</strong><br><br><span style="COLOR: red">在安装库文档之前，需要给库文档生成和添加一个目录索引</span>。库文档中的目标文件不是以任意顺序排列的，而是依赖于模块被插入到库文档中的顺序。带有目录的库文档在链接阶段是必要的，它允许库文档中的函数互相调用，而无论这些函数在库文档中的位置如何。<br><strong>ranlib 库文档列表</strong><br>该命令可以为库文档列表中的每个库文档生成和添加一个目录，该命令与如下命令相同：<br><strong>ar s 库文档<br></strong><br>一旦添加了目录之后，就可以安装该库使其成为公有，主要采取两个步骤：<br>1.创建库的头文件并把它放在/usr/include目录中，头文件包含库中资源的声明。一个库文档可以对应多个头文件，例如libmath.a可以对应input.h和compute.h。<br>2.在/usr/lib目录中放置该库文档，例如/usr/lib/libmath.a。<br>3.在使用该库时，在程序中加入对应头文件，并用带有-lmath的编译命令即可。<br><br>可以用nm命令显示一个库、目标或可执行文件的符号表，表中包括名称、类型、大小和进入点等信息。它的输出告知该库的属性，输出的每一行是每一个标识符，例如文件中的某个函数名或者变量名。nm命令显示的信息用于调试库和可执行文件，对于库文档中的每个文件或成员，nm命令至少会将下面的信息发送到标准输出：每个符号的地址、符号的值以及其类型。根据选项，也可能输出库或目标的名称以及符号的大小等。</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><strong><span style="COLOR: #000000">nm&nbsp;</span><span style="COLOR: #800000; FONT-WEIGHT: bold">[</span><span style="COLOR: #800000">选项</span><span style="COLOR: #800000; FONT-WEIGHT: bold">]</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000; FONT-WEIGHT: bold">[</span><span style="COLOR: #800000">文件列表(库文件/目标文件/可执行文件)</span><span style="COLOR: #800000; FONT-WEIGHT: bold">]</span></strong><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-D&nbsp;&nbsp;&nbsp;&nbsp;只显示动态符号，当使用动态库时很有用<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-V&nbsp;&nbsp;&nbsp;&nbsp;nm命令版本号<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-g&nbsp;&nbsp;&nbsp;&nbsp;只显示全局符号的相关信息<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-l&nbsp;&nbsp;&nbsp;&nbsp; 为每一个符号查找和显示文件名和行号<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-n&nbsp;&nbsp;&nbsp;&nbsp;用地址给外部符号分类<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-u&nbsp;&nbsp;&nbsp;&nbsp;只显示未定义的符号，即每个目标模块的外部符号<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-w&nbsp;&nbsp;&nbsp;给出更多警告信息<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-f&nbsp;格式&nbsp;&nbsp;&nbsp;&nbsp;以不同格式输出，可以是bsd、sysv、posix等，默认是bsd</span></div>
<p>对nm命令，以后再进行详细学习，在此省略。<br><br><br><br></p>
<img src ="http://www.cppblog.com/amazon/aggbug/105471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2010-01-12 10:41 <a href="http://www.cppblog.com/amazon/archive/2010/01/12/105471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>makefile和make规则</title><link>http://www.cppblog.com/amazon/archive/2010/01/10/105358.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Sun, 10 Jan 2010 12:46:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2010/01/10/105358.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/105358.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2010/01/10/105358.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/105358.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/105358.html</trackback:ping><description><![CDATA[<p>首先介绍make实用程序的语法和常用选项，然后细剖makefile文件的组成。<br><br><strong>make命令</strong><br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">make&nbsp;</span><span style="COLOR: #800000; FONT-WEIGHT: bold">[</span><span style="COLOR: #800000">选项</span><span style="COLOR: #800000; FONT-WEIGHT: bold">]</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000; FONT-WEIGHT: bold">[</span><span style="COLOR: #800000">目标</span><span style="COLOR: #800000; FONT-WEIGHT: bold">]</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000; FONT-WEIGHT: bold">[</span><span style="COLOR: #800000">宏定义</span><span style="COLOR: #800000; FONT-WEIGHT: bold">]</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">通过命令行参数中的target，可指定make要编译的目标，并且允许同时定义编译多个目标，操作时按照从左向右的顺序依次编译target选项中指定的目标文件。如果命令行中没有指定目标，则系统默认target指向描述文件中第一个目标文件。<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-d&nbsp;&nbsp;&nbsp;&nbsp;显示调试信息<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-n&nbsp;&nbsp;&nbsp;&nbsp;不运行任何makefile文件，只打印需要执行的命令<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-p&nbsp;&nbsp;&nbsp;&nbsp;输出所有宏定义和目标文件描述<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-s&nbsp;&nbsp;&nbsp;&nbsp;静止状态下运行，不显示任何命令行信息<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-f&nbsp;file&nbsp;&nbsp;&nbsp;&nbsp;通知make程序从file中读取内部依赖说明，缺省情况下会读取makefile或者Makefile文件处理，文件名-表示读取标准输入，在Linux中，GNU&nbsp;make工具在当前工作目录中按照GNUmakefile、makefile、Makefile的顺序搜索makefile文件<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p><span style="COLOR: #ff0000"><span style="COLOR: #000000">注意：在源文件没有被修改的情况下，运行make命令会生成一条消息，说源文件的可执行文件是最新的，不需要用make命令重新编译和链接。要强制再创建可执行代码，需要改变源文件的上次更新时间，可以使用touch命令，然后再次运行make命令。</span></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">touch&nbsp;</span><span style="COLOR: #800000; FONT-WEIGHT: bold">[</span><span style="COLOR: #800000">选项</span><span style="COLOR: #800000; FONT-WEIGHT: bold">]</span><span style="COLOR: #000000">&nbsp;文件或目录<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-r&nbsp;文件或目录&nbsp;&nbsp;把指定文件或目录的日期时间，设成和参考文件或目录的日期时间相同<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-d&nbsp;日期时间&nbsp;&nbsp;&nbsp;&nbsp; 使用指定的日期时间，而非现在的时间&nbsp;</span></div>
</span>
<p><br><strong>makefile规则</strong><br><br>make程序基于文件之间的依赖性，需要建立的目标文件，以及建立目标文件时要执行的命令，以上所有被称为规则，存放在文件makefile中。定制规则的语法如下：<br><strong>目标列表 : 关联性列表<br>&lt;TAB&gt;命令列表<br></strong><span style="COLOR: #000000">注意：<br>1.可以在关联性列表和命令列表中使用shell文件名模式匹配字符，例如?、*、[]等等。<br><span style="COLOR: red">2.如果目标的命令列表中某个命令前面带有@，那么当make程序执行时，该命令是不会有反应的，在程序运行完毕之后，所有前面带@的命令按照反序执行。可以通过执行make -n命令显示这些命令以供查看。<br>3.如果目标的命令列表中某个命令前面带有-，说明如果该命令执行有误，会跳过该命令并继续执行。</span><br></span><br>make程序使用makefile中的规则决定程序中需要重新编译的文件，并再次链接生成可执行代码。如果源文件上修改的时间戳比目标文件上的时间戳更新，那么make重新编译build中包含的源文件。例如，如果修改了一个.h头文件，make程序就会重新编译所有包含该头文件的源文件，前提是头文件在这些源文件的目标文件的关联性列表中；再如某.c源文件被修改，那么该源文件被重新编译，生成对应的新的目标文件。<br>myprog : foo.o bar.o<br>&nbsp;&nbsp;&nbsp; gcc &#8211;o myprog foo.o bar.o<br>foo.o : foo.c foo.h bar.h<br>&nbsp;&nbsp;&nbsp; gcc &#8211;o foo.o &#8211;c foo.c<br>bar.o : bar.c bar.h<br>&nbsp;&nbsp;&nbsp; gcc &#8211;o bar.o &#8211;c bar.c<br>上述规则中，只要目标文件比冒号后面的文件任何一个旧，将会执行下一行的命令；但是在检查foo.o和bar.o的时间之前，会往下查找那些把foo.o和bar.o作为目标文件的规则；以此类推，并最终回到myprog规则。<br>如何得到每个C文件的输出规则呢？可使用-M和-MM编译选项。注意：使用-M和-MM编译选项时，仅在shell中输出规则信息，不能用于产生可执行文件，即不能写成gcc -o hello -M hello.c这样的形式。<br><strong>gcc &#8211;M hello.c</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出hello.c和该文件中所有&lt;&gt;和&#8221;&#8221;包含的头文件<br><strong>gcc &#8211;MM hello.c</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //仅输出hello.c和该文件中所有&#8221;&#8221;包含的头文件<br><br><strong>后缀（隐含）规则</strong><br><br>make -p命令显示了所有后缀规则列表。为了建立一个目标，make使用程序会遍历一连串的依赖关系，从而决定从何处开始建立。如果没有找到目标文件，make程序按照优先顺序查找源文件，首先查找.c、.f或.s后缀的文件，然后再查找SCCS（带.c~后缀）文件，如果没有找到任何一个源文件，make程序就会报告一个异常。<br>make程序知道调用gcc -c xxx.c -o xxx.o的预定义命令，而且还知道目标文件通常和源文件是相同的，这种功能称作标准依赖性，所以foo.o : foo.c foo.h bar.h这样的语句可以简写成foo.o : foo.h bar.h。同时，如果把生成foo.o和bar.o的命令从规则中删除，make将自动查找它的隐含规则（gcc -M/MM输出的代码），然后找到一个适当的命令，命令中会使用一些变量，并且按照一定步骤设定。<br>因此，上述makefile的内容可以根据后缀规则简写成：<br>myprog : foo.o bar.o<br>&nbsp;&nbsp;&nbsp; gcc &#8211;o myprog foo.o bar.o<br>foo.o : foo.h bar.h<br>bar.o : bar.h<br><br><strong>宏定义（变量）</strong><br><br>makefile中的变量定义可以存储文件名列表、可执行文件名以及编译器标识等，主要是使用如下方法：<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">VAR</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;变量定义<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">define&nbsp;VAR&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;name<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">endef&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同上<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">$(VAR)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用变量，如果变量名为单字符，可以不使用圆括号或花括号<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">${VAR}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同上<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">$@&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当前目标文件<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">$*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;删除了后缀的目标名<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">$&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;依赖列表中，比当前目标更新的当前依赖名称（即第一个依赖文件）<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">$^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;整个依赖列表<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">$?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;依赖列表中，比当前目标更新的当前依赖列表<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">CFLAGS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通常默认值是-O，但是可以被修改</span></div>
<p>未使用后缀规则的makefile文件变成如下：<br>OBJS=foo.o bar.o<br>SOURCES=foo.c bar.c<br>HEADERS=foo.h bar.h<br>CC=gcc<br>CFLAGS=-Wall -O -g<br>myprog : $(OBJS)<br>&nbsp;&nbsp;&nbsp; $(CC) $^ -o $@<br>foo.o : foo.c foo.h bar.h<br>&nbsp;&nbsp;&nbsp; $(CC) $(CFLAGS) &#8211;c $&lt; -o $@<br>bar.o : bar.c bar.h<br>&nbsp;&nbsp;&nbsp; $(CC) $(CFLAGS) &#8211;c $&lt; -o $@<br>而使用了后缀规则的makefile文件变成如下：<br>OBJS=foo.o bar.o<br>SOURCES=foo.c bar.c<br>HEADERS=foo.h bar.h<br>CC=gcc<br>myprog : $(OBJS)<br>&nbsp;&nbsp;&nbsp; $(CC) S^ -o $@<br>foo.o : foo.h bar.h<br>bar.o : bar.h<br><br><strong>虚目标<br></strong><br>假设一个项目最后需要产生两个可执行文件exec1和exec2，但两个文件是相互独立的，此时可使用假想目的all来达到效果。<br>all : exec1 exec2<br>all文件并不存在，make总是会假设它需要被生成，因此会检查它的依靠文件exec1和exec2是否需要更新，当把它的依靠文件更新后，就会执行它的规则里的命令行，但是在规则里没有哪个命令作用于名为all的实际文件，所以该规则并不真正改变all的状态。<br>注意下面的语句用法，这些语句可以添加到makefile文件后：<br>myprog.tar : makefile $(SOURCES) $(HEADERS)<br>&nbsp;&nbsp;&nbsp; tar -cvf $@ S^<br>clean :<br>&nbsp;&nbsp;&nbsp; rm *.o<br>当make命令不带参数执行时，最后两个目标myprog.tar和clean的命令不会执行，因为这些文件没有依赖文件。将这两个目标作为参数传递给make命令，可以调用与目标关联的命令。例如：执行make myprog.tar命令会执行tar -cvf myprog.tar makefile foo.c bar.c foo.h bar.h语句，而执行make clean命令会执行clean *.o语句。<br><br>下面给出一个较完整的makefile文件：<br>---------------------------------------------------------<br>#Updated makefile that uses some built-in macros and<br><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#35;&#64;&#45;&#112;&#114;&#101;&#99;&#101;&#100;&#101;&#100;">#@-preceded</a> commands<br>define CC<br>&nbsp;&nbsp;&nbsp; gcc<br>endef<br>OPTIONS=-03<br>OBJECTS=main.o input.o compute.o<br>SOURCES=main.c input.c compute.c<br>HEADERS=main.h input.h compute.h<br>complete : power<br>&nbsp;&nbsp;&nbsp; @echo "Build complete"<br>power : $(OBJECTS)<br>&nbsp;&nbsp;&nbsp; $(CC) $(OPTIONS) -o $@ $^ -lm<br>&nbsp;&nbsp;&nbsp; @echo "The executable is in the 'power' file"<br>main.o : main.h input.h compute.h<br>compute.o : compute.h<br>input.o : input.h<br>power.tar : makefile $(HEADERS) $(SOURCES)<br>&nbsp;&nbsp;&nbsp; tar -cvf $@ $^<br>clean :<br>&nbsp;&nbsp;&nbsp; rm -f *.o<br>-----------------------------------------------------<br>执行结果为：<br>-----------------------------------------------------<br>$ make<br>gcc -c main.c -o main.o<br>gcc -c input.c -o input.o<br>gcc -c compute.c -o compute.o<br>gcc -o3 -o power main.o input.o compute.o -lm<br>The executable is in the 'power' file<br>Build complete<br>$ make power.tar<br>tar -cvf power.tar makefile main.h input.h compute.h main.c input.c compute.c<br>makefile<br>main.h<br>input.h<br>compute.h<br>main.c<br>input.c<br>compute.c<br>$ make clean<br>rm -f *.o<br>------------------------------------------------------<br></p>
<img src ="http://www.cppblog.com/amazon/aggbug/105358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2010-01-10 20:46 <a href="http://www.cppblog.com/amazon/archive/2010/01/10/105358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux通配符</title><link>http://www.cppblog.com/amazon/archive/2010/01/07/105105.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Thu, 07 Jan 2010 09:08:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2010/01/07/105105.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/105105.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2010/01/07/105105.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/105105.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/105105.html</trackback:ping><description><![CDATA[<p>在使用shell命令对多个文件对象执行单一操作时，例如删除当前目录下的file1到file8，多次使用相同的命令rm file1到rm file8非常麻烦，通常使用通配符模式解决这个问题：rm file[1-8]。<br>当使用通配符指定一种模式时，该模式与底层系统上的一个或多个文件匹配，shell以空格隔开的所有匹配对象的列表来替换该模式；当模式不能找到匹配对象时，shell将不理会参数、通配符等，保留原样。例如，当ls -d /etc/g*不能找到/etc/g*的任何文件时，就会报错。<br><br>*&nbsp;<br>--------代表任意个字符，但不会匹配以.开始的文件名<br>?&nbsp;<br>--------代表一个字符<br>\&nbsp;<br>--------转义字符，可将通配符或者特殊字符还原成一般字符<br>[abc]<br>--------匹配[]里面的某个字符<br>[a-z]<br>--------匹配a到z之间的某个字符，还能写成[A-Z]、[0-9]、[A-Za-z]等<br>[!abc]<br>--------匹配任意不包含在[!]里的字符，同样包括[!a-z]等的用法，这里[和!之间不能有空格<br>{c1,c2}<br>--------同c1或者c2相匹配，其中c1和c2也是通配符，比如{[0-9]abc,[efg]}与[0-9]abc、[efg]均通配<br>;<br>--------连续性命令，比如command1;command2，不管前者是否正确，后者都会执行，使用&amp;&amp;和||则会有先后顺序<br>!&nbsp;<br>--------逻辑运算中的非<br>/<br>--------路径字符<br>$<br>--------读取变量字符，例如echo $PATH<br>&gt;,&gt;&gt;&nbsp;<br>--------输出导向，分别为清空与末尾累加<br>'&nbsp;<br>--------单引号<br>"&nbsp;<br>--------双引号<br>``&nbsp;<br>--------两个`中间为可以先执行的指令，例如cat /etc/`pwd`/hello.<br><br><span style="COLOR: red">注意：</span><br>使用[]时，[与]之间绝对不能为空，所以[][*]表示[、]与*任意一个字符来匹配，如果要处理与通配符相关的字符，需要使用转义字符\，例如：<br>echo $[abc]<br>输出结果是a、b或者c变量的值。<br>echo $\[abc\]<br>输出结果是[abc]变量的值（举例而已，当然不存在[abc]这样的变量名）。<br>echo '[abc]'<br>单引号也能起到与转义字符同样的作用。<span style="COLOR: red">双引号内部保留所有通配符的原义，而单引号内部将通配符视为普通字符</span>。</p>
<br>
<img src ="http://www.cppblog.com/amazon/aggbug/105105.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2010-01-07 17:08 <a href="http://www.cppblog.com/amazon/archive/2010/01/07/105105.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gcc编译器使用简明指南</title><link>http://www.cppblog.com/amazon/archive/2010/01/07/105096.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Thu, 07 Jan 2010 07:46:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2010/01/07/105096.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/105096.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2010/01/07/105096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/105096.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/105096.html</trackback:ping><description><![CDATA[<p>gcc对文件的处理需要经过预处理-&gt;编译-&gt;汇编-&gt;链接的步骤，从而产生一个可执行文件，各部分对应不同的文件类型，具体如下：<br>file.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c程序源文件<br>file.i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c程序预处理后文件<br>file.cxx&nbsp;&nbsp; c++程序源文件，也可以是file.cc / file.cpp / file.c++<br>file.ii&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c++程序预处理后文件<br>file.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c/c++头文件<br>file.s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 汇编程序文件<br>file.o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目标代码文件<br><br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">gcc&nbsp;</span><span style="COLOR: #800000; FONT-WEIGHT: bold">[</span><span style="COLOR: #800000">选项</span><span style="COLOR: #800000; FONT-WEIGHT: bold">]</span><span style="COLOR: #000000">&nbsp;文件列表<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-ansi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;强制完全ANSI一致<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;仅编译或汇编，生成目标代码文件，将.c、.i、.s等文件生成.o文件，其余文件被忽略<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-S&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;仅编译，不进行汇编和链接，将.c、.i等文件生成.s文件，其余文件被忽略<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;仅预处理，并发送预处理后的.i文件到标准输出，其余文件被忽略<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-o&nbsp;file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;创建可执行文件并保存在file中，而不是默认文件a.out<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;产生用于调试和排错的扩展符号表，用于GDB调试，切记-g和-O通常不能一起使用<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-w&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;取消所有警告<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-W&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;给出更详细的警告<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-O&nbsp;</span><span style="COLOR: #800000; FONT-WEIGHT: bold">[</span><span style="COLOR: #800000">num</span><span style="COLOR: #800000; FONT-WEIGHT: bold">]</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;优化，可以指定0-3作为优化级别，级别0表示没有优化<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-x&nbsp;language&nbsp;&nbsp;默认为-x&nbsp;none，即依靠后缀名确定文件类型，加上-x&nbsp;lan确定后面所有文件类型，直到下一个-x出现为止<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-D&nbsp;macro</span><span style="COLOR: #800000; FONT-WEIGHT: bold">[</span><span style="COLOR: #800000">=</span><span style="COLOR: #800000; FONT-WEIGHT: bold">]</span><span style="COLOR: #000000">&nbsp;&nbsp;类似于源程序里的#define，在-D&nbsp;macro中的macro可被源程序识别，例如gcc&nbsp;-D&nbsp;NUM&nbsp;-D&nbsp;FILE</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">bbs.txt\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;hello.c&nbsp;-o&nbsp;hello，第一个-D选项定义宏NUM，在程序中可以使用#ifdef来检查是否被设置，第二个-D定义宏FILE，在源程序中可用<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-U&nbsp;macro&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类似于源程序开头定义#undef&nbsp;macro，也就是取消源程序中的某个宏定义<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-I&nbsp;dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将dir目录加到搜寻头文件的目录中去，并优先于gcc中缺省的搜索目录，有多个-I选项时，按照出现顺序搜索<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-L&nbsp;dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将dir目录加到搜索-lname选项指定的函数库文件的目录列表中去，并优先于gcc缺省的搜索目录，有多个-L选项时，按照出现顺序搜索<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-lname&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在链接时使用函数库libname.a，链接程序在-L&nbsp;dir指定的目录和/lib、/usr/lib目录下寻找该库文件，在没有使用-static选项时，如果发现共享函数库libname.so，则使用libname.so进行动态链接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-fPIC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;产生位置无关的目标代码，可用于构造共享函数库<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-static&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;禁止与共享函数库链接<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-shared&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;尽量与共享函数库链接（默认）</span></div>
<p><br>以下是从某些博客中摘录的使用例子：<br><a href="http://hi.baidu.com/eng_cheng/blog/item/37c2f3aee20a79c47dd92ab2.html">http://hi.baidu.com/eng_cheng/blog/item/37c2f3aee20a79c47dd92ab2.html</a><br><br><strong>1.编译单个文件<br></strong>vi hello.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建源文件hello.c<br>gcc -o hello hello.c&nbsp; //编译为可执行文件hello，在默认情况下产生的可执行文件名为a.out<br>./hello&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //执行文件，如果只写hello是错误的，因为系统会将hello当指令来执行，然后报错<br><br><strong>2.编译多个源文件<br></strong>vi message.c<br>gcc -c message.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出message.o文件，是一个已编译的目标代码文件<br>vi main.c<br>gcc -c main.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出main.o文件<br>gcc -o all main.o message.o&nbsp;&nbsp;&nbsp; //执行连接阶段的工作，然后生成all可执行文件<br>./all<br>注意：gcc对如何将多个源文件编译成一个可执行文件有内置的规则，所以前面的多个单独步骤可以简化为一个命令。<br>vi message.c<br>vi main.c<br>gcc -o all message.c main.c<br>./all<br><br><strong>3.使用外部函数库</strong><br>GCC常常与包含标准例程的外部软件库结合使用，几乎每一个linux应用程序都依赖于GNU C函数库GLIBC。<br>vi trig.c<br>gcc -o trig -lm trig.c<br>GCC的-lm选项，告诉GCC查看系统提供的数学库libm。函数库一般会位于目录/lib或者/usr/lib中。<br><br><strong>4.共享函数库和静态函数库<br></strong>静态函数库：每次当应用程序和静态连接的函数库一起编译时，任何引用的库函数的代码都会被直接包含进最终二进制程序。<br>共享函数库：包含每个库函数的单一全局版本，它在所有应用程序之间共享。<br>vi message.c<br>vi hello.c<br>gcc -c hello.c<br>gcc -fPIC -c message.c<br>gcc -shared -o libmessge.so message.o<br>其中，PIC命令行标记告诉GCC产生的代码不要包含对函数和变量具体内存位置的引用，这是因为现在还无法知道使用该消息代码的应用程序会将它链接到哪一段地址空间。这样编译输出的文件message.o可以被用于建立共享函数库。-shared标记将某目标代码文件变换成共享函数库文件。<br>gcc -o all -lmessage -L. hello.o<br>-lmessage标记来告诉GCC在连接阶段使用共享数据库libmessage.so，-L.标记告诉GCC函数库可能在当前目录中，首先查找当前目录，否则GCC连接器只会查找系统函数库目录，在本例情况下，就找不到可用的函数库了。<br><br></p>
<img src ="http://www.cppblog.com/amazon/aggbug/105096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2010-01-07 15:46 <a href="http://www.cppblog.com/amazon/archive/2010/01/07/105096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重定向与管道</title><link>http://www.cppblog.com/amazon/archive/2010/01/06/104886.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Wed, 06 Jan 2010 02:59:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2010/01/06/104886.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/104886.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2010/01/06/104886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/104886.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/104886.html</trackback:ping><description><![CDATA[<p><strong>重定向<br><br></strong>Linux shell接收或发送徐磊和字符串流行是的输入或输出，不管实际的字符串流进入或来自哪个文件、键盘、显示窗口等设备，都使用文件I/O技术来访问流。Linux shell使用3种标准的I/O流，每种流都与一个文件描述符相关：<br>1.stdout是标准输出流，显示来自命令的输出，文件描述符为1<br>2.stderr是标准错误流，显示来自命令的错误输出，文件描述符为2<br>3.stdin是标准输入流，为命令提供输入，文件描述符为0<br><br>重定向输出：<br>--------------------------------------------------------------------------------------------------<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出重定向到一个文件或设备，覆盖原来的文件<br>&gt;!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出重定向到一个文件或设备，强制覆盖原来的文件<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出重定向到一个文件或设备，追加原来的文件<br>n&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 标准输出/标准错误重定向到一个文件或者设备，覆盖原来文件（1为默认）<br>n&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 标准输出/标准错误重定向到一个文件或者设备，追加原来的文件（1为默认）<br>m&gt;&amp;n&nbsp;&nbsp;&nbsp;&nbsp; 标准输出/标准错误重定向到标准错误输出/标准错误<br>m&gt;&gt;&amp;n<br>&amp;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将标准输出和标准错误重定向到同一个文件中<br>&amp;&gt;&gt;<br>--------------------------------------------------------------------------------------------------<br>注意：<br>1.以下两个指令：<br>command 2&gt;&amp;1 1&gt;output.txt<br>command 1&gt;output.txt 2&gt;&amp;1<br>这个指令是不一样的，<span style="COLOR: red">第一种情况中，stderr被重定向到stdout的当前位置，然后再将stdout重定向到output.txt，但1&gt;output.txt只影响stdout，不影响stderr。第二种情况中，stderr被重定向到stdout的当前位置，即output.txt中</span>。<br>2.可以将选择的流重定向到空文件/dev/null，这样相当于完全忽略所选的标准流。使用cat命令显示/dev/null是空的。<br>3.<span style="COLOR: red">文件重定向的命令行内容是从左到右估算的</span>。以下面的两个命令为例：<br>sort 0&lt;students 1&gt;students.sorted 2&gt;sort.error<br>如果上述命令中因为students文件不存在而无法启动，那么1&gt;students.sorted 2&gt;sort.error这一段便无法执行，所以错误消息依然被发送到显示屏，而不是保存到文件sort.error中。<br>sort 2&gt;sort.error 0&lt;students 1&gt;students.sorted<br>上述命令解决了这个问题，如果sort命令不能启动是因为students文件不存在，错误消息会被保留到文件sort.error中，因为shell在确定文件students不存在之前就已经处理了错误输出重定向。<br><br>重定向输入：<br>-------------------------------------------------------------<br>&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入重定向到一个程序，如tr ' ' '\n' &lt; text<br>0&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 标准输入重定向<br>-------------------------------------------------------------<br>注意：<br>1.输入重定向与管道是可以互换的，例如cat file | tr ' ' '\t'使用管道命令将cat指令的标准输出果作为tr指令的标准输入，可以写成tr ' ' '\t' &lt; file。<br>2.<span style="COLOR: red">shell存在here-document的概念，这是另一种输入重定向的形式</span>，它将&lt;&lt;和一个单词结合构成一个标记，用来表示输入端结束符，例如：<br>sort -n &lt;&lt; END<br>该指令接收来自标准输入端的字符，直到END为止，然后sort排序。当然也可以使用sort -n以及CTRL+D来代替。<br><br><strong>管道</strong><br><br>1.在两个命令之间使用管道|操作符将前一个命令的stdout指向第二个命令的stdin，可以通过添加更多的命令和管道操作符来构造更长的管道线。使用管道操作符后，可以使用连字符-取代文件名作为一个参数，用于表述输入来自stdin而不是文件。<br>2.需要注意，管道线仅将stdout导向stdin，不能使用2|这样的形式单独到处stderr，但是可以先将stderr重定向到stdout，然后使用管道命令，例如ls y* x* z* 2&gt;&amp;1 | sort。<br>3.管道不涉及到中间文件，第一个命令的stdout没有写到一个文件中，然后再由第二个命令读取（相当于重定向的写法），例如bunzip2 -c somefile.tar.bz2 | tar -xvf -命令。<br><br><strong>与管道相关的一些指令<br><br>cut -d "分割字符" [-cf] fields file</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //使用某分隔符分割并列出要求的区域<br>-d&nbsp;&nbsp;&nbsp; 后面接的是分割字符，默认是空格符<br>-c&nbsp;&nbsp;&nbsp; 后面接的是第几个字符<br>-f&nbsp;&nbsp;&nbsp; 后面接的是第几个区块<br>例子：<br>cat /etc/passwd | cut -d ":" -f 1<br>将passwd文件中每一行里的":"用作分隔符，列出第一个区块。<br>last | cut -d " " -f 1<br>以空格作为分隔，并列出第一个区块。<br><br><strong>sort [-t 分隔符] [(+起始)(-结束)] [-nru] file</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //排序<br>-t&nbsp;&nbsp;&nbsp;&nbsp; 分隔符，用来隔开不同的区块，默认是TAB<br>-n&nbsp;&nbsp;&nbsp; 使用纯数字排序（默认以字母方式排序）<br>-r&nbsp;&nbsp;&nbsp; 反向排序<br>-u&nbsp;&nbsp;&nbsp; 相同出现的一行，只列出一次<br>+start -end&nbsp;&nbsp;&nbsp; 由第start区块排序到第end区块<br><br><strong>wc [-lmw] file</strong><br>-l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 计算有多少行<br>-m&nbsp;&nbsp;&nbsp; 计算有多少字符<br>-w&nbsp;&nbsp;&nbsp; 计算有多少字<br>wc用于统计，例如要知道目前帐号文件里有多少帐号，就是用wc -l，因为/etc/passwd里一行代表一个用户，即：cat /etc/passwd | wc -l。<br><br><strong>uniq [-cdu] inputfile [outputfile]</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //默认用来显示所有的行一次<br>-c&nbsp;&nbsp;&nbsp; 用于计算每行出现的次数<br>-d&nbsp;&nbsp;&nbsp; 只打印不重复的行<br>-u&nbsp;&nbsp;&nbsp; 只打印重复的行<br>例如：<br>last | cut -d " " -f 1 | sort | uniq<br><br><strong>tee file</strong><br>tee命令将数据同时显示在屏幕上和文件中，使用方式如下：<br>last | tee file | cut -d " " -f 1<br>last的输出数据传入file中，也会同时传给stdout。<br><br><strong>tr [-ds] SET1 [SET2]</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //从标准输入中翻译、删除字符串，并写到标准输出中<br>-d&nbsp;&nbsp;&nbsp; 删除SET1这个字符串<br>-s&nbsp;&nbsp;&nbsp; 对SET1出现的字符，当连续出现时仅打印一次<br>例如：<br>cat /etc/passwd | tr -d :<br>这个命令会删除':'这个符号并显示输出。<br>last | tr '[a-z]' '[A-Z]'<br>这个命令将小写改成大写，取代原有的字符。<br><br><strong>split [-bl num] 输入文件 输出文件前导字符</strong><br>-b&nbsp;&nbsp;&nbsp; 以文件size来分<br>-l&nbsp;&nbsp;&nbsp; 以行数来分<br>该指令将某文件内容分割成几个子文件，子文件名字为前导字符+aa、ab、ac等，使用-l指定每个文件的行数，使用-b指定每个文件的大小。<br>例子：<br>split -l 5 /etc/passwd test&nbsp;&nbsp;&nbsp; //产生testaa、testab等文件。</p>
<br>
<img src ="http://www.cppblog.com/amazon/aggbug/104886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2010-01-06 10:59 <a href="http://www.cppblog.com/amazon/archive/2010/01/06/104886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vi常用指令</title><link>http://www.cppblog.com/amazon/archive/2010/01/05/104841.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Tue, 05 Jan 2010 08:57:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2010/01/05/104841.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/104841.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2010/01/05/104841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/104841.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/104841.html</trackback:ping><description><![CDATA[<p><strong>一般模式：</strong><br>0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 移到这一行的第一个字符处<br>$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 移到这一行的最后一个字符处<br>G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;移到这个文件的最后一行第一个字符<br>gg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;移到这个文件的首行第一个字符<br>x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 向后删除一个字符<br>X&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 向前删除一个字符<br>dd&nbsp;&nbsp;&nbsp;&nbsp; 删除光标所在的一整行<br>ndd&nbsp;&nbsp; 删除光标所在行的向下n行<br>yy&nbsp;&nbsp;&nbsp;&nbsp; 复制光标所在行<br>nyy&nbsp;&nbsp;&nbsp;复制光标所在行的向下n行<br>p,P&nbsp;&nbsp;&nbsp; p为粘贴在光标下一行，P为粘贴在光标上一行<br>u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 恢复前一个动作<br>J&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将光标所在行与下一行结合成一列<br>n&lt;Enter&gt;&nbsp;&nbsp;&nbsp; 光标向下移动n行<br><br><strong>命令行模式：</strong><br>:w&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将编辑的数据写入硬盘文件中<br>:w!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 强制保存<br>:q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 退出vi<br>:q!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 强制退出vi，不保存文件<br>:wq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;保存后退出<br>:wq!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;强制保存后退出<br>:w file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将数据保存为另一个文件，原文件不变&nbsp;<br>:n1,n2 w file&nbsp; 将n1行到n2行的内容保存为file文件<br>:set nu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示行号<br>:set nonu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不显示行号<br>:/word&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在光标之后查找一个名为word的字符串<br>:?word&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在光标之前查找一个名为word的字符串<br>:n1,n2 s/word1/word2/g&nbsp;&nbsp;&nbsp;&nbsp; 在第n1与第n2行之间查找word1这个字符串，并将该字符串替换为word2，例如n1为0，n2为$<br>:n1,n2 s/word1/word2/gc&nbsp;&nbsp; 同上，并显示提示符供用户确认<br><br><br></p>
<img src ="http://www.cppblog.com/amazon/aggbug/104841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2010-01-05 16:57 <a href="http://www.cppblog.com/amazon/archive/2010/01/05/104841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux常用指令汇总</title><link>http://www.cppblog.com/amazon/archive/2010/01/04/104609.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Mon, 04 Jan 2010 08:53:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2010/01/04/104609.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/104609.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2010/01/04/104609.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/104609.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/104609.html</trackback:ping><description><![CDATA[<p>提供《Linux命令大全.chm》文件，下载地址为：<br><a href="http://www.cppblog.com/Files/amazon/Linux命令大全.rar">/Files/amazon/Linux命令大全.rar</a><br><br>shutdown指令：<br>shutdown命令用于终止操作系统、重开机或者向所有用户传送信息，具体路径为/sbin/shutdown，只有root权限才有权运行此命令。<br><strong>shutdown [-t seconds] [-arkhncfF] minutes [警告信息]<br></strong>-h&nbsp;&nbsp;&nbsp; shutdown后立即halt<br>-k&nbsp;&nbsp;&nbsp; 不shutdown，仅发送警告信息给所有用户<br>-r&nbsp;&nbsp;&nbsp; shutdown后重新开机<br>-n&nbsp;&nbsp;&nbsp; 非正常方式关机，用强迫的方式kill掉所有程序然后关机<br>-t sec&nbsp;&nbsp;&nbsp; 在警告信息和关机信号之间有sec秒的延迟<br>-f&nbsp;&nbsp;&nbsp; 关机并开机后，略过fsck工具的磁盘检查<br>-F&nbsp;&nbsp; 关机并开机后，强制fsck工具的磁盘检查<br>-c&nbsp;&nbsp; 取消shutdown指令，不需要使用minutes参数，但是可以有警告信息<br><span style="COLOR: #ff0000">注意：minutes参数是强制性的，可以用now表示立即关机。<br><br></span>linux文件属性：<br>-rwxrwx---<br>第一个属性代表文件是目录（d）、文件（-）、链接文件（l）、设备文件中供存储的接口设备（b）、设备文件中的串口设备如键盘鼠标（c）。<br>接下来的属性3个为一组，其中r代表可读、w代表可写、x代表可执行、-代表不具备某个属性。第一组为拥有者的权限，第二组为群组的权限，第三组为其他非本群组的用户的权限。<br>对于目录的权限要额外注意。如果对某目录的权限是rwx，那么可读可写可执行；如果权限是r-x，那么可读可进入，但无法写入；如果权限是r--，那么不可进入该目录。注意：<span style="COLOR: #ff0000">目录与x的关系很重要，如果某用户对某目录没有x权限，自然也就无法执行ls、cd等指令，所以也就无法进入目录</span>。如果某用户对某目录仅有r的权限，是不能进入该目录的。<br><span style="COLOR: #000000">linux下的文件是否可执行与后缀名无关，而是由x这个属性来决定的，后缀</span>仅起到修饰的作用。文件名之前如果有一个"."，说明该文件是隐藏文件，例如&#8220;.bashrc_history&#8221;，使用ls -al可以显示隐藏文档。<br><br>改变所在群组/bin/chgrp：<br><strong>chgrp group file/dir</strong><br>注意：改变的群组名必须在/etc/group中存在，否则会显示错误。 <br><br>改变拥有者/bin/chown：<br><strong>chown [-R] owner file/dir<br>chown [-R] owner:group file/dir</strong><br>-R&nbsp;&nbsp;&nbsp; 循环地将该目录下的所有文件都改成owner与group的名称，而不仅仅是该目录<br>&nbsp;<br>改变权限/bin/chmod：<br><strong>chmod [-R] xyz file/dir</strong><br>-R&nbsp;&nbsp;&nbsp; 循环地将该目录下的文件都改变，而不仅仅是该目录<br>xyz为三组rwx属性数值的相加，其中r为4，w为2，x为1，那么-wx就是3，rwx就是7。<br><strong>chmod [-R] u=,o=,g= file/dir</strong><br>其中：<br>u是user，g是group，o是others，a是所有三组。例如：chmod u=rwx,og=rx file，chmod u=rwx,g=rx,o=r file。<br>+是加入，-是除去。chmod a+w file/dir，chmod u-x file/dir。<br><br>chattr/lsattr：<br><span style="COLOR: #ff0000">待查。<br></span></p>
<br>------------------------------------------------------------------------------------------------<br><br>cd命令：<br><strong>cd 相对路径/绝对路径</strong><br>登入linux系统后，root的工作路径会自动切换到root目录下，而用户会自动转到/home/user下。<br><br>/bin/pwd命令：<br><strong>pwd</strong><br>pwd用于显示当前所在目录。<br><br>/bin/mkdir和/bin/rmdir命令：<br><strong>mkdir [-p]&nbsp;目录名称<br></strong>-p&nbsp;&nbsp;&nbsp; 顺序创建目录和子目录，例如mkdir -p a/b/c，则顺序建立a、a/b和a/b/c。<br>mkdir建立新的目录，尤其注意：<span style="COLOR: #ff0000">当建立/home/amazon/test的目录时，必须确保前面的目录都存在</span>。<br><strong>rmdir 目录名称<br></strong>-p&nbsp;&nbsp;&nbsp; 顺序删除目录和子目录，同上。<br>rmdir删除旧有的目录，目录需要层层删除，而且<span style="COLOR: #ff0000">被删除的目录中不能有其他的目录或文件</span>，除非使用rm -rf 目录名称 这样的命令。<br><br>/bin/ls命令：<br><strong>ls [-ailS]</strong><br>-a&nbsp;&nbsp;&nbsp; 列出所有文件（包括隐藏文档）<br>-i&nbsp;&nbsp;&nbsp; 打印inode的值<br>-l&nbsp;&nbsp;&nbsp; 详细列出，包括文件大小，属性数据等<br>-S&nbsp;&nbsp; 以文件大小排序<br>--color=never&nbsp;不显示颜色<br>--color=always&nbsp;总显示颜色<br>--color=auto&nbsp;由系统自行判断<br>如果想使ls默认没有颜色，可以在/root/.bashrc或者根用户的.bashrc文件中加入下面的代码：<br>alias ls='ls --color=never'<br><br>/bin/cp命令：<br><strong>cp [-drsu] 源文件 目标文件</strong><br>-r&nbsp;&nbsp;&nbsp; 可以进行目录的复制<br>-s&nbsp;&nbsp;&nbsp; 做成符号链接文件，与ln指令功能相同<br>-u&nbsp;&nbsp;&nbsp; 如果源文件较新，或者没有目标文件，才会进行复制动作，可用于备份操作<br>-d&nbsp;&nbsp;&nbsp;如果是复制链接文件，若不加任何参数则默认情况下会将链接到的源文件复制到目的地；若加-d，则链接文件可原封不动地链接这个快捷方式到目的地，即保留软硬链接<br><span style="COLOR: red">注意：只有目标路径而缺少目标文件的话，只要源目录与目标目录不相同即可，复制后的目标文件与源文件同名。</span> <br><br>/bin/rm命令：<br><strong>rm [-irf] 文件名</strong><br>-i&nbsp;&nbsp;&nbsp; 提供用户确认（默认值）<br>-r&nbsp;&nbsp;&nbsp; 循环删除，直到没有东西为止<br>-f&nbsp;&nbsp;&nbsp; 强制删除<br><span style="COLOR: red">注意：-rf可以连续删除某目录下所有文件与目录，以及该目录本身。</span><br><br>/bin/mv命令：<br><strong>mv [-u] 源文件 目标文件<br></strong>-u&nbsp;为update的缩写，当源文件比目标文件还新时才会动作<br>示例：<br>mv file file.new&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //更改文件名<br>mv file1 file2 /tmp&nbsp; //最后一个/tmp才是目标文件目录，file1和file2是源文件<br><br>/bin/cat和/bin/tac命令：<br><strong>cat [-n] 文件名<br></strong>-n&nbsp;显示时，连行号一起输出到屏幕上<br><strong>tac 文件名</strong><br>tac刚好将cat反写过来，从最后一行到第一行反向显示在屏幕上。<br><br>/bin/more和/usr/bin/less命令：<br><strong>more 文件名</strong><br>more命令可以一页一页地显示文件内容，而通常情况下用cat没法看清楚。more也可以用来配合管道使用，例如ls -al | more可以将显示的内容一页一页地列出。<br><strong>less 文件名</strong><br>使用more时无法向前翻看，而使用less就可以使用pageup和pagedown向前向后翻看。<br><br>/usr/bin/head和/usr/bin/tail命令：<br><strong>head [-n number] 文件名</strong><br>显示一个文件的前几行，若没有加上-n参数，默认显示前10行，若只想显示一行，可以输入head -n 1 filename。<br><strong>tail [-n number] 文件名</strong><br>同上。<br><span style="COLOR: red">例子：要求输出某文件的第n行到第n+m行，可以使用head -n n+m file | tail -n m这样的指令。<br><br></span>/usr/bin/nl命令：<br><strong>nl 文件名</strong><br>nl指令的用法和cat -n用法相似，即查看文件的同时也可以显示行号。<br><br>/usr/bin/od命令：<br><strong>od 文件名</strong><br>od用于读取非ASCII文件，例如二进制文件，使用cat或者vi读取二进制文件是乱码。<br><br>--------------------------------------------------------------------------------------------<br><br>硬链接/符号链接：<br>hard link就是重新建立一个inode链接到文件放置的block块，并在查询时利用原来的inode与后来添加的inode均可指定到该文件放置的地点，读取两个indoe的结果都是存取同一个文件的内容。但是使用硬链接有两个最大限制：<br>1.不能跨文件系统，因为不同文件系统有不同的inode table；<br>2.不能链接目录，因为目录本身不是文件，仅仅消耗inode而没有block，而inode是链接到block块的。<br>symbolic link就是再建立一个独立文件，这个文件会让数据读取操作指向它链接的那个文件。其缺点在于，当源文件被删除，符号链接的文件就打不开了，屏幕显示&#8220;无法开启某文件&#8221;。<br><br><strong>ln [-s] 源文件 目标文件<br></strong>-s&nbsp;&nbsp;&nbsp; 提供符号链接，不加该参数为硬链接<br>假设a为文件，a.hard为硬链接文件，a.sym为符号链接文件，那么使用rm a之后，more a.hard依然正常显示文件内容，而more s.sym显示&#8220;不存在该目录或文件&#8221;。这是因为a.sym为符号链接文件，对其进行操作相当于对a指定的block内文件进行操作；而a.hard为硬链接文件，相当于a的另外一个别名，去掉a只是去掉了其中一个别名而已，但文件还在block中。<br><br>-----------------------------------------------------------------------------------------<br><br>/usr/bin/which、/usr/bin/whereis和/usr/bin/find等指令：<br><br><strong>which command</strong><br>which查看命令所在可执行文件的位置（仅仅是可执行文件），即通过PATH环境变量到该路径内寻找可执行文件。<br><br><strong>whereis [-bmsu] command</strong><br>-b&nbsp;&nbsp;&nbsp; 只寻找二进制文件<br>-m&nbsp;&nbsp; 只寻找在说明文件manual路径下的文件<br>-s&nbsp;&nbsp;&nbsp; 只寻找source源文件<br>-u&nbsp;&nbsp;&nbsp; 只寻找非说明文档的文件<br>whereis将命令行所在文件的路径列出来。<br><br><strong>find 路径 [参数]<br></strong>find命令将某一路径下的文件列印出来。<br>-atime n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将n&#215;24小时内被存取过的文件列出来<br>-ctime n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将n&#215;24小时内被改变、新增的文件或目录列出来<br>-mtime n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将n&#215;24小时内被修改过的文件列出来<br>-newer file&nbsp;&nbsp; 把比file还要新的文件列出来<br>-gid n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 寻找群组ID为n的文件<br>-group name&nbsp;&nbsp; 寻找群组名称为name的文件<br>-uid n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 寻找拥有者ID为n的文件<br>-user name&nbsp;&nbsp;&nbsp; 寻找用户名为name的文件<br>-name file&nbsp;&nbsp;&nbsp; 寻找文件名为file的文件<br>-type type&nbsp;&nbsp;&nbsp; 寻找文件属性为type的文件，包括b、c、d、p、l、s等。<br><br><strong>locate dir/file</strong><br>使用locate查找数据比find快，因为locate是从已经建立的数据库/var/lib/slocate中查找数据，不用直接在硬盘中存取数据。<br><br>----------------------------------------------------------------------------------------------<br><br>查看硬盘或目录的容量指令/bin/df和/bin/du：<br><br><strong>df [-ikm]</strong><br>查看硬盘的总容量、已用容量与inode等。<br>-i&nbsp;&nbsp;&nbsp;&nbsp; 使用inodes显示结果<br>-k&nbsp;&nbsp;&nbsp; 使用KBytes显示结果（默认）<br>-m&nbsp;&nbsp; 使用MBytes显示结果<br><br><strong>du [-abckms] [目录名称]</strong> （省略表示当前所在目录）<br>统计某目录下的文件容量。<br>-a&nbsp;&nbsp;&nbsp; 列出所有的文件与目录，默认值是列出目录的值<br>-b&nbsp;&nbsp;&nbsp; 列出的值以bytes输出<br>-c&nbsp;&nbsp;&nbsp; 最后求总total<br>-k&nbsp;&nbsp;&nbsp; 列出的值以KB输出（默认）<br>-m&nbsp;&nbsp;&nbsp; 列出的值以MB输出<br>-s&nbsp;&nbsp;&nbsp; 只列出最后求总的值<br><br>---------------------------------------------------------------------------------------------<br><br>/bin/echo指令：<br><strong>echo $variable</strong><br>显示当前variable变量。<br><br>/bin/env指令：<br><strong>env</strong><br>显示系统的所有环境变量，某些重要的环境变量如下：<br>ENV=/home/amazon/.bashrc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用户自定义环境变量的配置文件，root用户的是/root/.bashrc<br>HISTSIZE=1000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当前指令记忆数量<br>HOME=/home/amazon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 登入者的根目录<br>HOSTNAME=localhost.localdomain&nbsp; 主机的名字<br>HOSTTYPE=i386&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主机硬件的等级状态（i386、i686）<br>LANGUAGE =C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认语言的资料<br>LOGNAME=amazon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 登入者的帐号<br>MAIL=/var/spool/mail/amazon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 邮件文件<br>PATH=......&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指令路径<br>PWD=/home/amazon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当前所在路径<br>USERNAME=amazon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 登入者的帐号<br>USER=amazon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用户帐号<br><br>/bin/set指令：<br><strong>set</strong><br>显示当前的环境变量，也会显示自定义的变量。注意：自定义变量只能自己使用，而不会干扰到别人，除非修改了系统的配置文件。<br><br>变量设定规则：<br><strong>var='......'</strong><br>1.变量与变量内容用=连结；<br>2.等号两边不能直接接空格符，如name = variable错误；<br>3.变量只能是英文字母与数字，数字不能开头；<br>4.<span style="COLOR: #ff0000">有空格符的情况下，使用双引号或者单引号括住变量，</span><span style="COLOR: #ff0000">双引号的特殊字符可以保留变量特性，如"$PATH"，单引号不可以</span>；<br>5.\为转义字符，可以将特殊字符（Enter、$、\、空格符、'等）变成一般符号，而不需要双引号；<br>6.扩增变量需要用"$PATH":/home、"$PATH:/home"或者$PATH:/home这样的形式累加；<br>7.若该变量需要在其他子程序执行，以export使变量可以动作，如export PATH；（什么意思？）<br>8.系统预设变量用大写，自定义变量用小写；<br>9.<span style="COLOR: #ff0000">用unset variable取消变量</span>。<br><br>别名alias指令：<br><strong>alias name='.....'</strong><br>别名和变量的定义基本一致。<br><strong>alias</strong><br>查询所有别名，包括系统默认别名和自定义别名。<br><strong>unalias name</strong><br>取消别名。<br><br>-----------------------------------------------------------------------------------------<br><br>/usr/bin/compress指令：<br><strong>compress [-d] filename</strong><br>-d&nbsp;&nbsp;&nbsp; 解压缩参数，也可以使用<strong>uncompress filename</strong>指令<br><strong>zcat filename.Z <br></strong>zcat可以读取.Z压缩文件的内容。<br>注意：compress用来压缩与解压缩后缀名为.Z的文件。使用compress压缩后，如果没有给出其他参数，<span style="COLOR: red">原始文件会被后来的.Z文件取代</span>，使用uncompress指令也是一样。<br><br>/usr/binbzip2和/usr/binbzcat指令：<br><strong>bzip2 [-dz] filename</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>-d&nbsp;&nbsp;&nbsp; 解压缩，可以使用<strong>bunzip2 filename</strong>取代<br>-z&nbsp;&nbsp;&nbsp; 压缩（默认）<br><strong>bzcat filename.bz2</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //读取压缩文件内容，而不需要解压缩<br>注意：当文件后缀为.bz、.bz2、tbz、tbz2等时，可以使用bzip2进行解压。<span style="COLOR: red">原始文件会被压缩文件.bz2等取代。<br></span><br>/bin/gzip和/bin/zcat指令：<br><strong>gzip [-d#] filename<br></strong>-d&nbsp;&nbsp;&nbsp; 解压缩参数<br>-#&nbsp;&nbsp;&nbsp; 压缩等级，1最不好，9最好，默认为6<br><strong>zcat filename.gz</strong><br>注意：zcat不仅可以读取.gz后缀的压缩文件，也可以同时读取compress的压缩文件（.Z）。<span style="COLOR: red">原始文件会被压缩文件.bz2等取代。</span><br><br>/bin/tar指令：<br><strong>tar [-zxcvfpP] tarfile&nbsp;file</strong><br>-z&nbsp;&nbsp;&nbsp; 同时具有gzip<br>-j&nbsp;&nbsp;&nbsp;&nbsp;同时具有bzip<br><span style="COLOR: #ff0000">-x&nbsp;&nbsp;&nbsp; 解开一个压缩文件<br></span><span style="COLOR: #ff0000">-t&nbsp;&nbsp;&nbsp; 查看tarfile的文件<br></span>-c&nbsp;&nbsp;&nbsp; 建立一个压缩文件<br>-v&nbsp;&nbsp;&nbsp; 压缩过程中显示文件<br>-p&nbsp;&nbsp;&nbsp; 使用原文件的属性<br>-P&nbsp;&nbsp;&nbsp; 可以使用绝对路径<br>-f&nbsp; file&nbsp;&nbsp; 使用file文件名作为目标<br>-N&nbsp;'yyyy/mm/dd'&nbsp;&nbsp;&nbsp; 比后面接的日期还要新的文件才会被打包进新建的文件中<br>--exclude FILE&nbsp; 在压缩过程中，不要将FILE打包<br>例子：<br>tar -cvf file.tar file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<span style="COLOR: red">可以打包目录，并且原文件/目录依然存在</span><br>tar -zcvf file.tar.gz file<br>tar -xvf file.tar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //不使用-zxvf，因为是.tar文件而不是.tar.gz文件，且<span style="COLOR: red">压缩文件依然存在<br><font color=#000000>tar -zxvf file.tar.gz</font></span><br>tar -ztvf file.tar.gz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //查看tar.gz里面的文件信息，而不需要解压缩<br>tar -tvf file.tar<br>tar -N '2002/06/25' -zcvf home.tar.gz /home&nbsp; //将/home目录中，比日期还要新的文件打包进入home.tar.gz中<br>tar -zcvf host.tar.gz /home --exclude /amazon --exclude /host&nbsp; //除amazon和host外，home目录打包<br>tar -cvf - /home | tar -xvf -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //直接打包后解压缩，没有中间文件<br><br>-------------------------------------------------------------------------------------------<br><br>正则表达式/bin/grep：<br><strong>grep "word" filename</strong><br>将某filename文件中含有word的那一行显示出来。<br>例子：<br>grep root /var/log/secure<br>grep "*[a-d]*" /var/log/secure<br>grep boot /etc/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出的是/etc下文件内容含有boot的所有行<br>grep \* /etc/*<br>grep "a\{5\}" file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //必须要有双引号<br>符号：<br>^&nbsp;&nbsp;&nbsp; 句首字符相符<br>$&nbsp;&nbsp;&nbsp; 句尾字符相符<br>?&nbsp;&nbsp;&nbsp; 任何一个单一字符<br>*&nbsp;&nbsp;&nbsp; 任意几个字符，包括0个<br>\&nbsp;&nbsp;&nbsp;&nbsp; 转义字符，使^、?、*等变为普通字符<br>[list]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列表中的字符，例如[123456789]<br>[range]&nbsp;&nbsp; 列表范围内的字符，例如[1-9]<br>\{n\}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;与前一个相同字符连续n个<br>\{n,m\}&nbsp;&nbsp;与前一个相同字符连续n到m个<br><br>------------------------------------------------------------------------------------------<br><br>如何增加用户：<br>1.如果用户所属群组不存在，先新增群组。（增加用户前，该群组必须存在）<br>2.新增用户帐号。<br>如何删除群组：<br>3.如果某群组中有用户，先删除用户。（删除群组前，该群组必须为空）<br>4.删除群组。<br><br><strong>groupadd [-g GID] groupname</strong><br>-g GID&nbsp;&nbsp;&nbsp; 自行设定GID的大小，否则默认提供<br><strong>groupdel groupname</strong><br>注意：在删除群组之前，必须将该群组下的用户删除。<br><br><strong>useradd [-u UID] [-g GID] [-d HOME] [-mM] [-s shell] username</strong><br>-u&nbsp;&nbsp;&nbsp; 直接给出一个UID<br>-g&nbsp;&nbsp;&nbsp; 直接给出一个GID（此GID必须已存在）<br>-d&nbsp;&nbsp;&nbsp; 直接将其根目录指向已经存在的目录（系统不会再默认建立）<br>-M&nbsp;&nbsp;&nbsp;不建立根目录<br>-s&nbsp;&nbsp;&nbsp;&nbsp; 定义其使用的shell<br><strong>userdel [-r] username</strong><br>-r&nbsp;&nbsp;&nbsp; 将该帐号的[home directory]和[/var/spool/mail/username]一并删除，默认情况下是保留的<br><br>密码管理与设定：<br>root可以设定任何样式的密码，而且可以帮助user设定他们的密码，而user仅能修改自己的密码。<br><strong>passwd [username]</strong><br><br>用户身份切换：<br><strong>su</strong>&nbsp;<br>使用su可以进行身份切换，但是需要注意：<br>1.<span style="COLOR: #ff0000">环境依然属于当初登入的那个用户</span>，例如以test的身份登入linux，再切换到root，但是个人的mail、PATH等环境变量都还是test的。<br>2.对于环境变量，最麻烦的当属PATH，为了避免一般用户使用root的管理指令，通常linux会将指令分类放在两个目录下，分别是/bin和/sbin，其中/sbin存放的大多是root用来管理系统的指令。所以，当从一般用户切换到root后，某些指令不可用，就是因为PATH中没有/sbin这个路径。&nbsp;<br>具体解决方法如下：<br>1.使用命令的完整路径。<br>2.将/sbin和/usr/sbin路径添加到普通用户的PATH路径中。<br>3.<span style="COLOR: #ff0000">使用<strong>su -</strong>命令切换，-是指同时切换用户的环境变量</span>。<br><strong>sudo [-u username/#uid] [command]</strong><br>-u&nbsp;&nbsp;&nbsp; 将分身变成username的身份<br>使用sudo可以不需要root的密码也能执行root身份的工作。具体情况略。<br><br>用户查询：<br><strong>id [username]</strong><br>直接输入id查询当前帐号的UID、GID与所属群组，输入id username生成username的相关信息。不需要察看/etc/passwd和/etc/group。<br><strong>finger [-s] [username]</strong><br>-s&nbsp;完整列出<br>使用finger可以知道某用户的相关信息，基本都在/etc/passwd上，还包括/var/spool/mail这个邮件存放地点，所以还会显示是否有邮件信息。<br><strong>groups</strong><br>直接输入groups就可以显示当前用户所属的群组。<br><br>手动添加用户：<br>大致步骤如下：<br>1.先建立需要的群组（vi /etc/group）<br>2.建立帐号的各个属性（vi /etc/passwd）<br>3.将passwd与shadow同步（pwconv）<br>4.建立该帐号的密码（passwd acount）<br>5.建立用户根目录（cp -r /etc/skel /home/account）<br>6.更改根目录属性（chown -R account.group /home/account）<br>删除帐号步骤：<br>1.删除/etc/passwd与/etc/shadow中的相关信息<br>2.转到/home下删除该帐号的根目录<br>3.转到/var/spool/mail下删除该帐号的邮件<br><br>
<img src ="http://www.cppblog.com/amazon/aggbug/104609.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2010-01-04 16:53 <a href="http://www.cppblog.com/amazon/archive/2010/01/04/104609.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GNU automake步骤及分析</title><link>http://www.cppblog.com/amazon/archive/2009/12/23/103811.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Wed, 23 Dec 2009 08:23:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/12/23/103811.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/103811.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/12/23/103811.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/103811.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/103811.html</trackback:ping><description><![CDATA[<p>前言：该文从《Linux应用开发基础》一书中摘要所得。<br><br>首先确认系统已经安装以下软件：<br>GNU automake<br>GNU autoconf<br>GNU m4<br>perl<br>GUN Lib工具<br><br>第一步，用编辑器vi生成hello.c文件，然后用autoscan命令产生一个configure.in的雏形configure.scan，如下编辑configure.scan文件并将文件名改为configure.in。<br>autoscan<br>vi configure.scan<br>----------------------------------------------<br>AC_INIT(hello.c)<br>AM_INIT_AUTOMAKE(hello, 1.0)<br>#..........................<br>AC_PROG_CC<br>#...........................<br>AC_OUTPUT(makefile)<br>-----------------------------------------------<br>mv configure.scan configure.in<br><br>第二步，执行aclocal和autoconf，分别产生aclocal.m4和configure两个文件。configure文件内信息由configure.in和aclocal产生的巨集生成。<br>aclocal<br>autoconf<br><br>第三步，编辑makefile.am文档，内容如下：<br>vi makefile.am<br>-----------------------<br>AUTOMAKE_OPTIONS=foreign<br>bin_PROGRAMS=hello<br>hello_SOURCES=hello.c<br>----------------------<br>然后执行automake &#8211;add-missing，automake会根据makefile.am文件产生一些文件，包含最重要的makefile.in。<br>automake &#8211;add-missing<br><br>第四步，执行./configure，生成makefile文档。大功告成，接下来执行make指令就可以编译hello.c生成可执行文件。<br>./configure<br>make<br>./hello<br>注意：除了make指令之外，还有make clean / make install / make dist等指令。<br><br><br>步骤详细解释：<br><br><strong>autoconf：</strong><br>autoconf是用来产生configure档的工具，configure是一个shell script，它可以自动核定原始程序以符合各种不同平台上Unix系统的特性，并且根据系统参数及环境产生合适的makefile档或者header file档，让原始程序可以很方便地在这些平台上被编译。autoconf读取configure.in档然后产生configure这个shell script。<br>configure.in档的内容是一连串GNU m4的巨集，这些巨集经过autoconf处理后会变成检查系统特征的shell script configure.in内巨集的顺序要求：每一个configure.in档必须在所有巨集前加入AC_INIT巨集，然后在所有巨集后面加上AC_OUTPUT巨集。<br>先用autoscan扫描原始档以产生一个configure.scan档，在对该档做些修改，产生configure.in档，在范例中用到的巨集如下：<br>AC_INIT(file)：用来检查原始文件所在的路径。<br>AM_INIT_AUTOMAKE(PACKAGE, VERSION)：使用automake必备的巨集，PACKAGE是要产生软件套件的名称，VERSION是版本编号。<br>AC_PROG_CC：检查系统可用的C编译器，如果原始程序是用C写的就需要用这个巨集。<br>AC_OUTPUT(file)：设定configure所要产生的文档名，如果是makefile的话，configure便会把它检查出来的结果带入makefile.in中然后产生合适的makefile。<br>在使用automake时，还需要一些其他的巨集，这个额外巨集我们用aclocal来产生。执行aclocal会产生aclocal.m4档，一般来说不用修改。有了configure.in和aclocal.m4档，就可以执行autoconf来产生configure档了。<br><br><strong>automake：</strong><br>automake会根据configure.in中的巨集把makefile.am转成makefile.in档。在makefile.am档中需要定义要产生的目标，具体包括：<br>AUTOMAKE_OPTIONS：设定automake的选项。automake主要是帮助开发GNU软件的人员维护软件套件，一般在执行automake时会检查目录下是否存在标准GNU套件中应具备的文件档案，例如NEWS、AUTHOR、ChangeLog等，设成foreign时，automake会改用一般软件套件标准来检查，而gnu是缺省设置，该级别下将尽可能地检查包是否服从GNU标准，gnits是严格标准，不推荐。<br>bin_PROGRAMS：定义要产生的执行档名称，产生多个执行档的话，需要用空格符隔开。<br>hello_SOURCES：定义hello这个执行档的原始档，如果该程序由多个原始档产生，必须把所用到的原始档都列出来，空格符隔开，例如hello_SOURCES=hello.c main.c hello.h。如果定义了多个执行档，则对每个执行档都要定义相对的filename_SOURCES。<br>automake --add-missing指令可以用makefile.am来产生makefile.in，加上--add-missing是要automake顺便将软件套件必备的档案加入包装。<br>之后再执行./configure，根据makefile.in档产生makefile文档，有几个预设的目标可供使用：<br>make all：产生设定的目标，即可执行文件。和只打make的结果相同，此时开始编译原始码，然后连接，并产生最终执行文档。<br>make clean：清除之前所编译的执行文件和目标代码文件。<br>make distclean：除了清楚执行文件和目标代码文件外，也把configure产生的makefile清除掉。<br>make install：将程序安装至系统中（系统预设的执行文件存放路径）。使用bin_PROGRAMS巨集的话，程序会被安装到user/local/bin这个目录。<br>make dist：将程序和相关档案定制成压缩包的形式，名称为PACKAGE-VERSION.tar.gz，其中PACKAGE和VERSION以configure.in中的AM_INIT_AUTOMAKE(PACKAGE, VERSION)为准。<br>make distcheck：压缩并且检查压缩包是否正常，有相应显示。<br><br><br></p>
<img src ="http://www.cppblog.com/amazon/aggbug/103811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-12-23 16:23 <a href="http://www.cppblog.com/amazon/archive/2009/12/23/103811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gdb调试相关指令</title><link>http://www.cppblog.com/amazon/archive/2009/12/23/103809.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Wed, 23 Dec 2009 08:10:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/12/23/103809.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/103809.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/12/23/103809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/103809.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/103809.html</trackback:ping><description><![CDATA[第一步，编译生成带源代码调试符号的可执行文件：<br><span style="COLOR: red">gcc &#8211;o hello &#8211;g hello.c</span><br>其中-g的意思是生成带源代码调试符号的可执行文件hello，不使用-g进行编译的可执行文件也可以使用gdb调试，但是缺少部分调试信息（如行号、函数名等）。调试信息包括用户程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。<br><br>第二，使用gdb hello进入gdb，进行调试阶段。启动gdb有以下几种方式：<br><span style="COLOR: red">
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">gdb&nbsp;filename&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//指定要调试的程序<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">gdb&nbsp;filename&nbsp;core&nbsp;&nbsp;&nbsp;&nbsp;//指定要调试的程序及其coredump文件<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">gdb&nbsp;filename&nbsp;pid&nbsp;&nbsp;&nbsp;&nbsp;//指定要调试的程序及对应进程id号<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">可以使用命令行参数更加详细地控制gdb的行为：<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-silent&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//不显示进入gdb开头的提示信息<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-help(h)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//命令行辅助信息<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-se&nbsp;file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//从file中读取符号，并作为可执行文件<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-core(c)&nbsp;file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//指定core&nbsp;dump文件file<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-c&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//连接到进程号为id，与attach命令相似<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-x&nbsp;file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//file中存放一系列的gdb命令，执行file中的gdb命令<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-symbols(s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//从file中读取符号，但不作为可执行文件<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">-directory(d)&nbsp;path&nbsp;&nbsp;&nbsp;&nbsp;//指定路径path，将path加入到搜索源文件的路径中</span></div>
</span>注意：gdb开始运行时，它把任何一个不带选项前缀的参数都当作一个可执行文件或core文件或进程号，具体为：把第一个前面没有选项说明的参数看作加了-se选项，而第二个看作是跟着-c选项后面。在gdb中可以把选项名掐头去尾，只要保证gdb能唯一判断是哪个选项就行。<br><br>第三，逐步调试，部分命令如下：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">break(b)&nbsp;</span><span style="COLOR: #800000; FONT-WEIGHT: bold">[</span><span style="COLOR: #800000">file:</span><span style="COLOR: #800000; FONT-WEIGHT: bold">]</span><span style="COLOR: #000000">&nbsp;func&nbsp;/&nbsp;line&nbsp;/&nbsp;addr&nbsp;/&nbsp;+num&nbsp;/&nbsp;-num&nbsp;&nbsp;&nbsp;&nbsp;//某函数、某行或者某内存地址处设断点，可同时设置多个断点<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">break&nbsp;args&nbsp;if&nbsp;COND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//COND非零时在args处中断<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">tbreak&nbsp;agrs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//断点只有效一次<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">clear&nbsp;</span><span style="COLOR: #800000; FONT-WEIGHT: bold">[</span><span style="COLOR: #800000">file:</span><span style="COLOR: #800000; FONT-WEIGHT: bold">]</span><span style="COLOR: #000000">&nbsp;func&nbsp;/&nbsp;line&nbsp;/&nbsp;addr&nbsp;/&nbsp;+num&nbsp;/&nbsp;-num&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清楚某种断点，可同时清除多个<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">delete(d)&nbsp;breaknum&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使用断点号来清除断点或观察点，没有参数则清除所有断点<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">disable(dis)&nbsp;breaknum&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//禁止&#8230;&#8230;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">enable&nbsp;</span><span style="COLOR: #800000; FONT-WEIGHT: bold">[</span><span style="COLOR: #800000">once</span><span style="COLOR: #800000; FONT-WEIGHT: bold">]</span><span style="COLOR: #000000">&nbsp;breaknum&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启用或者仅启用一次&#8230;&#8230;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">--------------------------------<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">watch&nbsp;expr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//expr值改变时停止程序，用于捕获错误很有效<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">run(r)&nbsp;arg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//从头开始运行程序，并以arg作为参数（可多个）<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">continue(c)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//继续被中断的程序，不能用作程序的运行启动<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">step(s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//单步进入，跟踪到函数内<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">next(n)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//单步，不进入函数内<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">list(l)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//显示源代码（正在执行区域附件10行）<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">backtrace(bt)&nbsp;/&nbsp;where(w)&nbsp;&nbsp;&nbsp;&nbsp;//显示函数栈的内容<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">print(p)&nbsp;expr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//查看变量或者表达式的值<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">display&nbsp;expr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//每次中断时，显示expr的值<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">undisplay&nbsp;</span><span style="COLOR: #800000; FONT-WEIGHT: bold">[</span><span style="COLOR: #800000">expr</span><span style="COLOR: #800000; FONT-WEIGHT: bold">]</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//取消display，没有参数的话则取消全部<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">whatis&nbsp;expr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//显示expr的资料形态，例如变量类型等<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">------------------------------<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">set&nbsp;width&nbsp;</span><span style="COLOR: #000000">70</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置屏幕列数<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">quit(q)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//终止退出<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">kill(k)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//终止正在调试的程序，但不退出调试，可重来<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//装入想要调试的可执行文件<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">shell&nbsp;command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在gdb中直接运行shell命令且不需要退出gdb<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">help&nbsp;command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//command命令说明<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">complete&nbsp;arg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//列出所有arg开头的命令<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">Esc&nbsp;+&nbsp;Shift&nbsp;+&nbsp;?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//查看所有命令的列表<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">------------------------------<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">attach&nbsp;pidat&nbsp;pid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//接上一个执行的进程pid，这会使pid暂停，中断任何sleep以及可中断的系统调用<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">detach&nbsp;pid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//解除目前接上的进程pid<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">jump&nbsp;address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//跳到指定的内存位置，并开始执行<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">make&nbsp;filename&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//不退出gdb就能重新产生可执行文件</span></div>
注意：<br>（1）有的命令后面可以跟参数，例如step接受一个参数表示单步执行多少步；有的命令不接受任何参数。<br>（2）空行表示重复上一个命令；有的命令不可重复，例如run；还有一些重复后会产生严重后果，建议不使用空行重复。<br>（3）可以使用gdb的info(i)和show命令来查询程序状态，每个命令可以查询一系列的状态，具体如下：<br>info：<br>info breakpoints&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //查看断点情况<br>info args&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //查看程序参数<br>info display&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//查看所有display<br>info stack&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //查看函数栈内容，与backtrace相同<br>info watchpoints&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //查看观察点<br>show：<br>show version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //显示gdb版本号<br>show copying&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //显示版权信息<br>set：<br>set命令用来为程序设置运行环境，比如可以用set prompt $ 来把gdb提示符设置为$。使用set命令可以改变绝大多数show显示的信息。<br><br>第四，调试完成后，可以使用strip命令删除那些带有-g选项的C编译程序所生成的信息，释放一些磁盘空间。<br>strip命令减少XCOFF对象文件的大小，strip命令从XCOFF对象文件中有选择地除去行号信息、重定位信息、调试段、注释段、文件头以及所有或部分符号表。一旦使用该命令，则很难调试文件的符号，因此通常只在已经调试和测试过的生成模块上使用strip命令。<br><strong>/usr/binstrip [选项] file</strong>&nbsp;<br>strip的具体选项信息在这里不作总结。<br><br><br>
<img src ="http://www.cppblog.com/amazon/aggbug/103809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-12-23 16:10 <a href="http://www.cppblog.com/amazon/archive/2009/12/23/103809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Install Adobe FlashPlayer for LInux</title><link>http://www.cppblog.com/amazon/archive/2009/07/03/89188.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Fri, 03 Jul 2009 13:29:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/07/03/89188.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/89188.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/07/03/89188.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/89188.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/89188.html</trackback:ping><description><![CDATA[第一次装ubuntu系统，果然什么都要自己重新配置。Firefox下想看视频要装Adobe FlashPlayer for Linux，步骤如下：<br><br>1.在网上下载个install_flash_player_10_linux.tar.gz<br>2.解压缩后得到libflashplayer.so<br>3.将该文件放入/usr/lib/firefox/plugins中，打开Firefox即可使用。<br><br><br><br>
<img src ="http://www.cppblog.com/amazon/aggbug/89188.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-07-03 21:29 <a href="http://www.cppblog.com/amazon/archive/2009/07/03/89188.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu智能拼音安装方法【转载】</title><link>http://www.cppblog.com/amazon/archive/2009/07/03/89154.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Fri, 03 Jul 2009 05:29:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/07/03/89154.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/89154.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/07/03/89154.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/89154.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/89154.html</trackback:ping><description><![CDATA[原文：<span style="COLOR: red">http://canofy.javaeye.com/blog/274426</span><br><br>下面是步骤： <br><br>1).终端输入：sudo apt-get remove scim <br><br>这一步是删除安装系统的时候装的那个scim，实际是个假的，我这里不可以用 <br><br>2）sudo apt-get install scim <br><br>这一步下载安装scim输入法。下载完了系统会自己装上，中间会有提示，直接y就行了 <br><br>3）sudo apt-get install scim-chinese <br><br>这一步是下载安装中文输入法，前面那一步只是下载一个可以运行输入法的平台，现在是在这个具体平台上安装中文输入 <br><br>4) sudo gedit /etc/X11/Xsession.d /95xinput <br><br>这个步骤是新建一个95xinput的文件，该文件的具体内容如下： <br><br>Java代码 复制代码：<br><br>/usr/bin/scim -d <br>XMODIFIERS="@im=SCIM" <br>export XMODIFIERS <br>export GTK_IM_MODULE=scim <br><br>具体为什么，我也不知道，反正可以用。 <br><br>然后，确定无误后，保存，退出gedit <br><br>5）exit 退出终端 <br><br>6）Logout，重新登录，然后用Ctrl+Space就可以激活中文输入法啦～<br><br><br><br><br>
 <img src ="http://www.cppblog.com/amazon/aggbug/89154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-07-03 13:29 <a href="http://www.cppblog.com/amazon/archive/2009/07/03/89154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>