<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Java爱-我们的编程世界</title><subtitle type="text">Java，XML，J2EE，J2ME，新手入门，核心技术，开源技术，创造与分享，我们的智慧。</subtitle><id>http://feed.cnblogs.com/blog/u/79468/rss</id><updated>2011-07-20T13:41:40Z</updated><author><name>Java爱</name><uri>http://www.cnblogs.com/Javalove/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Javalove/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/79468/rss"/><entry><id>http://www.cnblogs.com/Javalove/archive/2011/05/13/2045294.html</id><title type="text">如何停止Linux系统中占用CPU 100%的进程</title><summary type="text">linux 很好,占用系统资源低,低端机都可以流畅的运行.但是偶尔也会遇到像windows下烦人的问题,那就是进程占用CPU100%. 最近我就遇到了这个问题,还好,我使用了一套组合拳,把占用CPU资源100%的进程给干掉了. 步骤是: 1)先top,查看进程运行状况,包括进程ID,CPU占用率等.Linux还是比较友好的,他会把CPU使用率最大的放在最上面,很快我就找到了罪魁祸首:ID:20641 ... 2)找到了进程,那再仔细看一下也无妨,然后ps ax,查看进程运行状况.可以查看到进程的ID号,那个用户在使用,进程命令是什么等. 3)情况了解了,原来是vi init在作怪,用kill.</summary><published>2011-05-13T03:01:00Z</published><updated>2011-05-13T03:01:00Z</updated><author><name>Java爱</name><uri>http://www.cnblogs.com/Javalove/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Javalove/archive/2011/05/13/2045294.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Javalove/archive/2011/05/13/2045294.html"/><content type="html">&lt;p&gt;linux 很好,占用系统资源低,低端机都可以流畅的运行.但是偶尔也会遇到像windows下烦人的问题,那就是进程占用CPU100%.&lt;br /&gt;最近我就遇到了这个问题,还好,我使用了一套组合拳,把占用CPU资源100%的进程给干掉了.&lt;br /&gt;步骤是:&lt;br /&gt;1)先top,查看进程运行状况,包括进程ID,CPU占用率等.Linux还是比较友好的,他会把CPU使用率最大的放在最上面,很快我就找到了罪魁祸首:ID:20641 ... &lt;/p&gt;&lt;p&gt;2)找到了进程,那再仔细看一下也无妨,然后ps ax,查看进程运行状况.可以查看到进程的ID号,那个用户在使用,进程命令是什么等.&lt;br /&gt;3)情况了解了,原来是vi init在作怪,用kill -9 20641强制干掉此进程.&lt;br /&gt;再TOP一次.好了,CPU使用率恢复正常了.&lt;br /&gt;附命令用法:&lt;br /&gt;1.top&lt;br /&gt;使用权限：所有使用者 &lt;br /&gt;使用方式：top [-][d delay][q][c][S][s][n] &lt;br /&gt;说明：即时显示process的动态 &lt;br /&gt;参数: &lt;br /&gt;d:改变显示的更新速度，或是在交谈式指令列(interactive command)按s &lt;br /&gt;q:没有任何延迟的显示速度，如果使用者是有superuser的权限，则top将会以最高的优先序执行 &lt;br /&gt;c:切换显示模式，共有两种模式，一是只显示执行档的名称，另一种是显示完整的路径与名称S:累积模式，会将己完成或消失的子行程 (dead child process )的CPU time累积起来 &lt;br /&gt;s:安全模式，将交谈式指令取消,避免潜在的危机 &lt;br /&gt;i:不显示任何闲置(idle)或无用(zombie)的行程 &lt;br /&gt;n:更新的次数，完成后将会退出top &lt;br /&gt;b:批次档模式，搭配"n"参数一起使用，可以用来将top的结果输出到档案内&lt;br /&gt;范例： &lt;br /&gt;显示更新十次后退出 ; &lt;br /&gt;top -n 10&lt;br /&gt;使用者将不能利用交谈式指令来对行程下命令 : &lt;br /&gt;top -s&lt;br /&gt;将更新显示二次的结果输入到名称为 top.log 的档案里 : &lt;br /&gt;top -n 2 -b &amp;lt; top.log&lt;br /&gt;2.ps&lt;br /&gt;1）ps a 显示现行终端机下的所有程序，包括其他用户的程序。&lt;br /&gt;2）ps -A 显示所有程序。&lt;br /&gt;3）ps c 列出程序时，显示每个程序真正的指令名称，而不包含路径，参数或常驻服务的标示。&lt;br /&gt;4）ps -e 此参数的效果和指定"A"参数相同。&lt;br /&gt;5）ps e 列出程序时，显示每个程序所使用的环境变量。&lt;br /&gt;6）ps f 用ASCII字符显示树状结构，表达程序间的相互关系。&lt;br /&gt;7）ps -H 显示树状结构，表示程序间的相互关系。&lt;br /&gt;8）ps -N 显示所有的程序，除了执行ps指令终端机下的程序之外。&lt;br /&gt;9）ps s 采用程序信号的格式显示程序状况。&lt;br /&gt;10）ps S 列出程序时，包括已中断的子程序资料。&lt;br /&gt;11）ps -t&amp;lt;终端机编号&amp;gt; 　指定终端机编号，并列出属于该终端机的程序的状况。&lt;br /&gt;12）ps u 　以用户为主的格式来显示程序状况。&lt;br /&gt;13）ps x 　显示所有程序，不以终端机来区分。&lt;br /&gt;最常用的方法是ps -aux,然后再利用一个管道符号导向到grep去查找特定的进程,然后再对特定的进程进行操作。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a target="_blank" href="http://www.linuxhao.com"&gt;Linux好学堂&lt;/a&gt;， &lt;a href="http://www.linuxhao.com"&gt;www.linuxhao.com&lt;/a&gt;，提供Linux安装指南,Linux系统管理,Linux网络应用,Linux服务器技术,Linux编程开发,Linux下载中心。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Javalove/aggbug/2045294.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Javalove/archive/2011/05/13/2045294.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Javalove/archive/2011/05/12/2043967.html</id><title type="text">Linux Shell变量使用的方法</title><summary type="text">一、本地变量的使用本地变量就如同局部变量一样，只在本SHELL中起作用。它不会影响到其他SHELL中的变量。1。显示变量值可以使用echo命令。需要注意的是，使用变量的时候必须在变量名前加上$符号2。清除变量使用unset命令可以清除命令。3。显示所有本地SHELL变量SHELL中预定义了一些环境变量。要想显示这些命令，可以使用set命令。 另外，用户自己已经定义过的本地变量也会在其中显示。4。测试变量是否已经赋值${variable:-value}如果变量已经赋值，则使用该变量值。如果变量为空，则使用value。需要注意的是，value并不赋给variable。${variable:=val</summary><published>2011-05-12T00:07:00Z</published><updated>2011-05-12T00:07:00Z</updated><author><name>Java爱</name><uri>http://www.cnblogs.com/Javalove/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Javalove/archive/2011/05/12/2043967.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Javalove/archive/2011/05/12/2043967.html"/><content type="html">&lt;p&gt;一、本地变量的使用&lt;br /&gt;本地变量就如同局部变量一样，只在本SHELL中起作用。它不会影响到其他SHELL中的变量。&lt;/p&gt;&lt;p&gt;1。显示变量值&lt;br /&gt;可以使用echo命令。需要注意的是，使用变量的时候必须在变量名前加上$符号&lt;br /&gt;2。清除变量&lt;br /&gt;使用unset命令可以清除命令。&lt;br /&gt;3。显示所有本地SHELL变量&lt;br /&gt;SHELL中预定义了一些环境变量。要想显示这些命令，可以使用set命令。 &lt;/p&gt;&lt;p&gt;另外，用户自己已经定义过的本地变量也会在其中显示。&lt;br /&gt;4。测试变量是否已经赋值&lt;br /&gt;${variable:-value}&lt;br /&gt;如果变量已经赋值，则使用该变量值。如果变量为空，则使用value。需要注意的是，value并不赋给variable。&lt;br /&gt;${variable:=value}&lt;br /&gt;该表达式上面的区别就是，如果variable为空，则value赋给variable。&lt;/p&gt;&lt;p&gt;如果需要检验变量是否为空，如果为空的话则显示带有系统错误信息，则使用下面的表达式：&lt;br /&gt;${variable:?}&lt;br /&gt;如果需要显示自己定义的信息，则如下：&lt;br /&gt;${variable:?"customed message "}&lt;/p&gt;&lt;p&gt;5。设置只读变量&lt;br /&gt;使用readonly可以将变量定义成只读。&lt;br /&gt;readonly variable&lt;br /&gt;单独执行readonly可以显示所有的只读变量。&lt;/p&gt;&lt;p&gt;二、环境变量&lt;br /&gt;环境变量用于所有的用户进程。在Linux中，登陆进程称为父进程，shell中执行的用户程序均称为子进程。&lt;br /&gt;环境变量可以在命令行中设置，但用户注销时这些值将丢失。因此最好在$HOME/目录下的.profile中定义。&lt;br /&gt;传统上环境变量均为大写。环境变量应用于用户进程之前，必须用export命令导出。设置方法与本地变量设置方法相同。&lt;br /&gt;1。显示环境变量&lt;br /&gt;使用env命令可以察看所有环境变量&lt;br /&gt;2。潜入SHELL变量&lt;br /&gt;EXINIT保存使用vi编辑器的初始化选项。比如要显示行号，则如下：&lt;br /&gt;EXINIT='set nu';export EXINIT&lt;br /&gt;HOME:用于记录用户的主目录；&lt;br /&gt;IFS：用作shell指定的缺省域分隔符。&lt;br /&gt;PATH：保存进行命令或脚本查找的目录顺序。可以在.profile中进行设置。&lt;br /&gt;3。将变量导出到子进程&lt;br /&gt;在父脚本中使用export命令可以将变量导出，这样子脚本便可以知道该变量的值。&lt;/p&gt;&lt;p&gt;三、位置变量参数&lt;br /&gt;在向脚本传递参数时，可以使用此位置变量来获取参数。&lt;br /&gt;他们分别是：&lt;br /&gt;$0:脚本名字。此变量包含地址，可以使用basename $0获得脚本名称。&lt;br /&gt;$1:第一个参数&lt;br /&gt;$2,$3,$4,$5,...一次类推。&lt;/p&gt;&lt;p&gt;四、特定变量参数&lt;br /&gt;一些脚本运行的相关控制信息&lt;br /&gt;$# 传递到脚本的参数个数&lt;br /&gt;$* 以一个单字符串显示所有向脚本传递的参数&lt;br /&gt;$$ 脚本运行的ID号&lt;br /&gt;$! 后台运行的最后一个进程的ID号&lt;br /&gt;$@ 与$#相同，但是使用时加引号，并在引号中返回每个参数。&lt;br /&gt;$- 显示shell使用的当前选项。&lt;br /&gt;$? 显示最后命令的推出状况。0表示没有错误。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a target="_blank" href="http://www.linuxhao.com/"&gt;Linux好学堂&lt;/a&gt;， &lt;a href="http://www.linuxhao.com"&gt;www.linuxhao.com&lt;/a&gt;，提供Linux视频教程,Linux培训教程,Linux技术资料免费下载。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Javalove/aggbug/2043967.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Javalove/archive/2011/05/12/2043967.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Javalove/archive/2011/05/09/2040939.html</id><title type="text">Linux虚拟内存优化的方法</title><summary type="text">首先查看虚拟内存的使用情况，使用命令 # free 查看当前系统的内存使用情况。 一般来说，linux的物理内存几乎是完全used。这个和windows非常大的区别，它的内存管理机制将系统内存充分利用，并非windows无论多大的内存都要去使用一些虚拟内存一样。这点需要注意。 Linux下面虚拟内存的默认配置通过命令 # cat /proc/sys/vm/freepages 可以查看，显示的三个数字是当前系统的：最小内存空白页、最低内存空白页和最高内存空白。 注意，这里系统使用虚拟内存的原则是：如果空白页数目低于最高空白页设置，则使用磁盘交换空间。当达到最低空白页设置时，使用内存交换（注：这.</summary><published>2011-05-09T02:59:00Z</published><updated>2011-05-09T02:59:00Z</updated><author><name>Java爱</name><uri>http://www.cnblogs.com/Javalove/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Javalove/archive/2011/05/09/2040939.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Javalove/archive/2011/05/09/2040939.html"/><content type="html">&lt;p&gt;首先查看虚拟内存的使用情况，使用命令 &lt;br /&gt;# free &lt;br /&gt;查看当前系统的内存使用情况。&lt;br /&gt;一般来说，linux的物理内存几乎是完全used。这个和windows非常大的区别，它的内存管理机制将系统内存充分利用，并非windows无论多大的内存都要去使用一些虚拟内存一样。这点需要注意。 &lt;br /&gt;Linux下面虚拟内存的默认配置通过命令&lt;br /&gt;# cat /proc/sys/vm/freepages &lt;/p&gt;&lt;p&gt;可以查看，显示的三个数字是当前系统的：最小内存空白页、最低内存空白页和最高内存空白。&lt;br /&gt;注意，这里系统使用虚拟内存的原则是：如果空白页数目低于最高空白页设置，则使用磁盘交换空间。当达到最低空白页设置时，使用内存交换（注：这个是我查看一些资料得来的，具体应用时还需要自己观察一下，不过这个不影响我们配置新的虚拟内存参数）。 &lt;br /&gt;内存一般以每页4k字节分配。最小内存空白页设置是系统中内存数量的2倍；最低内存空白页设置是内存数量的4倍；最高内存空白页设置是系统内存的6倍。这些值在系统启动时决定。&lt;br /&gt;一般来讲在配置系统分配的虚拟内存配置上，我个人认为增大最高内存空白页是一种比较好的配置方式，以1G的内存配置为例：&lt;br /&gt;可将原来的配置比例修改为： &lt;br /&gt;2048 4096 6444&lt;br /&gt;通过命令&lt;br /&gt;# echo \"2048 4096 6444\" &amp;gt; /proc/sys/vm/freepages&lt;br /&gt;因为增加了最高空白页配置，那么可以使内存更有效的利用。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a target="_blank" href="http://www.linuxhao.com"&gt;Linux好学堂&lt;/a&gt;， &lt;a href="http://www.linuxhao.com"&gt;www.linuxhao.com&lt;/a&gt;，包括Linux安装指南,Linux系统管理,Linux网络应用,Linux服务器技术,Linux编程开发,Linux下载中心。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Javalove/aggbug/2040939.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Javalove/archive/2011/05/09/2040939.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Javalove/archive/2011/05/07/2039658.html</id><title type="text">关于Linux内存管理的认识</title><summary type="text">我们都知道，内核把线性地址（大多数情况也叫虚拟地址）分为三个部分：物理内存映射区，VMALLOC映射区以及固定映射地址区。这里主要讨论前两种。 所谓的物理内存映射区是指与物理内存一一映射的区域。举个例子来说，如果系统有物理内存512M，那么从0xc0000000至0xc00000000+512M的线性地址就属于物理内存映射区。这块线性地址在系统初始化时就与物理内存建立起一一对应的关系。这里的一一映射是指物理地址和线性地址就差一个偏移量0xc0000000，函数__pa()就是直接把线性地址减去0xc0000000得到物理地址。所以该函数应用范围也就局限于物理地址映射区。对另两个地址区进行__.</summary><published>2011-05-07T03:14:00Z</published><updated>2011-05-07T03:14:00Z</updated><author><name>Java爱</name><uri>http://www.cnblogs.com/Javalove/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Javalove/archive/2011/05/07/2039658.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Javalove/archive/2011/05/07/2039658.html"/><content type="html">&lt;p&gt;我们都知道，内核把线性地址（大多数情况也叫虚拟地址）分为三个部分：物理内存映射区，VMALLOC映射区以及固定映射地址区。这里主要讨论前两种。&lt;/p&gt;&lt;p&gt;所谓的物理内存映射区是指与物理内存一一映射的区域。举个例子来说，如果系统有物理内存512M，那么从0xc0000000至0xc00000000+512M的线性地址就属于物理内存映射区。这块线性地址在系统初始化时就与物理内存建立起一一对应的关系。这里的一一映射是指物理地址和线性地址就差一个偏移量0xc0000000，函数__pa()就是直接把线性地址减去0xc0000000得到物理地址。所以该函数应用范围也就局限于物理地址映射区。对另两个地址区进行__pa()是错误的。道理很简单，物理地址都没那么大。&lt;/p&gt;&lt;p&gt;VMALLOC映射区的特点是连续的线性地址，其物理地址不一定连续。这种映射特点和用户地址空间的映射方式是一样的。而前面讲的物理内存映射区，线性地址和物理地址显然都是连续的。当然了，最后的映射肯定是指线性地址和物理地址之间的映射。所以这部分的线性地址最终也需映射到物理内存中。这就会和物理内存映射区产生冲突：因为所有的物理内存在物理内存映射区已经有了一个线性地址了。但是我们知道，物理内存并不是每时每刻都在使用的，也就是说虽然它已经映射了，但是还没有人使用它。那么我们可以在VMALLOC映射区中先映射到那些没使用的内存并锁住。这样这些内存就不会再被分配作为其他用途。所以虽然映射有冲突，但是没有两个线性地址在同时使用。&lt;/p&gt;&lt;p&gt;因为VMALLOC映射区的线性地址和物理地址没有固定的映射关系，我们只能通过查找页表来找到对应的物理页框。值得一提的是，物理页框(struct page结构体）的vitual字段仍然存放的是物理内存映射区的线性地址，也就是说如果对该物理地址进行__page_to_vir()运算后，所得的线性地址不是VMALLOC映射区的线性地址。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a target="_blank" href="http://www.linuxhao.com/"&gt;Linux好学堂&lt;/a&gt;， &lt;a href="http://www.linuxhao.com"&gt;www.linuxhao.com&lt;/a&gt;，提供Linux视频教程,Linux培训教程,Linux技术资料免费下载与资源共享等服务。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Javalove/aggbug/2039658.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Javalove/archive/2011/05/07/2039658.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Javalove/archive/2011/05/06/2038656.html</id><title type="text">Linux文件系统的恢复方法</title><summary type="text">当文件系统被破坏时，如果使用的是ext2fs类型的文件系统，就可从软盘运行e2fsck命令来修正文件系统中被损坏的数据。对于其他类型的文件系统，可以使用相应的fsck命令。当从软盘上检查文件系统时，最好不要mount安装。 注：文件系统被破坏的常见原因是超级块被损坏，超级块是文件系统的“头部”。它包含文件系统的状态、大小和空闲磁盘块等信息。如果损坏了一个文件系统的超级块（例如不小心直接将数据写到了文件系统的超级块分区中），那么系统可能会完全不识别该文件系统，这样也就不能安装它了，即使采用e2fsck命令也不能处理这个问题。 不过，ext2fs类型的文件系统将超级块的内容进行了备份，并存放于驱动</summary><published>2011-05-06T03:03:00Z</published><updated>2011-05-06T03:03:00Z</updated><author><name>Java爱</name><uri>http://www.cnblogs.com/Javalove/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Javalove/archive/2011/05/06/2038656.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Javalove/archive/2011/05/06/2038656.html"/><content type="html">&lt;p&gt;当文件系统被破坏时，如果使用的是ext2fs类型的文件系统，就可从软盘运行e2fsck命令来修正文件系统中被损坏的数据。对于其他类型的文件系统，可以使用相应的fsck命令。当从软盘上检查文件系统时，最好不要mount安装。 &lt;br /&gt;注：文件系统被破坏的常见原因是超级块被损坏，超级块是文件系统的&amp;ldquo;头部&amp;rdquo;。它包含文件系统的状态、大小和空闲磁盘块等信息。如果损坏了一个文件系统的超级块（例如不小心直接将数据写到了文件系统的超级块分区中），那么系统可能会完全不识别该文件系统，这样也就不能安装它了，即使采用e2fsck命令也不能处理这个问题。&amp;nbsp; &lt;/p&gt;&lt;p&gt;不过，ext2fs类型的文件系统将超级块的内容进行了备份，并存放于驱动程序的块组（block group）边界。可以用命令通知e2fsck使用超级块的备份,e2fsck -b 8193是指文件系统所在的分区，-b 8193选项用于显示存放在文件系统中的8193块的超级块备份数据。 &lt;br /&gt;恢复丢失的文件 &lt;br /&gt;如果不小心删除了重要的系统文件，虽然没有办法直接恢复，但是还可以将相应的文件利用急救盘复制到硬盘上。例如，如果删除了文件/bin/login，此时系统无法正常运行到登录界面，可以用急救盘启动系统，将硬盘文件系统安装到/mnt目录下，然后使用如下命令： &lt;br /&gt;&lt;br /&gt;#cp -a /bin/login /mnt/bin&lt;br /&gt;其中 &amp;ldquo;-a&amp;rdquo;选项用于告诉cp在拷贝时保持文件的访问权限。 当然如果被删除的基本文件不在&amp;ldquo;急救盘组&amp;rdquo;中，也就不能用这种方法了。如果以前做过系统备份的话，那么也可以用以前的备份来恢复。 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a target="_blank" href="http://www.linuxhao.com"&gt;Linux好学堂&lt;/a&gt;， &lt;a href="http://www.linuxhao.com"&gt;www.linuxhao.com&lt;/a&gt;，是学习Linux应用开发综合性技术网站。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Javalove/aggbug/2038656.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Javalove/archive/2011/05/06/2038656.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Javalove/archive/2011/05/04/2036231.html</id><title type="text">Linux模式匹配问题的研究</title><summary type="text">#include #include #include #include #include //对输入的模式与待匹配的字符串进行匹配；成功返回0；//pattern : 模式// buf : 待匹配的字符串；int regexp(char *pattern, char * buf) { regex_t reg; int status = 0;int cflags = REG_EXTENDED|REG_NOSUB; char error[32];/* 编译正则表达式*/ status = regcomp (®, pattern, cflags); if (status != 0){ re</summary><published>2011-05-04T02:47:00Z</published><updated>2011-05-04T02:47:00Z</updated><author><name>Java爱</name><uri>http://www.cnblogs.com/Javalove/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Javalove/archive/2011/05/04/2036231.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Javalove/archive/2011/05/04/2036231.html"/><content type="html">&lt;p&gt;#include &lt;br /&gt;#include &lt;br /&gt;#include &lt;br /&gt;#include &lt;br /&gt;#include &lt;/p&gt;&lt;p&gt;//对输入的模式与待匹配的字符串进行匹配；成功返回0；&lt;br /&gt;//pattern : 模式&lt;br /&gt;// buf : 待匹配的字符串；&lt;br /&gt;int regexp(char *pattern, char * buf) &lt;/p&gt;&lt;p&gt;{ &lt;br /&gt;regex_t reg; &lt;br /&gt;int status = 0;&lt;br /&gt;int cflags = REG_EXTENDED|REG_NOSUB; &lt;br /&gt;char error[32];&lt;/p&gt;&lt;p&gt;/* 编译正则表达式*/ &lt;br /&gt;status = regcomp (&amp;reg;, pattern, cflags); &lt;br /&gt;if (status != 0)&lt;br /&gt;{ &lt;br /&gt;regerror(status, &amp;reg;, error, sizeof(error));&lt;br /&gt;printf("regcomp ERROR -&amp;gt; %s: pattern '%s'\n", pattern, error);&lt;br /&gt;return -1; &lt;br /&gt;} &lt;/p&gt;&lt;p&gt;//进行匹配&lt;br /&gt;status = regexec(&amp;reg;, buf, 0, NULL, 0); &lt;br /&gt;if(status != 0)&lt;br /&gt;{&lt;br /&gt;if(status != REG_NOMATCH)&lt;br /&gt;{&lt;br /&gt;regerror(status, &amp;reg;, error, sizeof(error));&lt;br /&gt;printf("regexec -&amp;gt; NON REG_NOMATCH -&amp;gt; ERROR -&amp;gt; status = %d: '\n", error);&lt;br /&gt;status = -2;&lt;br /&gt;}&lt;br /&gt;else if(status == REG_NOMATCH)&lt;br /&gt;{&lt;br /&gt;printf("regexec -&amp;gt; REG_NOMATCH -&amp;gt; ERROR -&amp;gt; status = %d: '\n", error);&lt;br /&gt;status = -3;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;else &lt;br /&gt;{&lt;br /&gt;printf("regexec -&amp;gt; REG_NOMATCH -&amp;gt; SUCCESS -&amp;gt; pattern = %s, buf = %s \n", pattern, buf);&lt;br /&gt;status = 0;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;/* 输出处理结果 */ &lt;br /&gt;//如果有必要可以输出匹配的结果；&lt;/p&gt;&lt;p&gt;/* 释放正则表达式 */ &lt;br /&gt;regfree(&amp;reg;); &lt;/p&gt;&lt;p&gt;//返回处理结果；&lt;br /&gt;return status; &lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;/* 主程序 */ &lt;/p&gt;&lt;p&gt;int main(int argc, char** argv) &lt;/p&gt;&lt;p&gt;{&lt;br /&gt;//char * pattern = "^[0-9]*[1-9][0-9]*$";&lt;br /&gt;char *pattern = "^[0-9]+$";&lt;br /&gt;//char *pattern = "^\\d+$";&lt;br /&gt;char *buf = "00000";&lt;/p&gt;&lt;p&gt;int a = regexp(pattern, buf);&lt;br /&gt;printf("main -&amp;gt; INFO -&amp;gt; a = %d \n", a);&lt;br /&gt;}&lt;br /&gt;注：不支持正则表达式的控制。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a target="_blank" href="http://www.linuxhao.com/"&gt;Linux好学堂&lt;/a&gt;， &lt;a href="http://www.linuxhao.com/"&gt;www.linuxhao.com&lt;/a&gt;，是学习Linux应用开发综合性技术网站，类目包括Linux安装指南,Linux系统管理,Linux网络应用,Linux服务器技术,Linux编程开发,Linux下载中心，并提供Linux视频教程,Linux培训教程,Linux技术资料免费下载与资源共享等服务。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Javalove/aggbug/2036231.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Javalove/archive/2011/05/04/2036231.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Javalove/archive/2011/05/04/2036218.html</id><title type="text">Linux下lib编程详解</title><summary type="text">一、lib类型：与windows下静态库(.lib)和动态库(.dll)一样，linux同样存在静态库(static library 文件后缀为.a)和共享库(shared library 文件后缀为.so)，在/usr/lib目录下同时存在一个库的静态版本和动态版本。"An archive (or static library) is simply a collection of object files stored as a single file.When you provide an archive to the linker, the linker searches th</summary><published>2011-05-04T02:35:00Z</published><updated>2011-05-04T02:35:00Z</updated><author><name>Java爱</name><uri>http://www.cnblogs.com/Javalove/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Javalove/archive/2011/05/04/2036218.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Javalove/archive/2011/05/04/2036218.html"/><content type="html">&lt;p&gt;一、lib类型：&lt;br /&gt;与windows下静态库(.lib)和动态库(.dll)一样，linux同样存在静态库(static library 文件后缀为.a)和共享库(shared library 文件后缀为.so)，在/usr/lib目录下同时存在一个库的静态版本和动态版本。&lt;/p&gt;&lt;p&gt;"An archive (or static library) is simply a collection of object files stored as a single file.When you provide an archive to the linker, the linker searches the archive for the object files it needs, extracts them, and links them into your program much as if you had provided thoseobject files directly."&lt;/p&gt;&lt;p&gt;"A shared library is similar to a archive in that it is a grouping of object files. However, there are many important differences.The most fundamental difference is that when a shared library islinked into a program, the final executable does not actually contain the code that ispresent in the shared library. Instead, the executable merely contains a reference to theshared library."&lt;/p&gt;&lt;p&gt;"the object files that compose the shared library are combined into asingle object file so that a program that links against a shared library always includes allof the code in the library, rather than just those portions that are needed."&lt;/p&gt;&lt;p&gt;以上引自《Advanced Linux Programming》&lt;/p&gt;&lt;p&gt;由此可知，静态库和共享库都是一个obj文件的集合，但静态链接后，执行程序中存在自己所需obj的一份拷贝，而动态链接后，执行程序仅仅是包含对共享库的一个引用。共享库相当于一个由多个obj文件组合而成的obj文件，在链接后其所有代码被加载，不管需要的还是不需要的。&lt;/p&gt;&lt;p&gt;似乎可以得出一个结论：&lt;br /&gt;静态链接后的程序比动态链接的所用存储空间大，因为执行程序中包含了库中代码拷贝；而动态链接的程序比静态链接的所用的运行空间大，因为它将不需要的代码也加载到运行空间。&lt;br /&gt;二、lib编译：&lt;br /&gt;静态库的编译，实际上是一个将.o文件打包的过程。&lt;/p&gt;&lt;p&gt;ar -rc libfunc.a func1.o func2.o # 将f1.o、f2.o编译成静态库libfunc.a&lt;/p&gt;&lt;p&gt;动态库的编译，使用gcc -fPIC -shared编译选项。&lt;/p&gt;&lt;p&gt;gcc -fPIC -shared -o libfunc.so func1.o func2.o # 将f1.o、f2.o编译成动态库libfunc.so&lt;br /&gt;三、lib调用：&lt;br /&gt;静态库的调用比较简单，跟标准库函数调用一样&lt;/p&gt;&lt;p&gt;一个例子：main.c调用./lib目录下libfunc.a库，该库头文件在./inc目录下，编译：&lt;/p&gt;&lt;p&gt;gcc -o test main.c -I./inc -L./lib -lfunc&lt;/p&gt;&lt;p&gt;共享库的调用需要注意库文件放置位置，如果该库文件不在/lib、/usr/lib下，则需要设置LD_LIBRARY_PATH变量。一个例子：main.c调用./lib目录下libfunc.so库，该库头文件在./inc目录下，如果使用编译： &lt;/p&gt;&lt;p&gt;&lt;br /&gt;gcc -o test main.c -I./inc -L./lib -lfunc&lt;br /&gt;./test # 运行错误:error while loading shared libraries: libfunc.so&lt;/p&gt;&lt;p&gt;这是因为动态链接时程序只是存放共享库的名称而不是绝对路径，所以运行时我们需要先设置该库所处位置:&lt;/p&gt;&lt;p&gt;export LD_LIBRARY_PATH=./lib&lt;br /&gt;./test # 运行成功&lt;/p&gt;&lt;p&gt;动态装载共享库：在只有共享库而没有库的头文件，或者你想在运行时动态加载、卸载库时，linux的dl库函数：dlopen、dlclose、dlsym帮你办到，其相当于windows下LoadLibrary、FreeLibrary、GetProcAddress函数&lt;/p&gt;&lt;p&gt;函数原型：&lt;/p&gt;&lt;p&gt;void *dlopen(const char *filename, int flag);&lt;br /&gt;void *dlsym(void *handle, char *symbol);&lt;br /&gt;int dlclose(void *handle);&lt;/p&gt;&lt;p&gt;一个例子：main.c动态装载./lib目录下libfunc.so库，库中有一个函数void print_str(const char*);&lt;/p&gt;&lt;p&gt;/*加载库*/&lt;br /&gt;void *handle = dlopen("libfunc.so", RTLD_LAZY);&lt;br /&gt;/*获得函数的入口*/&lt;br /&gt;void (*pt_str)(const char*);&lt;br /&gt;pt_str = dlsym(handle, "print_str");&lt;br /&gt;/*调用函数*/&lt;br /&gt;pt_str("hello world.");&lt;br /&gt;/*卸载库*/&lt;br /&gt;dlclose(handle);&lt;/p&gt;&lt;p&gt;四、相关说明：&lt;br /&gt;1、共享库特别适合多个程序共享代码，升级程序部分功能模块，实现程序&amp;ldquo;插件&amp;rdquo;功能的情况；而静态库是一劳永逸，编译后不需要带一堂库文件跑，而且不管放置到哪里都可正常运行。&lt;/p&gt;&lt;p&gt;2、当搜索的库文件目录下同时存在该库的静态版本和共享版本时，链接器优先使用共享版本.so，此时你可以使用-static链接选项指定链接静态版本.a。&lt;/p&gt;&lt;p&gt;3、动态库可以导出两个特殊的函数：_init和_fini，前者在动态库被加载后调用，后者在动态库被卸载前调用，我们可以使用这两个函数做些特别的工作。需要注意的是：在定义这两个函数后编译时，需要使用-nostartfiles选项，否则编译器报重复定义错误。 &lt;/p&gt;&lt;p&gt;&lt;br /&gt;4、ldd命令用来查看程序所依赖的共享库，同时也方便我们判断共享ẓ是否被找到；nm命令查看obj文件（.so也是一个obj）中的标识（函数、变量）。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a target="_blank" href="http://www.linuxhao.com"&gt;Linux好学堂&lt;/a&gt;， &lt;a href="http://www.linuxhao.com"&gt;www.linuxhao.com&lt;/a&gt;，是学习Linux应用开发综合性技术网站，类目包括Linux安装指南,Linux系统管理,Linux网络应用,Linux服务器技术,Linux编程开发,Linux下载中心，并提供Linux视频教程,Linux培训教程,Linux技术资料免费下载与资源共享等服务。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Javalove/aggbug/2036218.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Javalove/archive/2011/05/04/2036218.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Javalove/archive/2011/04/30/2033542.html</id><title type="text">Linux内核跟踪函数sys_listen的学习</title><summary type="text">asmlinkage long sys_socketcall(int call, unsigned long __user *args); {unsigned long a[6];/* 从用户空间得到信息,该函数是SMP安全的 */if (copy_from_user(a, args, nargs[call]))return -EFAULT;switch (call) {case SYS_SOCKET:err = sys_socket(a[0], a[1], a[2]);break;case SYS_BIND:err = sys_bind(a[0], (struct sockaddr __us</summary><published>2011-04-30T12:09:00Z</published><updated>2011-04-30T12:09:00Z</updated><author><name>Java爱</name><uri>http://www.cnblogs.com/Javalove/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Javalove/archive/2011/04/30/2033542.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Javalove/archive/2011/04/30/2033542.html"/><content type="html">&lt;p&gt;asmlinkage long sys_socketcall(int call, unsigned long __user *args); &lt;/p&gt;&lt;p&gt;{&lt;br /&gt;unsigned long a[6];&lt;br /&gt;/* 从用户空间得到信息,该函数是SMP安全的 */&lt;br /&gt;if (copy_from_user(a, args, nargs[call]))&lt;br /&gt;return -EFAULT;&lt;/p&gt;&lt;p&gt;switch (call) {&lt;br /&gt;case SYS_SOCKET:&lt;br /&gt;err = sys_socket(a[0], a[1], a[2]);&lt;br /&gt;break;&lt;br /&gt;case SYS_BIND:&lt;br /&gt;err = sys_bind(a[0], (struct sockaddr __user *)a[1], a[2]);&lt;br /&gt;break;&lt;br /&gt;case SYS_CONNECT:&lt;br /&gt;err = sys_connect(a[0], (struct sockaddr __user *)a[1], a[2]);&lt;br /&gt;break;&lt;/p&gt;&lt;p&gt;....&lt;br /&gt;}&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;/*&lt;br /&gt;* 下面跟踪sys_listen函数&lt;br /&gt;*&lt;br /&gt;* 该函数首先通过调用sockfd_lookup_light函数, &lt;br /&gt;* 根据描述符获得拥有该描述符的struct file *file结构, 然后根据该file结构获得struct socket *sock结构&lt;br /&gt;* 从用户空间得到fd和backlog&lt;br /&gt;* 调用sock-&amp;gt;ops-&amp;gt;listen()函数, 该函数在tcp中是inet_listen[net/ipv4/af_inet.c]&lt;br /&gt;* 如果是udp, 则sock-&amp;gt;ops-&amp;gt;listen = sock_no_listen,直接返回&lt;br /&gt;*/&lt;/p&gt;&lt;p&gt;asmlinkage long sys_listen(int fd, int backlog)&lt;br /&gt;{&lt;br /&gt;struct socket *sock;&lt;br /&gt;int err, fput_needed;&lt;/p&gt;&lt;p&gt;/*&lt;br /&gt;* 查找到具有该描述符的struct socket *sock结构&lt;br /&gt;*/&lt;br /&gt;sock = sockfd_lookup_light(fd, &amp;amp;err, &amp;amp;fput_needed);&lt;br /&gt;if (sock) {&lt;br /&gt;if ((unsigned)backlog &amp;gt; sysctl_somaxconn)&lt;br /&gt;backlog = sysctl_somaxconn;&lt;br /&gt;/*&lt;br /&gt;* sock-&amp;gt;ops = &amp;amp;inet_stream_ops || &amp;amp;inet_dgram_ops,&lt;br /&gt;*&lt;br /&gt;* TCP: sock-&amp;gt;ops-&amp;gt;listen = inet_listen &lt;br /&gt;* UDP: sock-&amp;gt;ops-&amp;gt;listen = sock_no_listen&lt;br /&gt;*/&lt;br /&gt;err = sock-&amp;gt;ops-&amp;gt;listen(sock, backlog);&lt;/p&gt;&lt;p&gt;fput_light(sock-&amp;gt;file, fput_needed);&lt;br /&gt;}&lt;br /&gt;return err;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;/*&lt;br /&gt;* inet_listen函数中,首先判断该sock的状态是否SS_UNCONNECTED 且类型 是否是SOCK_STREAM, 否的话直接退出&lt;br /&gt;* 然后 判断该sock-&amp;gt;sk是否是已侦听状态, 如果是就直接设置backlog, 退出&lt;br /&gt;* 否则调用 inet_csk_listen_start[net/ipv4/inet_connection_sock.c]&lt;br /&gt;*/&lt;br /&gt;int inet_listen(struct socket *sock, int backlog)&lt;br /&gt;{&lt;br /&gt;struct sock *sk = sock-&amp;gt;sk;&lt;br /&gt;unsigned char old_state;&lt;br /&gt;int err;&lt;/p&gt;&lt;p&gt;lock_sock(sk);&lt;/p&gt;&lt;p&gt;err = -EINVAL;&lt;br /&gt;if (sock-&amp;gt;state != SS_UNCONNECTED || sock-&amp;gt;type != SOCK_STREAM)&lt;br /&gt;goto out;&lt;/p&gt;&lt;p&gt;old_state = sk-&amp;gt;sk_state;&lt;br /&gt;if (!((1 &amp;lt;&amp;lt; old_state) &amp;amp; (TCPF_CLOSE | TCPF_LISTEN)))&lt;br /&gt;goto out;&lt;/p&gt;&lt;p&gt;/* Really, if the socket is already in listen state&lt;br /&gt;* we can only allow the backlog to be adjusted.&lt;br /&gt;*/&lt;br /&gt;if (old_state != TCP_LISTEN) {&lt;br /&gt;err = inet_csk_listen_start(sk, backlog);&lt;br /&gt;if (err)&lt;br /&gt;goto out;&lt;br /&gt;}&lt;br /&gt;sk-&amp;gt;sk_max_ack_backlog = backlog;&lt;br /&gt;err = 0;&lt;/p&gt;&lt;p&gt;out:&lt;br /&gt;release_sock(sk);&lt;br /&gt;return err;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;/*&lt;br /&gt;* inet_csk_listen_start[net/ipv4/inet_connection_sock.c]&lt;br /&gt;* 该函数首先调用reqsk_queue_alloc[net/core/request_sock.c]申请一块内存, 存放侦听 队列 for accept;&lt;br /&gt;* 然后设置侦听状态,并把该struct sock *sk放入tcp_hashinfo.ehash中&lt;br /&gt;*/&lt;/p&gt;&lt;p&gt;int inet_csk_listen_start(struct sock *sk, const int nr_table_entries)&lt;br /&gt;{&lt;br /&gt;struct inet_sock *inet = inet_sk(sk);&lt;br /&gt;struct inet_connection_sock *icsk = inet_csk(sk);&lt;br /&gt;int rc = reqsk_queue_alloc(&amp;amp;icsk-&amp;gt;icsk_accept_queue, nr_table_entries);&lt;/p&gt;&lt;p&gt;if (rc != 0)&lt;br /&gt;return rc;&lt;/p&gt;&lt;p&gt;sk-&amp;gt;sk_max_ack_backlog = 0;&lt;br /&gt;sk-&amp;gt;sk_ack_backlog = 0;&lt;br /&gt;/*&lt;br /&gt;* only memset&lt;br /&gt;* memset(&amp;amp;inet_csk(sk)-&amp;gt;icsk_ack, 0, sizeof(inet_csk(sk)-&amp;gt;icsk_ack));&lt;br /&gt;*/&lt;br /&gt;inet_csk_delack_init(sk);&lt;/p&gt;&lt;p&gt;/*&lt;br /&gt;* 设置侦听状态, 并且判断该端口没有被使用&lt;br /&gt;* 然后 加入到tcp_hashinfo.ehash中&lt;br /&gt;* return 0;&lt;br /&gt;*/&lt;br /&gt;sk-&amp;gt;sk_state = TCP_LISTEN;&lt;br /&gt;if (!sk-&amp;gt;sk_prot-&amp;gt;get_port(sk, inet-&amp;gt;num)) {&lt;br /&gt;inet-&amp;gt;sport = htons(inet-&amp;gt;num);&lt;/p&gt;&lt;p&gt;sk_dst_reset(sk);&lt;br /&gt;sk-&amp;gt;sk_prot-&amp;gt;hash(sk);&lt;/p&gt;&lt;p&gt;return 0;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;sk-&amp;gt;sk_state = TCP_CLOSE;&lt;br /&gt;__reqsk_queue_destroy(&amp;amp;icsk-&amp;gt;icsk_accept_queue);&lt;br /&gt;return -EADDRINUSE;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a target="_blank" href="http://www.linuxhao.com"&gt;Linux好学堂&lt;/a&gt;， &lt;a href="http://www.linuxhao.com"&gt;www.linuxhao.com&lt;/a&gt;，Linux应用开发综合性技术网站，提供Linux视频教程,Linux培训教程,Linux技术资料免费下载。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Javalove/aggbug/2033542.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Javalove/archive/2011/04/30/2033542.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Javalove/archive/2011/04/25/2027672.html</id><title type="text">Linux系统中inode值解析</title><summary type="text">inode 译成中文就是索引节点。每个存储设备或存储设备的分区（存储设备是硬盘、软盘、U盘 ... ... ）被格式化为文件系统后，应该有两部份，一部份是inode，另一部份是Block，Block是用来存储数据用的。而inode呢，就是用来存储这些数据的信息，这些信息包括文件大小、属主、归属的用户组、读写权限等。inode为每个文件进行信息索引，所以就有了inode的数值。操作系统根据指令，能通过inode值最快的找到相对应的文件。 做个比喻，比如一本书，存储设备或分区就相当于这本书，Block相当于书中的每一页，inode 就相当于这本书前面的目录，一本书有很多的内容，如果想查找某部份的内</summary><published>2011-04-25T08:30:00Z</published><updated>2011-04-25T08:30:00Z</updated><author><name>Java爱</name><uri>http://www.cnblogs.com/Javalove/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Javalove/archive/2011/04/25/2027672.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Javalove/archive/2011/04/25/2027672.html"/><content type="html">&lt;p&gt;inode 译成中文就是索引节点。每个存储设备或存储设备的分区（存储设备是硬盘、软盘、U盘 ... ... ）被格式化为文件系统后，应该有两部份，一部份是inode，另一部份是Block，Block是用来存储数据用的。而inode呢，就是用来存储这些数据的信息，这些信息包括文件大小、属主、归属的用户组、读写权限等。inode为每个文件进行信息索引，所以就有了inode的数值。操作系统根据指令，能通过inode值最快的找到相对应的文件。&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;做个比喻，比如一本书，存储设备或分区就相当于这本书，Block相当于书中的每一页，inode 就相当于这本书前面的目录，一本书有很多的内容，如果想查找某部份的内容，我们可以先查目录，通过目录能最快的找到我们想要看的内容。虽然不太恰当，但还是比较形象。 &lt;/p&gt;&lt;p&gt;当我们用ls 查看某个目录或文件时，如果加上-i 参数，就可以看到inode节点了；比如我们前面所说的例子； &lt;/p&gt;&lt;p&gt;[root@localhost ~]# ls -li lsfile.sh &lt;/p&gt;&lt;p&gt;2408949 -rwxr-xr-x 1 root root 7 04-21 12:47 lsfile.sh &lt;/p&gt;&lt;p&gt;lsfile.sh 的inode值是 2408949 ； 查看一个文件或目录的inode，要通过ls 命令的的 -i参数。&lt;br /&gt;2.10 inode 相同的文件是硬链接文件； &lt;/p&gt;&lt;p&gt;在Linux 文件系统中，inode值相同的文件是硬链接文件，也就是说，不同的文件名，inode可能是相同的，一个inode值可以对应多个文件。理解链接文件并不难，看看例子就会了。在Linux中，链接文件是通过ln工具来创建的。 &lt;/p&gt;&lt;p&gt;2.11 创建硬链接，硬链接和源文件关系； &lt;/p&gt;&lt;p&gt;用ln 创建文件硬链接的语法：&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;# ln 源文件 目标文件 &lt;/p&gt;&lt;p&gt;下面我们举一个例子，在这个例子中，我们要为sun.txt 创建其硬链接sun002.txt。然后看一下sun.txt和sun002.txt的属性的变化； &lt;/p&gt;&lt;p&gt;[root@localhost ~]# ls -li sun.txt 注：查看sun.txt的属性； &lt;/p&gt;&lt;p&gt;2408263 -rw-r--r-- 1 root root 29 04-22 21:02 sun.txt 注：这是sun.txt的属性； &lt;/p&gt;&lt;p&gt;[root@localhost ~]# ln sun.txt sun002.txt 注：我们通过ln 来创建sun.txt的硬链接文件sun002.txt &lt;/p&gt;&lt;p&gt;[root@localhost ~]# ls -li sun* 注：我们列一下sun.txt 和sun002.txt &lt;/p&gt;&lt;p&gt;2408263 -rw-r--r-- 2 root root 29 04-22 21:02 sun002.txt &lt;/p&gt;&lt;p&gt;2408263 -rw-r--r-- 2 root root 29 04-22 21:02 sun.txt &lt;/p&gt;&lt;p&gt;我们可以看到sun.txt在没有创建硬链接文件sun002.txt的时候，其链接个数是1（也就是-rw-r--r--后的那个数值），创建了硬链接sun002.txt创建后，这个值变成了2。也就是说，我们每次为sun.txt创建一个新的硬链接文件后，其硬链接个数都会增加1。 &lt;/p&gt;&lt;p&gt;inode值相同的文件，他们的关系是互为硬链接的关系。当我们修改其中一个文件的内容时，互为硬链接的文件的内容也会跟着变化。如果我们删除互为硬链接关系的某个文件时，其它的文件并不受影响。比如我们把sun.txt删除后，我们还是一样能看到sun002.txt的内容，并且sun02.txt仍是存在的。 &lt;/p&gt;&lt;p&gt;可以这么理解，互为硬链接关系的文件，他们好象是克隆体，他们的属性几乎是完全一样； &lt;/p&gt;&lt;p&gt;下面的例子，我们把sun.txt删除，然后我们看一下sun002.txt 是不是能看到其内容。 &lt;/p&gt;&lt;p&gt;[root@localhost ~]# rm -rf sun.txt &lt;/p&gt;&lt;p&gt;[root@localhost ~]# more sun002.txt &lt;/p&gt;&lt;p&gt;注意：硬链接不能为目录创建，只有文件才能创建硬链接。 &lt;/p&gt;&lt;p&gt;2.12 软链接的创建，及软接与源文件的关系； &lt;/p&gt;&lt;p&gt;创建软链接（也被称为符号链接）的语法； &lt;/p&gt;&lt;p&gt;# ln -s 源文文件或目录 目标文件或目录 &lt;/p&gt;&lt;p&gt;软链接也叫符号链接，他和硬链接有所不同，软链接文件只是其源文件的一个标记。当我们删除了源文件后，链接文件不能独立存在，虽然仍保留文件名，但我们却不能查看软链接文件的内容了。 &lt;/p&gt;&lt;p&gt;[root@localhost ~]# ls -li linuxsir001.txt &lt;/p&gt;&lt;p&gt;2408274 -rw-r--r-- 1 root root 29 04-22 21:53 linuxsir001.txt &lt;/p&gt;&lt;p&gt;[root@localhost ~]# ln -s linuxsir001.txt linuxsir002.txt &lt;/p&gt;&lt;p&gt;[root@localhost ~]# ls -li linuxsir001.txt linuxsir002.txt &lt;/p&gt;&lt;p&gt;2408274 -rw-r--r-- 1 root root 29 04-22 21:53 linuxsir001.txt &lt;/p&gt;&lt;p&gt;2408795 lrwxrwxrwx 1 root root 15 04-22 21:54 linuxsir002.txt -&amp;gt; linuxsir001.txt &lt;br /&gt;解释 &lt;/p&gt;&lt;p&gt;上面的例子，首先我们查看 linuxsir001.txt 的属性，比如inode 、所属文件种类、创建或修改时间等... ...我们来对比一下： &lt;/p&gt;&lt;p&gt;首先 对比一下节点：两个文件的节点不同； &lt;/p&gt;&lt;p&gt;其次 两个文件的归属的种类不同 linuxsir001.txt是-，也就是普通文件，而linuxsir002.txt 是l，它是一个链接文件； &lt;/p&gt;&lt;p&gt;第三 两个文件的读写权限不同 linuxsir001.txt 是rw-r--r-- ，而linuxsir002.txt的读写权限是 rwxrwxrwx&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;第三 两者的硬链接个数相同；都是1 &lt;/p&gt;&lt;p&gt;第四 两文件的属主和所归属的用户组相同； &lt;/p&gt;&lt;p&gt;第五 修改(或访问、创建）时间不同； &lt;/p&gt;&lt;p&gt;我们还注意到了linuxsir002.txt 后面有一个标记 -&amp;gt;，这表示linuxsir002.txt 是linuxsir001.txt的软链接文件。 &lt;/p&gt;&lt;p&gt;值得我们注意的是：当我们修改链接文件的内容时，就意味着我们在修改源文件的内容。当然源文件的属性也会发生改变，链接文件的属性并不会发生变化。当我们把源文件删除后，链接文件只存在一个文件名，因为失去了源文件，所以软链接文件也就不存在了。这一点和硬链接是不同的； &lt;/p&gt;&lt;p&gt;[root@localhost ~]# rm -rf linuxsir001.txt 注：删除linuxsir001.txt &lt;/p&gt;&lt;p&gt;[root@localhost ~]# ls -li linuxsir002.txt 注：查看linuxsir002 的属性； &lt;/p&gt;&lt;p&gt;2408795 lrwxrwxrwx 1 root root 15 04-22 21:54 linuxsir002.txt -&amp;gt; linuxsir001.txt &lt;/p&gt;&lt;p&gt;[root@localhost ~]# more linuxsir002.txt 注：查看linuxsir002.txt的内容； &lt;/p&gt;&lt;p&gt;linuxsir002.txt: 没有那个文件或目录 注：得到提示，linuxsir002.txt不存在。 &lt;/p&gt;&lt;p&gt;上面的例子告诉我们，如果一个链接文件失去了源，就意味着他已经不存在了； &lt;/p&gt;&lt;p&gt;我们可以看到软链接文件，其实只是源文件的一个标记，当源文件失去时，他也就是存在了。软链接文件只是占用了inode来存储软链接文件属性等信息，但文件存储是指向源文件的。 &lt;/p&gt;&lt;p&gt;软件链接，可以为文件或目录都适用。无论是软链接还是硬链接，都可以用rm来删除。rm工具是通用的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a target="_blank" href="http://www.linuxhao.com/"&gt;Linux好学堂&lt;/a&gt;， &lt;a href="http://www.linuxhao.com"&gt;www.linuxhao.com&lt;/a&gt;，Linux编程开发,Linux下载中心，并提供Linux视频教程,Linux培训教程,Linux技术资料免费下载等。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Javalove/aggbug/2027672.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Javalove/archive/2011/04/25/2027672.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Javalove/archive/2011/04/24/2026393.html</id><title type="text">linux下各种软件安装方法详解</title><summary type="text">linux 软件安装的七种方法一、rpm包安装方式步骤： 1、找到相应的软件包，比如soft.version.rpm，下载到本机某个目录； 2、打开一个终端，su -成root用户； 3、cd soft.version.rpm所在的目录； 4、输入rpm -ivh soft.version.rpm 二、deb包安装方式步骤： 1、找到相应的软件包，比如soft.version.deb，下载到本机某个目录； 2、打开一个终端，su -成root用户； 3、cd soft.version.deb所在的目录； 4、输入dpkg -i soft.version.deb 三、tar.gz源代码包安装方式</summary><published>2011-04-24T11:17:00Z</published><updated>2011-04-24T11:17:00Z</updated><author><name>Java爱</name><uri>http://www.cnblogs.com/Javalove/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Javalove/archive/2011/04/24/2026393.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Javalove/archive/2011/04/24/2026393.html"/><content type="html">&lt;p&gt;linux 软件安装的七种方法&lt;br /&gt;一、rpm包安装方式步骤： &lt;br /&gt;1、找到相应的软件包，比如soft.version.rpm，下载到本机某个目录； &lt;br /&gt;2、打开一个终端，su -成root用户； &lt;br /&gt;3、cd soft.version.rpm所在的目录； &lt;br /&gt;4、输入rpm -ivh soft.version.rpm &lt;/p&gt;&lt;p&gt;二、deb包安装方式步骤： &lt;br /&gt;1、找到相应的软件包，比如soft.version.deb，下载到本机某个目录；&amp;nbsp; &lt;/p&gt;&lt;p&gt;2、打开一个终端，su -成root用户； &lt;br /&gt;3、cd soft.version.deb所在的目录； &lt;br /&gt;4、输入dpkg -i soft.version.deb &lt;/p&gt;&lt;p&gt;三、tar.gz源代码包安装方式： &lt;br /&gt;1、找到相应的软件包，比如soft.tar.gz，下载到本机某个目录； &lt;br /&gt;2、打开一个终端，su -成root用户； &lt;br /&gt;3、cd soft.tar.gz所在的目录； &lt;br /&gt;4、tar -xzvf soft.tar.gz //一般会生成一个soft目录 &lt;br /&gt;5、cd soft &lt;br /&gt;6、./configure &lt;br /&gt;7、make &lt;br /&gt;8、make install &lt;/p&gt;&lt;p&gt;四、tar.bz2源代码包安装方式： &lt;br /&gt;1、找到相应的软件包，比如soft.tar.bz2，下载到本机某个目录； &lt;br /&gt;2、打开一个终端，su -成root用户； &lt;br /&gt;3、cd soft.tar.bz2所在的目录； &lt;br /&gt;4、tar -xjvf soft.tar.bz2 //一般会生成一个soft目录 &lt;br /&gt;5、cd soft &lt;br /&gt;6、./configure &lt;br /&gt;7、make &lt;br /&gt;8、make install &lt;/p&gt;&lt;p&gt;五、apt方式安装： &lt;br /&gt;1、打开一个终端，su -成root用户； &lt;br /&gt;2、apt-cache search soft 注：soft是你要找的软件的名称或相关信息 &lt;br /&gt;3、如果2中找到了软件soft.version，则用apt-get install soft.version命令安 &lt;br /&gt;装软件注：只要你可以上网，只需要用apt-cache search查找软件，用apt-get &lt;br /&gt;install软件 &lt;/p&gt;&lt;p&gt;六、bin文件安装： &lt;br /&gt;如果你下载到的软件名是soft.bin，一般情况下是个可执行文件，安装方法如下： &lt;br /&gt;1、打开一个终端，su -成root用户； &lt;br /&gt;2、chmod +x soft.bin &lt;br /&gt;3、./soft.bin //运行这个命令就可以安装软件了 &lt;/p&gt;&lt;p&gt;七、不需要安装的软件： &lt;br /&gt;有了些软件，比如lumaqq，是不需要安装的，自带jre解压缩后可直接运行。假设 &lt;br /&gt;下载的是lumaqq.tar.gz，使用方法如下： &lt;br /&gt;1、打开一个终端，su -成root用户； &lt;br /&gt;2、tar -xzvf lumaqq.tar.gz //这一步会生成一个叫LumaQQ的目录 &lt;br /&gt;3、cd LumaQQ &lt;br /&gt;4、chmod +x lumaqq //设置lumaqq这个程序文件为可运行 &lt;br /&gt;5、此时就可以运行lumaqq了，用命令./lumaqq即可，但每次运行要输入全路径或 &lt;br /&gt;切换到刚才生成的LumaQQ目录里 &lt;br /&gt;6、为了保证不设置路径就可以用，你可以在/bin目录下建立一个lumaqq的链接， &lt;br /&gt;用命令ln -s lumaqq /bin/ 即可，以后任何时候打开一个终端输入lumaqq就可以 &lt;br /&gt;启动QQ聊天软件了 &lt;br /&gt;7、如果你要想lumaqq有个菜单项，使用菜单编辑工具，比如Alacarte Menu &lt;br /&gt;Editor，找到上面生成的LumaQQ目录里的lumaqq设置一个菜单项就可以了，当然你 &lt;br /&gt;也可以直接到 /usr/share/applications目录，按照里面其它*.desktop文件的格 &lt;br /&gt;式生成一个自己的desktop文件即可。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a target="_blank" href="http://www.linuxhao.com"&gt;Linux好学堂&lt;/a&gt;， &lt;a href="http://www.linuxhao.com"&gt;www.linuxhao.com&lt;/a&gt;，提供Linux安装,Linux系统,Linux内核,Linux驱动,Linux教程。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Javalove/aggbug/2026393.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Javalove/archive/2011/04/24/2026393.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
