﻿<?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>BlogJava-伊峰独居-文章分类-其他学习</title><link>http://www.blogjava.net/yifeng661/category/16308.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 18:08:05 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 18:08:05 GMT</pubDate><ttl>60</ttl><item><title>在Linux下Jdk的安装和Java环境变量的设置(转)</title><link>http://www.blogjava.net/yifeng661/articles/79694.html</link><dc:creator>伊峰</dc:creator><author>伊峰</author><pubDate>Tue, 07 Nov 2006 12:49:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng661/articles/79694.html</guid><wfw:comment>http://www.blogjava.net/yifeng661/comments/79694.html</wfw:comment><comments>http://www.blogjava.net/yifeng661/articles/79694.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng661/comments/commentRss/79694.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng661/services/trackbacks/79694.html</trackback:ping><description><![CDATA[
		<p>
				<span>在</span>
				<span>Linux</span>
				<span>下</span>
				<span>Jdk</span>
				<span>的安装和</span>
				<span>Java</span>
				<span>环境变量的设置</span>
		</p>
		<p>
				<span>1</span>
				<span>、到</span>
				<span>www.sun.com</span>
				<span>下载最新版本的</span>
				<span>j2sdk for linux</span>
		</p>
		<p>
				<span>2</span>
				<span>、安装</span>
				<span>jdk1.4.2 for linux,</span>
				<span>以下是在</span>
				<span>Redhat Linux 9</span>
				<span>下为例：</span>
		</p>
		<p>
				<span>
						<span>   </span>
				</span>
				<span>以</span>
				<span>root</span>
				<span>身份登录</span>
		</p>
		<p>
				<span>
						<span>   </span>(1)</span>
				<span>打开一个终端</span>
		</p>
		<p>
				<span>
						<span>   </span>(2)</span>
				<span>输入命令</span>
				<span>ls -l </span>
				<span>查看安装文件的权限</span>
		</p>
		<p>
				<span>
						<span>   </span>(3)</span>
				<span>输入命令</span>
				<span>chmod a+x j2sdk-1_4_2_01-linux-i586-rpm.bin,</span>
				<span>给所有的用户添加执行的权限。</span>
		</p>
		<p>
				<span>
						<span>   </span>(4)</span>
				<span>安装</span>
				<span>jdk</span>
		</p>
		<p>
				<span>
						<span>      </span>./j2sdk-1_4_2_01-linux-i586-rpm.bin</span>
		</p>
		<p>
				<span>
						<span>      </span>
				</span>
				<span>此步完成后，会生成</span>
				<span>j2sdk-1_4_2_01-linux-i586.rpm</span>
				<span>的文件</span>
		</p>
		<p>
				<span>
						<span>       </span>
				</span>
				<span>查看权限</span>
		</p>
		<p>
				<span>
						<span>   </span>
						<span>   </span>ls -l</span>
		</p>
		<p>
				<span>
						<span>      </span>
				</span>
				<span>给</span>
				<span>j2sdk-1_4_2_01-linux-i586.rpm</span>
				<span>赋执行权限</span>
		</p>
		<p>
				<span>
						<span>      </span>chmod +x j2sdk-1_4_2_01-linux-i586.rpm</span>
		</p>
		<p>
				<span>
						<span>      </span>
				</span>
				<span>安装</span>
				<span>j2sdk-1_4_2_01-linux-i586.rpm</span>
		</p>
		<p>
				<span>
						<span>      </span>rpm -ivh j2sdk-1_4_2_01-linux-i586-rpm</span>
		</p>
		<p>
				<span>
						<span>      </span>
				</span>
				<span>出现授权协议，按</span>
				<span>Enter</span>
				<span>键接受</span>
		</p>
		<p>
				<span>
						<span>   </span>(5)</span>
				<span>使用默认的安装位置，在</span>
				<span>/usr/java/</span>
				<span>下，即</span>
				<span>/usr/java/j2sdk1.4.2_01</span>
		</p>
		<p>
				<span>3</span>
				<span>、设置环境变量</span>
		</p>
		<p>
				<span>
						<span>   </span>
				</span>
				<span>使用</span>
				<span>Vi</span>
				<span>编辑器进行环境变量的编辑：</span>
		</p>
		<p>
				<span>
						<span>   </span>
				</span>
				<span>在终端中输入命令</span>
		</p>
		<p>
				<span>
						<span>   </span>vi /etc/profile.d/java.sh</span>
		</p>
		<p>
				<span>
						<span>   </span>
				</span>
				<span>这样可以在所有的用户中使用</span>
		</p>
		<p>
				<span>
						<span>   </span>
				</span>
				<span>在新的</span>
				<span>java.sh</span>
				<span>中输入以下内容：</span>
				<span>
				</span>
		</p>
		<p>
				<span>
						<span>   </span>#set java environment</span>
		</p>
		<p>
				<span>
						<span>   </span>export J***A_HOME=/usr/java/j2sdk1.4.2_01</span>
		</p>
		<p>
				<span>
						<span>   </span>export CLASSPATH=.:$J***A_HOME/lib:$J***A_HOME/jre/lib</span>
		</p>
		<p>
				<span>
						<span>   </span>export PATH=$J***A_HOME/bin:$J***A_HOME/jre/bin:$PATH</span>
		</p>
		<p>
				<span>
						<span>   </span>
				</span>
				<span>保存退出</span>
		</p>
		<p>
				<span>
						<span>   </span>PATH </span>
				<span>和</span>
				<span> CLASSPATH </span>
				<span>都指定路径列表，列表中的各项</span>
				<span> (</span>
				<span>即各个路径</span>
				<span>) </span>
				<span>之间使用分隔符分隔。在</span>
				<span> Windows </span>
				<span>下，分隔符是分号</span>
				<span> (;)</span>
				<span>，而在</span>
				<span> Linux </span>
				<span>下，分隔符是冒号</span>
				<span> (:)</span>
				<span>。</span>
		</p>
		<p>
				<span>4</span>
				<span>、给</span>
				<span>java.sh</span>
				<span>分配权限</span>
		</p>
		<p>
				<span>
						<span>   </span>
				</span>
				<span>输入以下命令：</span>
				<span>
				</span>
		</p>
		<p>
				<span>
						<span>   </span>chmod 755 /etc/profile.d/java.sh</span>
		</p>
		<p>
				<span>5</span>
				<span>、重启计算机</span>
		</p>
		<p>
				<span>
						<span>   </span>
				</span>
				<span>在终端中输入如下命令，测试</span>
				<span>jdk</span>
				<span>是否安装成功</span>
		</p>
		<p>
				<span>  java -version<br /><br />照着这个配置好了，^_^（原来用修改/etc/profile方法，结果把系统搞死了）<br /><br />折腾了一下午，可以了，^_^，算是有点收获吧，嘿嘿，jdk终于装成功了</span>
		</p>/html&gt;<img src ="http://www.blogjava.net/yifeng661/aggbug/79694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng661/" target="_blank">伊峰</a> 2006-11-07 20:49 <a href="http://www.blogjava.net/yifeng661/articles/79694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux基础学习</title><link>http://www.blogjava.net/yifeng661/articles/79405.html</link><dc:creator>伊峰</dc:creator><author>伊峰</author><pubDate>Mon, 06 Nov 2006 06:57:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng661/articles/79405.html</guid><wfw:comment>http://www.blogjava.net/yifeng661/comments/79405.html</wfw:comment><comments>http://www.blogjava.net/yifeng661/articles/79405.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng661/comments/commentRss/79405.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng661/services/trackbacks/79405.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: linux专贴！																														Linux下软件安装详解在Windows下安装软件时，只需用鼠标双击软件的安装程序，或者用Zip等解压缩软件解压缩即可安装。在Linux下安装软件对初学者来说，难度高于Windows下软件安装。下面我就详细讲解Linux下如何安装软件。     先来看看Linux软件扩展名。软件后缀为.rpm最初是Red Ha...&nbsp;&nbsp;<a href='http://www.blogjava.net/yifeng661/articles/79405.html'>阅读全文</a><img src ="http://www.blogjava.net/yifeng661/aggbug/79405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng661/" target="_blank">伊峰</a> 2006-11-06 14:57 <a href="http://www.blogjava.net/yifeng661/articles/79405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Xp下安装SQL2000或者其他软件系统提示之前有挂起的安装操作,要求重启系统的解决办法</title><link>http://www.blogjava.net/yifeng661/articles/76097.html</link><dc:creator>伊峰</dc:creator><author>伊峰</author><pubDate>Thu, 19 Oct 2006 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng661/articles/76097.html</guid><wfw:comment>http://www.blogjava.net/yifeng661/comments/76097.html</wfw:comment><comments>http://www.blogjava.net/yifeng661/articles/76097.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng661/comments/commentRss/76097.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng661/services/trackbacks/76097.html</trackback:ping><description><![CDATA[
		<table width="530" align="center" border="0">
				<tbody>
						<tr>
								<td valign="top" align="left">
										<table style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellspacing="0" cellpadding="0" width="96%" border="0">
												<tbody>
														<tr>
																<td bgcolor="#e8f0f1">  sql2000安装时说有以前挂起的文件存在，让重启</td>
														</tr>
														<tr>
																<td>
																		<table cellspacing="0" cellpadding="0" width="100%" border="0">
																				<tbody>
																						<tr>
																								<td>
																										<div align="right">
																										</div>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																		<span class="oblog_text">  需要去注册表里删一些东西， <br /><br />1）添加/删除程序中彻底删除sql server。 <br /><br />2）将没有删除的sql server目录也删除掉。 <br /><br /><br />3）打开注册表编辑器，在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到PendingFileRenameOperations项目，并删除它。这样就可以清除安装暂挂项目 </span>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/yifeng661/aggbug/76097.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng661/" target="_blank">伊峰</a> 2006-10-19 10:56 <a href="http://www.blogjava.net/yifeng661/articles/76097.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)怎样使按钮响应回车键 </title><link>http://www.blogjava.net/yifeng661/articles/74505.html</link><dc:creator>伊峰</dc:creator><author>伊峰</author><pubDate>Wed, 11 Oct 2006 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng661/articles/74505.html</guid><wfw:comment>http://www.blogjava.net/yifeng661/comments/74505.html</wfw:comment><comments>http://www.blogjava.net/yifeng661/articles/74505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng661/comments/commentRss/74505.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng661/services/trackbacks/74505.html</trackback:ping><description><![CDATA[定在&lt;head&gt;&lt;/head&gt;之间 <br />&lt;script language="javascript" event="onkeydown" for="document"&gt;  <br />if(event.keyCode==13)  <br />{  <br />document.all('Button1').focus();  <br />document.all('Button1').click();  <br />}  <br />&lt;/script&gt; <img src ="http://www.blogjava.net/yifeng661/aggbug/74505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng661/" target="_blank">伊峰</a> 2006-10-11 11:10 <a href="http://www.blogjava.net/yifeng661/articles/74505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)从图像提交表单</title><link>http://www.blogjava.net/yifeng661/articles/74504.html</link><dc:creator>伊峰</dc:creator><author>伊峰</author><pubDate>Wed, 11 Oct 2006 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng661/articles/74504.html</guid><wfw:comment>http://www.blogjava.net/yifeng661/comments/74504.html</wfw:comment><comments>http://www.blogjava.net/yifeng661/articles/74504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng661/comments/commentRss/74504.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng661/services/trackbacks/74504.html</trackback:ping><description><![CDATA[
		<h4>
				<a name="jakartastrutsckbk-CHP-3-SECT-6.1">
				</a>问题</h4>
		<p>你想要使用户能够通过点击一个不在HTML表单标签中的图像来提交表单。</p>
		<h4>
				<a name="jakartastrutsckbk-CHP-3-SECT-6.2">
				</a>动作要领</h4>
		<p>适应一个对JavaScript URL 的链接来提交表单：<br /></p>
		<br />
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">html:link </span>
						<span style="COLOR: #ff0000">href</span>
						<span style="COLOR: #0000ff">="javascript:document.myform.submit(  )"</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">html:img </span>
						<span style="COLOR: #ff0000">page</span>
						<span style="COLOR: #0000ff">="/submit-form.gif"</span>
						<span style="COLOR: #ff0000"> <br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />               alt</span>
						<span style="COLOR: #0000ff">="Submit"</span>
						<span style="COLOR: #ff0000"> border</span>
						<span style="COLOR: #0000ff">="0"</span>
						<span style="COLOR: #0000ff">/&gt;</span>
						<span style="COLOR: #000000"> <br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">html:link</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
				</div>
		</div>
		<br />
		<p>
				<a name="jakartastrutsckbk-CHP-3-SECT-6.3">
				</a> </p>
		<h4>动作变化</h4>
		<p>Web 应用经常使用可点击的图像来提交表单而不是仅仅通过表单按钮。Struts <a name="jakartastrutsckbk-CHP-3-ITERM-1540"></a><a name="jakartastrutsckbk-CHP-3-ITERM-1541"></a><a name="jakartastrutsckbk-CHP-3-ITERM-1542"></a>的html:image标签可以用来产生一个显示图像的HTML input type="image" 标签。但是，对于复杂的 HTML 布局，并不总是能够将图像嵌入在表单&lt;form&gt; . . . &lt;/form&gt;标签之中。有些时候，一个 HTML 页面可能在页面的某一段可能有多个表单，而提交页面的图像则在页面的另一个区域。比如，工具条风格的图像按钮。</p>
		<p>上面的方法可以用于从表单之外的图像提交表单。所显示的图像嵌套在html:link标签中。该链接通过执行一行JavaScript来提交表单。在上面的代码中，JavaScript 将提交名为MyForm 的表单。表单名称必须匹配struts-config.xml文件中所配置的action元素的name属性。下面是这种方法产生的HTML 代码：</p>
		<p> </p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">a </span>
						<span style="COLOR: #ff0000">href</span>
						<span style="COLOR: #0000ff">="javascript:document.myform.submit(  )"</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">img </span>
						<span style="COLOR: #ff0000">src</span>
						<span style="COLOR: #0000ff">="/myapp/struts-power.gif"</span>
						<span style="COLOR: #ff0000">
								<br />
								<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />         border</span>
						<span style="COLOR: #0000ff">="0"</span>
						<span style="COLOR: #ff0000"> alt</span>
						<span style="COLOR: #0000ff">="Submit"</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">a</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
				</div>
		</div>
		<p> </p>
		<p>虽然你可以直接使用上述HTML标记而不是Struts html标签，如果那样的话你将失去那些标签所提供的特征。通过使用Struts tag，你就不是必须要指定context 名称，并且你可以使图像名称和替换文本来自于资源束 (如果你需要的话)。</p>
		<p>另一个办法是使用html:img 标签的onclick属性：</p>
		<p> </p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">html:img </span>
						<span style="COLOR: #ff0000">page</span>
						<span style="COLOR: #0000ff">="/submit-form.gif"</span>
						<span style="COLOR: #ff0000">
								<br />
								<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />       onclick</span>
						<span style="COLOR: #0000ff">="document.MyForm.submit( );"</span>
						<span style="COLOR: #ff0000">
								<br />
								<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />           alt</span>
						<span style="COLOR: #0000ff">="Submit"</span>
						<span style="COLOR: #ff0000"> border</span>
						<span style="COLOR: #0000ff">="0"</span>
						<span style="COLOR: #0000ff">/&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
				</div>
		</div>
		<p> </p>
		<p>这种方式的缺点是，有些浏览器并不提供图像是可以点击的一些可视提示线索。因为图像嵌入到一个链接中，大多数浏览器都会在改变鼠标指针以提示该图像是可以点击的。</p>
<img src ="http://www.blogjava.net/yifeng661/aggbug/74504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng661/" target="_blank">伊峰</a> 2006-10-11 11:09 <a href="http://www.blogjava.net/yifeng661/articles/74504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)javascript 常用代码大全</title><link>http://www.blogjava.net/yifeng661/articles/74496.html</link><dc:creator>伊峰</dc:creator><author>伊峰</author><pubDate>Wed, 11 Oct 2006 02:47:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng661/articles/74496.html</guid><wfw:comment>http://www.blogjava.net/yifeng661/comments/74496.html</wfw:comment><comments>http://www.blogjava.net/yifeng661/articles/74496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng661/comments/commentRss/74496.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng661/services/trackbacks/74496.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: //				打开模式对话框function doSelectUser(txtId) { 				 						      strFeatures="dialogWidth=500px;dialogHeight=360px;center=yes;middle=yes ;help=no;status=no;scroll=no";       var url,strReturn;  ...&nbsp;&nbsp;<a href='http://www.blogjava.net/yifeng661/articles/74496.html'>阅读全文</a><img src ="http://www.blogjava.net/yifeng661/aggbug/74496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng661/" target="_blank">伊峰</a> 2006-10-11 10:47 <a href="http://www.blogjava.net/yifeng661/articles/74496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)利用iText在JSP中生成PDF报表</title><link>http://www.blogjava.net/yifeng661/articles/74494.html</link><dc:creator>伊峰</dc:creator><author>伊峰</author><pubDate>Wed, 11 Oct 2006 02:41:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng661/articles/74494.html</guid><wfw:comment>http://www.blogjava.net/yifeng661/comments/74494.html</wfw:comment><comments>http://www.blogjava.net/yifeng661/articles/74494.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng661/comments/commentRss/74494.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng661/services/trackbacks/74494.html</trackback:ping><description><![CDATA[iText简介 
<p>　　iText是一个开放源码的Java类库，可以用来方便地生成PDF文件。大家通过访问<a href="http://sourceforge.net/project/showfiles.php?group_id=15255&amp;release_id=167948"><font color="#000000">http://sourceforge.net/project/showfiles.php?group_id=15255&amp;release_id=167948</font></a>下载最新版本的类库，下载完成之后会得到一个.jar包，把这个包加入JDK的classpath即可使用。如果生成的PDF文件中需要出现中文、日文、韩文字符，则还需要通过访问<a href="http://itext.sourceforge.net/downloads/iTextAsian.jar"><font color="#000000">http://itext.sourceforge.net/downloads/iTextAsian.jar</font></a>下载iTextAsian.jar包。</p><p>　　关于iText类库的使用，<a href="http://www.lowagie.com/iText/tutorial/index.html"><font color="#000000">http://www.lowagie.com/iText/tutorial/index.html</font></a>有比较详细的教程。该教程从入门开始，比较系统地介绍了在PDF文件中放入文字、图片、表格等的方法和技巧。读完这片教程，大致就可以做一些从简单到复杂的PDF文件了。不过，试图通过教程解决在生成PDF文件过程中遇到的所有困难无疑是一种奢望。所以，阅读iText的api文档显得非常重要。读者在下载类库的同时，也可以下载类库的文档。</p><p>　　如何利用iText在java程序中生成PDF报表</p><p>　　以下是上述教程中一个最简单的例子，这个例子刻画了通过iText生成PDF文件的一般程序框架。读者只需要在document.open();和document.close();两条语句中间加入自己希望放在PDF文件中的内容即可。该例子只在PDF文件中加了“Hello World“一行文字。</p><p><br />Document document = new Document();</p><p>try</p><p>{</p><p>　PdfWriter.getInstance(document, new FileOutputStream ("Chap0101.pdf"));</p><p>　document.open();</p><p>　document.add(new Paragraph("Hello World"));</p><p>}</p><p>catch(DocumentException de)</p><p>{</p><p>　System.err.println(de.getMessage());</p><p>}</p><p>catch(IOException ioe)</p><p>{</p><p>　System.err.println(ioe.getMessage());</p><p>}</p><p>document.close(); </p><p>　　由以上的例子可见，程序的框架十分清楚明了。然而在PDF中指定文字、图画、表格的位置是一件非常麻烦的事情。除了不断地在程序中修改位置、然后运行程序、生成PDF文件、观察元素在PDF中的位置是否合理这样的过程以外，似乎还没有其它更好的方法。</p><p>　　如何通过JSP生成PDF报表</p><p>　　这一部分是在iText的教程中所没有的，网上的相关资料也比较少。我曾在CSDN上看过有人开帖询问实现细节，有人回复了实现的原理：先在服务器上生成PDF文件，然后用户通过点击指向PDF文件的超链接选择下载或打开。这是一个思路，或者说是思路之一。本文实现了这个思路，又给出另外一个思路并通过两种途径实现之。</p><p>　　1）直接在服务器上生成PDF文件。</p><p>＜%@ page import ="com.lowagie.text.*,com.lowagie.text.pdf.*, java.io.*"%＞</p><p>＜%</p><p>　String filename = "PDF"+(new Random()).nextInt()+".pdf" ;</p><p>　Document document = new Document(PageSize.A4);</p><p>　ServletOutputStream out1 = response.getOutputStream();</p><p>　try</p><p>　{</p><p>　　PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename) );</p><p>　　document.open();</p><p>　　document.add(new Paragraph("Hello World"));</p><p>　　document.close();</p><p>　}</p><p>　catch(Exception e){}%＞ </p><p> </p><p>　　上面的程序在服务器上生成了一个静态的PDF文件。显然，每次运行所得的PDF文件的名称应该是独一无二不能有重的。本程序通过随机函数来命名生成的PDF文件。本程序的缺点就是，每次运行都会在服务器上产生一个PDF文件，如果不及时删除，数量会越来越大，这显然是站点维护者所不愿意看到的。</p><p> </p><p>　　2）将PDF文件通过流的形式输送到客户端的缓存。这样做的好处是不会在服务器上留下任何“遗迹”。</p><p> </p><p>　　i）直接通过JSP页面生成</p><p> </p><p> </p><p>＜%@</p><p>page import="java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*"%＞</p><p>＜%</p><p>　response.setContentType( "application/pdf" );</p><p>　Document document = new Document();</p><p>　ByteArrayOutputStream buffer = new ByteArrayOutputStream();</p><p>　PdfWriter writer=PdfWriter.getInstance( document, buffer );</p><p>　document.open();</p><p>　document.add(new Paragraph("Hello World"));</p><p>　document.close();</p><p>　DataOutput output = new DataOutputStream( response.getOutputStream() );</p><p>　byte[] bytes = buffer.toByteArray();</p><p>　response.setContentLength(bytes.length);</p><p>　for( int i = 0; i ＜ bytes.length; i++ )</p><p>　{</p><p>　　output.writeByte( bytes[i] );</p><p>　}</p><p>%＞ </p><p> </p><p>　　ii）通过Servlet生成</p><p> </p><p> </p><p>import java.io.*;</p><p>import javax.servlet.*;</p><p>import javax.servlet.http.*;</p><p>import com.lowagie.text.*;</p><p>import com.lowagie.text.pdf.*;</p><p>public void doGet(HttpServletRequest request, HttpServletResponse response)</p><p>　throws IOException,ServletException</p><p>　{</p><p>　　Document document = new Document(PageSize.A4, 36,36,36,36);</p><p>　　ByteArrayOutputStream ba = new ByteArrayOutputStream();</p><p>　　try</p><p>　　{</p><p>　　　PdfWriter writer = PdfWriter.getInstance(document, ba);</p><p>　　　document.open();</p><p>　　　document.add(new Paragraph("Hello World"));</p><p>　　}</p><p>　　catch(DocumentException de)</p><p>　　{</p><p>　　　de.printStackTrace();</p><p>　　　System.err.println("A Document error:" +de.getMessage());</p><p>　　}</p><p>　　document.close();</p><p>　　response.setContentType("application/pdf");</p><p>　　response.setContentLength(ba.size());</p><p>　　ServletOutputStream out = response.getOutputStream();</p><p>　　ba.writeTo(out);</p><p>　　out.flush();</p><p>　} </p><img src ="http://www.blogjava.net/yifeng661/aggbug/74494.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng661/" target="_blank">伊峰</a> 2006-10-11 10:41 <a href="http://www.blogjava.net/yifeng661/articles/74494.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)HOOK专题</title><link>http://www.blogjava.net/yifeng661/articles/72742.html</link><dc:creator>伊峰</dc:creator><author>伊峰</author><pubDate>Fri, 29 Sep 2006 02:45:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng661/articles/72742.html</guid><wfw:comment>http://www.blogjava.net/yifeng661/comments/72742.html</wfw:comment><comments>http://www.blogjava.net/yifeng661/articles/72742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng661/comments/commentRss/72742.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng661/services/trackbacks/72742.html</trackback:ping><description><![CDATA[
		<div class="text1">HOOK专题</div>
		<hr color="#cccccc" size="1" />
		<div class="text2">目录</div>
		<div class="text4">
		</div>
		<ul class="list1">
				<li class="list2">
						<b>
						</b>基本概念 
</li>
				<li class="list2">
						<b>
						</b>运行机制 
</li>
				<li class="list2">
						<b>
						</b>钩子类型 
</li>
				<li class="list2">
						<b>
						</b>作者 </li>
		</ul>
		<hr color="#cccccc" size="1" />
		<div class="text2">基本概念</div>
		<div class="text4">
		</div>
		<div class="text4">钩子(Hook)，是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息，而且所监视的窗口可以是其他进程所创建的。当消息到达后，在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。</div>
		<div class="text4">钩子实际上是一个处理消息的程序段，通过系统调用，把它挂入系统。每当特定的消息发出，在没有到达目的窗口前，钩子程序就先捕获该消息，亦即钩子函数先得到控</div>
		<div class="text4">制权。这时钩子函数即可以加工处理（改变）该消息，也可以不作处理而继续传递该消息，还可以强制结束消息的传递。</div>
		<hr color="#cccccc" size="1" />
		<div class="text2">运行机制</div>
		<div class="text4">
		</div>
		<div class="text4">1、钩子链表和钩子子程：</div>
		<div class="text4">每一个Hook都有一个与之相关联的指针列表，称之为钩子链表，由系统来维护。这个列表的指针指向指定的，应用程序定义的，被Hook子程调用的回调函数，也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时，系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息，或者修改消息，或者停止消息的前进，避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始，而最早安装的钩子放在最后，也就是后加入的先获得控制权。</div>
		<div class="text4">Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载，Windows 便释放其占用的内存，并更新整个Hook链表。如果程序安装了钩子，但是在尚未卸载钩子之前就结束了，那么系统会自动为它做卸载钩子的操作。</div>
		<div class="text4">钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数，只能定义为普通的C函数。用以监视系统或某一特定类型的事件，这些事件可以是与某一特定线程关联的，也可以是系统中所有线程的事件。</div>
		<div class="text4">钩子子程必须按照以下的语法：</div>
		<div style="BACKGROUND-COLOR: #eeeeee" width="100%">
				<pre class="text5">LRESULT CALLBACK HookProc
(
 	int nCode, 
     	WPARAM wParam, 
     	LPARAM lParam
);
</pre>
		</div>
		<div class="text4">HookProc是应用程序定义的名字。</div>
		<div class="text4">nCode参数是Hook代码，Hook子程使用这个参数来确定任务。这个参数的值依赖于Hook类型，每一种Hook都有自己的Hook代码特征字符集。</div>
		<div class="text4">wParam和lParam参数的值依赖于Hook代码，但是它们的典型值是包含了关于发送或者接收消息的信息。</div>
		<div class="text4">2、钩子的安装与释放：</div>
		<div class="text4">使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。SetWindowsHookEx函数总是在Hook链的开头安装Hook子程。当指定类型的Hook监视的事件发生时，系统就调用与这个Hook关联的Hook链的开头的Hook子程。每一个Hook链中的Hook子程都决定是否把这个事件传递到下一个Hook子程。Hook子程传递事件到下一个Hook子程需要调用CallNextHookEx函数。</div>
		<div style="BACKGROUND-COLOR: #eeeeee" width="100%">
				<pre class="text5">HHOOK SetWindowsHookEx( 
　　　　　int idHook,      // 钩子的类型，即它处理的消息类型
　　　　　HOOKPROC lpfn,   // 钩子子程的地址指针。如果dwThreadId参数为0
			   // 或是一个由别的进程创建的线程的标识，
			   // lpfn必须指向DLL中的钩子子程。
			   // 除此以外，lpfn可以指向当前进程的一段钩子子程代码。
			   // 钩子函数的入口地址，当钩子钩到任何消息后便调用这个函数。
　　　　　HINSTANCE hMod,  // 应用程序实例的句柄。标识包含lpfn所指的子程的
DLL。
			   // 如果dwThreadId 标识当前进程创建的一个线程，
			   // 而且子程代码位于当前进程，hMod必须为NULL。
			   // 可以很简单的设定其为本应用程序的实例句柄。
　　　　　DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。
			   // 如果为0，钩子子程与所有的线程关联，即为全局钩子。
　　　　　            ); 
</pre>
		</div>
		<div class="text4">　　函数成功则返回钩子子程的句柄，失败返回NULL。</div>
		<div class="text4">　　以上所说的钩子子程与线程相关联是指在一钩子链表中发给该线程的消息同时发送给钩子子程，且被钩子子程先处理。</div>
		<div class="text4">在钩子子程中调用得到控制权的钩子函数在完成对消息的处理后，如果想要该消息继续传递，那么它必须调用另外一个SDK中的API函数CallNextHookEx来传递它，以执行钩子链表所指的下一个钩子子程。这个函数成功时返回钩子链中下一个钩子过程的返回值，返回值的类型依赖于钩子的类型。这个函数的原型如下：</div>
		<div style="BACKGROUND-COLOR: #eeeeee" width="100%">
				<pre class="text5">LRESULT CallNextHookEx
			(
				HHOOK hhk;
				int nCode;
				WPARAM wParam;
				LPARAM lParam;
			 );
</pre>
		</div>
		<div class="text4">hhk为当前钩子的句柄，由SetWindowsHookEx()函数返回。</div>
		<div class="text4">NCode为传给钩子过程的事件代码。</div>
		<div class="text4">wParam和lParam 分别是传给钩子子程的wParam值，其具体含义与钩子类型有关。</div>
		<div class="text4">
		</div>
		<div class="text4">钩子函数也可以通过直接返回TRUE来丢弃该消息，并阻止该消息的传递。否则的话，其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果。</div>
		<div class="text4">钩子在使用完之后需要用UnHookWindowsHookEx()卸载，否则会造成麻烦。释放钩子比较简单，UnHookWindowsHookEx()只有一个参数。函数原型如下：</div>
		<div style="BACKGROUND-COLOR: #eeeeee" width="100%">
				<pre class="text5">UnHookWindowsHookEx
(
	HHOOK hhk;
);
</pre>
		</div>
		<div class="text4">函数成功返回TRUE，否则返回FALSE。</div>
		<div class="text4">3、一些运行机制：</div>
		<div class="text4">在Win16环境中，DLL的全局数据对每个载入它的进程来说都是相同的；而在Win32环境中，情况却发生了变化，DLL函数中的代码所创建的任何对象（包括变量）都归调用它的线程或进程所有。当进程在载入DLL时，操作系统自动把DLL地址映射到该进程的私有空间，也就是进程的虚拟地址空间，而且也复制该DLL的全局数据的一份拷贝到该进程空间。也就是说每个进程所拥有的相同的DLL的全局数据，它们的名称相同，但其值却并不一定是相同的，而且是互不干涉的。</div>
		<div class="text4">
		</div>
		<div class="text4">因此，在Win32环境下要想在多个进程中共享数据，就必须进行必要的设置。在访问同一个Dll的各进程之间共享存储器是通过存储器映射文件技术实现的。也可以把这些需要共享的数据分离出来，放置在一个独立的数据段里，并把该段的属性设置为共享。必须给这些变量赋初值，否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段中。</div>
		<div class="text4">#pragma data_seg预处理指令用于设置共享数据段。例如：</div>
		<div style="BACKGROUND-COLOR: #eeeeee" width="100%">
				<pre class="text5">#pragma data_seg("SharedDataName")
HHOOK hHook=NULL;
#pragma data_seg()
</pre>
		</div>
		<div class="text4">在#pragma data_seg("SharedDataName")和#pragma data_seg()之间的所有变量将被访问该Dll的所有进程看到和共享。再加上一条指令#pragma comment(linker,"/section:.SharedDataName,rws"),那么这个数据节中的数据可以在所有DLL的实例之间共享。所有对这些数据的操作都针对同一个实例的，而不是在每个进程的地址空间中都有一份。</div>
		<div class="text4">当进程隐式或显式调用一个动态库里的函数时，系统都要把这个动态库映射到这个进程的虚拟地址空间里(以下简称"地址空间")。这使得DLL成为进程的一部分，以这个进程的身份执行，使用这个进程的堆栈。</div>
		<div class="text4">4、系统钩子与线程钩子：</div>
		<div class="text4">SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是线程钩子。</div>
		<div class="text4">
		</div>
		<div class="text4">线程勾子用于监视指定线程的事件消息。线程勾子一般在当前线程或者当前线程派生的线程内。</div>
		<div class="text4">
		</div>
		<div class="text4">系统勾子监视系统中的所有线程的事件消息。因为系统勾子会影响系统中所有的应用程序，所以勾子函数必须放在独立的动态链接库(DLL) 中。系统自动将包含"钩子回调函数"的DLL映射到受钩子函数影响的所有进程的地址空间中，即将这个DLL注入了那些进程。</div>
		<div class="text4">几点说明：</div>
		<div class="text4">（1）如果对于同一事件（如鼠标消息）既安装了线程勾子又安装了系统勾子，那么系统会自动先调用线程勾子，然后调用系统勾子。 </div>
		<div class="text4">（2）对同一事件消息可安装多个勾子处理过程，这些勾子处理过程形成了勾子链。当前勾子处理结束后应把勾子信息传递给下一个勾子函数。 </div>
		<div class="text4">（3）勾子特别是系统勾子会消耗消息处理时间，降低系统性能。只有在必要的时候才安装勾子，在使用完毕后要及时卸载。</div>
		<hr color="#cccccc" size="1" />
		<div class="text2">钩子类型</div>
		<div class="text4">
		</div>
		<div class="text4">每一种类型的Hook可以使应用程序能够监视不同类型的系统消息处理机制。下面描述所有可以利用的Hook类型。</div>
		<div class="text4">1、WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks</div>
		<div class="text4">WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks使你可以监视发送到窗口过程的消息。系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook子程，并且在窗口过程处理完消息之后调用WH_CALLWNDPROCRET Hook子程。</div>
		<div class="text4">WH_CALLWNDPROCRET Hook传递指针到CWPRETSTRUCT结构，再传递到Hook子程。</div>
		<div class="text4">CWPRETSTRUCT结构包含了来自处理消息的窗口过程的返回值，同样也包括了与这个消息关联的消息参数。</div>
		<div class="text4">2、WH_CBT Hook</div>
		<div class="text4">在以下事件之前，系统都会调用WH_CBT Hook子程，这些事件包括：</div>
		<div class="text4">1. 激活，建立，销毁，最小化，最大化，移动，改变尺寸等窗口事件；</div>
		<div class="text4">2. 完成系统指令；</div>
		<div class="text4">3. 来自系统消息队列中的移动鼠标，键盘事件；</div>
		<div class="text4">4. 设置输入焦点事件；</div>
		<div class="text4">5. 同步系统消息队列事件。</div>
		<div class="text4">
		</div>
		<div class="text4">Hook子程的返回值确定系统是否允许或者防止这些操作中的一个。</div>
		<div class="text4">3、WH_DEBUG Hook</div>
		<div class="text4">在系统调用系统中与其他Hook关联的Hook子程之前，系统会调用WH_DEBUG Hook子程。你可以使用这个Hook来决定是否允许系统调用与其他Hook关联的Hook子程。</div>
		<div class="text4">4、WH_FOREGROUNDIDLE Hook</div>
		<div class="text4">当应用程序的前台线程处于空闲状态时，可以使用WH_FOREGROUNDIDLE Hook执行低优先级的任务。当应用程序的前台线程大概要变成空闲状态时，系统就会调用WH_FOREGROUNDIDLE Hook子程。</div>
		<div class="text4">5、WH_GETMESSAGE Hook</div>
		<div class="text4">应用程序使用WH_GETMESSAGE Hook来监视从GetMessage or PeekMessage函数返回的消息。你可以使用WH_GETMESSAGE Hook去监视鼠标和键盘输入，以及其他发送到消息队列中的消息。</div>
		<div class="text4">6、WH_JOURNALPLAYBACK Hook</div>
		<div class="text4">WH_JOURNALPLAYBACK Hook使应用程序可以插入消息到系统消息队列。可以使用这个Hook回放通过使用WH_JOURNALRECORD Hook记录下来的连续的鼠标和键盘事件。只要WH_JOURNALPLAYBACK Hook已经安装，正常的鼠标和键盘事件就是无效的。</div>
		<div class="text4">WH_JOURNALPLAYBACK Hook是全局Hook，它不能象线程特定Hook一样使用。</div>
		<div class="text4">WH_JOURNALPLAYBACK Hook返回超时值，这个值告诉系统在处理来自回放Hook当前消息之前需要等待多长时间（毫秒）。这就使Hook可以控制实时事件的回放。</div>
		<div class="text4">WH_JOURNALPLAYBACK是system-wide local hooks，它們不會被注射到任何行程位址空間。</div>
		<div class="text4">7、WH_JOURNALRECORD Hook</div>
		<div class="text4">WH_JOURNALRECORD Hook用来监视和记录输入事件。典型的，可以使用这个Hook记录连续的鼠标和键盘事件，然后通过使用WH_JOURNALPLAYBACK Hook来回放。</div>
		<div class="text4">WH_JOURNALRECORD Hook是全局Hook，它不能象线程特定Hook一样使用。</div>
		<div class="text4">WH_JOURNALRECORD是system-wide local hooks，它們不會被注射到任何行程位址空間。</div>
		<div class="text4">8、WH_KEYBOARD Hook</div>
		<div class="text4">在应用程序中，WH_KEYBOARD Hook用来监视WM_KEYDOWN and WM_KEYUP消息，这些消息通过GetMessage or PeekMessage function返回。可以使用这个Hook来监视输入到消息队列中的键盘消息。</div>
		<div class="text4">9、WH_KEYBOARD_LL Hook</div>
		<div class="text4">WH_KEYBOARD_LL Hook监视输入到线程消息队列中的键盘消息。</div>
		<div class="text4">10、WH_MOUSE Hook</div>
		<div class="text4">WH_MOUSE Hook监视从GetMessage 或者 PeekMessage 函数返回的鼠标消息。使用这个Hook监视输入到消息队列中的鼠标消息。</div>
		<div class="text4">11、WH_MOUSE_LL Hook</div>
		<div class="text4">WH_MOUSE_LL Hook监视输入到线程消息队列中的鼠标消息。</div>
		<div class="text4">12、WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks</div>
		<div class="text4">WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我们可以监视菜单，滚动条，消息框，对话框消息并且发现用户使用ALT+TAB or ALT+ESC 组合键切换窗口。WH_MSGFILTER Hook只能监视传递到菜单，滚动条，消息框的消息，以及传递到通过安装了Hook子程的应用程序建立的对话框的消息。WH_SYSMSGFILTER Hook监视所有应用程序消息。</div>
		<div class="text4">
		</div>
		<div class="text4">WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我们可以在模式循环期间过滤消息，这等价于在主消息循环中过滤消息。</div>
		<div class="text4">
		</div>
		<div class="text4">通过调用CallMsgFilter function可以直接的调用WH_MSGFILTER Hook。通过使用这个函数，应用程序能够在模式循环期间使用相同的代码去过滤消息，如同在主消息循环里一样。</div>
		<div class="text4">13、WH_SHELL Hook</div>
		<div class="text4">外壳应用程序可以使用WH_SHELL Hook去接收重要的通知。当外壳应用程序是激活的并且当顶层窗口建立或者销毁时，系统调用WH_SHELL Hook子程。</div>
		<div class="text4">WH_SHELL 共有５钟情況：</div>
		<div class="text4">1. 只要有个top-level、unowned 窗口被产生、起作用、或是被摧毁；</div>
		<div class="text4">2. 当Taskbar需要重画某个按钮；</div>
		<div class="text4">3. 当系统需要显示关于Taskbar的一个程序的最小化形式；</div>
		<div class="text4">4. 当目前的键盘布局状态改变；</div>
		<div class="text4">5. 当使用者按Ctrl+Esc去执行Task Manager（或相同级别的程序）。</div>
		<div class="text4">按照惯例，外壳应用程序都不接收WH_SHELL消息。所以，在应用程序能够接收WH_SHELL消息之前，应用程序必须调用SystemParametersInfo function注册它自己。</div>
<img src ="http://www.blogjava.net/yifeng661/aggbug/72742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng661/" target="_blank">伊峰</a> 2006-09-29 10:45 <a href="http://www.blogjava.net/yifeng661/articles/72742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下软件的安装与卸载</title><link>http://www.blogjava.net/yifeng661/articles/71602.html</link><dc:creator>伊峰</dc:creator><author>伊峰</author><pubDate>Sun, 24 Sep 2006 13:57:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng661/articles/71602.html</guid><wfw:comment>http://www.blogjava.net/yifeng661/comments/71602.html</wfw:comment><comments>http://www.blogjava.net/yifeng661/articles/71602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng661/comments/commentRss/71602.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng661/services/trackbacks/71602.html</trackback:ping><description><![CDATA[在Windows 下安装软件时，只需运行软件的安装程序（setup、install等）或者用zip等解压缩软件解开即可安装，运行反安装程序（uninstall、 unware、“卸载”等）就能将软件清除干净，完全图形化的操作界面，简单到只要用鼠标一直点击“下一步”就可以了。而Linux好象就不一样了，很多 的初学者都抱怨在Linux下安装和卸载软件非常地困难，没有像使用Windows时那么直观。其实在Linux下安装和卸载软件也非常简单，同样也有安 装向导或解压安装的方式，不相同的只不过是除了二进制形式的软件分发外，还有许许多多以源代码形式分发的软件包，下面就来详细地讲一讲这些软件的安装与卸 载： <br /><br />一、二进制分发软件包的安装与卸载 <br />Linux软件的二进制分发是指事先已经编译好二进制形式的软件包的发布形式，其优点是安装使用容易，缺点则是缺乏灵活性，如果该软件包是为特定的硬件/操作系统平台编译的，那它就不能在另外的平台或环境下正确执行。 <br />1、*.rpm形式的二进制软件包 <br />安装：rpm -ivh *.rpm <br />卸载：rpm -e packgename <br />说 明：RPM（RedHat Packge Manager）是RedHat公司出的软件包管理器，使用它可以很容易地对rpm形式的软件包进行安装、升级、卸载、验证、查询等操作，安装简单，而卸 载时也可以将软件安装在多处目录中的文件删除干净，因此推荐初学者尽可能使用rpm形式的软件包。rpm的参数中-i是安装，-v是校验，-h是用散列符 显示安装进度，*.rpm是软件包的文件名（这里的*.rpm特指*.src.rpm以外的以rpm为后缀的文件）；参数-e是删除软件包， packgename是软件包名，与软件包的文件名有所区别，它往往是文件名中位于版本号前面的字符串，例如apache-3.1.12- i386.rpm和apache-devel-3.1.12-i386.rpm是软件包文件名，它们的软件包名称分别是apache和apache- devel。更多的rpm参数请自行参看手册页：man rpm。 <br />如果你不喜欢在字符界面下安装或卸载这些软件包，完全可以在X-Window下使用图形界面的软件包管理程序，如glint、xrpm这样的图形接口，或者是KDE的kpackge等，这样对软件包的安装、升级、卸载、验证和查询就可以通过点击鼠标来轻松完成。 <br />2、*.tar.gz/*.tgz、*.bz2形式的二进制软件包 <br />安装：tar zxvf *.tar.gz 或 tar yxvf *.bz2 <br />卸载：手动删除 <br />说 明：*.tar.gz/*.bz2形式的二进制软件包是用tar工具来打包、用gzip/bzip2压缩的，安装时直接解包即可。对于解压后只有单一目录 的软件，卸载时用命令“rm -rf 软件目录名”；如果解压后文件分散在多处目录中，则必须一一手动删除（稍麻烦），想知道解压时向系统中安装了哪些文件，可以用命令“tar ztvf *.tar.gz”/“tar ytvf *.bz2”获取清单。tar的参数z是调用gzip解压，x是解包，v是校验，f是显示结果，y是调用bzip2解压，t是列出包的文件清单。更多的参 数请参看手册页：man tar。 <br />如果你更喜欢图形界面的操作，可以在X-Window下使用KDE的ArK压缩档案管理工具。 <br />3、提供安装程序的软件包 <br />这 类软件包已经提供了安装脚本或二进制的安装向导程序（setup、install、install.sh等），只需运行它就可以完成软件的安装；而卸载时 也相应地提供了反安装的脚本或程序。例如SUN公司的StarOffice办公软件套件就使用名为setup的安装程序，而且在软件安装后提供反安装的功 能，目前这种类型的软件包还比较少，因其安装与卸载的方式与Windows软件一样，所以就无需多讲了。 <br /><br />二、源代码分发软件包的安装与卸载 <br />Linux软件的源代码分发是指提供了该软件所有程序源代码的发布形式，需要用户自己编译成可执行的二进制代码并进行安装，其优点是配置灵活，可以随意去掉或保留某些功能/模块，适应多种硬件/操作系统平台及编译环境，缺点是难度较大，一般不适合初学者使用。 <br />1、*.src.rpm形式的源代码软件包 <br />安装：rpm -rebuild *.src.rpm <br />cd /usr/src/dist/RPMS <br />rpm -ivh *.rpm <br />卸载：rpm -e packgename <br />说明：rpm --rebuild *.src.rpm命令将源代码编译并在/usr/src/dist/RPMS下生成二进制的rpm包，然后再安装该二进制包即可。packgename如前所述。 <br />2、*.tar.gz/*.tgz、*.bz2形式的源代码软件包 <br />安装：tar zxvf *.tar.gz 或 tar yxvf *.bz2 先解压 <br />然后进入解压后的目录： <br />./configure 配置 <br />make 编译 <br />make install 安装 <br />卸载：make uninstall 或 手动删除 <br />说 明：建议解压后先阅读说明文件，可以了解安装有哪些需求，有必要时还需改动编译配置。有些软件包的源代码在编译安装后可以用make install命令来进行卸载，如果不提供此功能，则软件的卸载必须手动删除。由于软件可能将文件分散地安装在系统的多个目录中，往往很难把它删除干净， 那你应该在编译前进行配置，指定软件将要安装到目标路径：./configure --prefix=目录名，这样可以使用“rm -rf 软件目录名”命令来进行干净彻底的卸载。与其它安装方式相比，需要用户自己编译安装是最难的，它适合于使用Linux已有一定经验的人，一般不推荐初学者 使用。 <br /><br />关于Linux下软件的安装与卸载lanche已经讲了这么多，但可能还会有人问怎么知道一个tar.gz/bz2包是二进制 文件包呢还是源代码包？如果你用过压缩工具就会明白，压缩包未必就是软件，它也可能是备份的许多图片，也可能是打包在一起的普通资料，要分辨它到底是什么 最好的办法就是查看包里的文件清单，使用命令tar ztvf *.tar.gz / tar ytvf *.bz2或者在X-Window下使用图形化的ArK压缩档案管理工具都可以，源代码包里的文件往往会含有种种源代码文件，头文件*.h、c代码源文件 *.c、C++代码源文件*.cc/*.cpp等；而二进制包里的文件则会有可执行文件（与软件同名的往往是主执行文件），标志是其所在路径含有名为 bin的目录（仅有少数例外）。原来这么简单呀，还不快点自己试试！ <br /><br /><br /><span style="COLOR: red">第二篇</span>： <br /><br />如何安装Linux的软件 <br /><br />在windows 下安装软件大家都觉得很容易，只要双击setup或是install的图标，然后跟着向导一步一步的按提示做就可以了，但是在linux下安装软件就不像 windows下那样容易了，有时你找到的是没有编译过的软件源码，那就更加的麻烦了，这里就介绍一下如何安装linux的软件啦！ <br />linux下的软件一般都是经过压缩的，主要的格式有这几种：rpm、tar、tar.gz、tgz等。所以首先拿到软件后第一件事就是解压缩。 <br />一、 在xwindow下以rpm格式的软件安装比较容易，只要在把鼠标移到文件上单击右键，在弹出的菜单里会有专门的三项（只有在右键单击rpm文件才会出 现）show info，upgrade和install，这三项的意思大家都很清楚了，我就不多说了。rpm格式说了，接着就是tar，tar.gz，tgz等，在 xwindow下双击这些格式的文件就会自动解压缩的，是解压缩而不是像rpm那样有install选项的，install文件会在你解压缩后才出现，不 过这里我要先说一下，在你双击install前建议先好好看一下readme，因为你所要安装这些软件可能是没有编译的，所以看一下会比较好。 <br />二、 说完了xwindow下的安装和解压缩，接着说在文本模式下如何解压缩和安装，还有编译源码了。首先说rpm的，以root身份登陆后（用其他的身份登陆 也可以但有些软件就不能被安装）键入rpm －i你所要解压缩的文件＋扩展名（当然是rpm）也不是很难吧，这里我要说的是“－i”意思是install，如果你想要卸载或是要执行其他的指令就打 rpm －－help，看电脑给你的提示吧，为了照顾那些E文不太好的人我这里就写几个常用的参数：－e：卸载相关的应用程序，－U（注意是大写）：升级软件包， －pql：列出rpm软件包的相关信息，－qf：查找指定文件属于哪个软件包。至于那些其他格式的软件则可以用gunzip，gzip，tar和 unzip等指令来解压缩，然后再运行install。通过解包后会得到一些文件，然后进入刚才解压缩后文件目录用“ls －F －color”指令看一下所得到的文件，一般有两种情况：第一种是文件为已经编译好的程序（无须再编译了）用上面的察看文件命令会以带“＊”标记的亮绿色 显示；第二种则是需要由你自己编译的源代码。得到的是源代码的话，就需要我们自己编译来得到可运行的程序。编译源代码听到编译是不是就吓到你了呢，其实说 穿了也就加上几句话而已，对初学者是有些困难想用好的操作系统就需要学习嘛，等你学会了在MM前露一手的时候想想吧……，在编译之前先要认真的阅读一下 readme文档，老鸟们就不需要了吧，等你阅读完了以后就执行 <br />./configure <br />make <br />make install（只有Root身份才能执行此命令），编译完成之后便会在当前目录或src子目录下得到软件的可执行程序。 <br />介绍完了，大家是不是觉的RPM的软件安装比较容易一点呢，但我个人意见初学者还是多选择RPM格式以外的软件，因为通过编译软件的源码可以为你以后编译内核打下一定的基础。（上海 张国荣） <br /><br /><br /><span style="COLOR: red">第三篇</span>： <br /><br />轻松安装、卸载Linux软件 <br /><br />Linux 软件的安装和卸载一直是困扰许多新用户的难题。在Windows中，我们可以使用软件自带的安装卸载程序或在控制面板中的“添加/删除程序”来实现。与其 相类似，在Linux下有一个功能强大的软件安装卸载工具，名为RPM。它可以用来建立、安装、查询、更新、卸载软件。该工具是在命令行下使用的。在 Shell的提示符后输入rpm，就可获得该命令的帮助信息。 <br /><br />软件的安装 <br />Linux下软件的安装主要有两种不同的形式。第一种安装文件名为xxx.tar.gz；另一种安装文件名为xxx.i386.rpm。以第一种方式发行的软件多为以源码形式发送的；第二种方式则是直接以二进制形式发送的。 <br /><br />对于第一种，安装方法如下： <br /><br />1.首先，将安装文件拷贝至你的目录中。例如，如果你是以root身份登录上的，就将软件拷贝至/root中。 <br /><br />#cp xxx.tar.gz /root <br /><br />2.由于该文件是被压缩并打包的,应对其解压缩。命令为： <br /><br />#tar xvzf filename.tar.gz <br /><br />3.执行该命令后，安装文件按路径，解压缩在当前目录下。用ls命令可以看到解压缩后的文件。通常在解压缩后产生的文件中，有“Install”的文件。该文件为纯文本文件，详细讲述了该软件包的安装方法。 <br /><br />4.执行解压缩后产生的一个名为configure的可执行脚本程序。它是用于检查系统是否有编译时所需的库，以及库的版本是否满足编译的需要等安装所需要的系统信息。为随后的编译工作做准备。命令为：#./configure。 <br /><br />5.检查通过后，将生成用于编译的MakeFile文件。此时，可以开始进行编译了。编译的过程视软件的规模和计算机性能的不同，所耗费的时间也不同。命令为：#make。 <br /><br />6.成功编译后，键入如下的命令开始安装： <br /><br />#make install <br /><br />7.安装完毕，应清除编译过程中产生的临时文件和配置过程中产生的文件。键入如下命令： <br /><br />#make clean <br />#make distclean <br /><br />至此，软件的安装结束。 <br /><br />对于第二种，其安装方法要简单得多。 <br /><br />同第一种方式一样，将安装文件拷贝至你的目录中。然后使用rpm来安装该文件。命令如下： <br /><br />#rpm -i filename.i386.rpm <br /><br />rpm将自动将安装文件解包，并将软件安装到缺省的目录下。并将软件的安装信息注册到rpm的数据库中。参数i的作用是使rpm进入安装模式。 <br /><br />软件的卸载 <br />1.软件的卸载主要是使用rpm来进行的。卸载软件首先要知道软件包在系统中注册的名称。键入命令： <br /><br />#rpm -q -a <br /><br />即可查询到当前系统中安装的所有的软件包。 <br /><br />2.确定了要卸载的软件的名称，就可以开始实际卸载该软件了。键入如下命令即可卸载软件： <br /><br />#rpm -e [package name] <br /><br />参数e的作用是使rpm进入卸载模式。对名为[package name]的软件包进行卸载。由于系统中各个软件包之间相互有依赖关系。如果因存在依赖关系而不能卸载，rpm将给予提示并停止卸载。你可以使用如下的命令来忽略依赖关系，直接开始卸载： <br /><br />#rpm -e [package name] -nodeps <br /><br />忽略依赖关系的卸载可能会导致系统中其它的一些软件无法使用。 <br /><br /><span style="COLOR: red">补充</span>： <br /><br />如果是以.bin结尾的二进制软件，可以用以下方法安装（以so-6_0-beta-bin-linux-zh-Tw1.bin为例）： <br /><br />在so-6_0-beta-bin-linux-zh-Tw1.bin所在文件夹下运行模拟终端 <br />输入： <br />./so-6_0-beta-bin-linux-zh-Tw1.bin <br />并按回车！ <br /><br />当然也可以输入： <br />./so 再用[Tab]键补全 <br /><br />（./表示当前目录，如果终端不在该软件所在目录下打开，则在软件名前尚需输入相应的路径。） <br /><br />如果在图形界面，也可直接单击（或双击，视具体的鼠标设置而定）进行安装！<br /><img src ="http://www.blogjava.net/yifeng661/aggbug/71602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng661/" target="_blank">伊峰</a> 2006-09-24 21:57 <a href="http://www.blogjava.net/yifeng661/articles/71602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux基本操作知识</title><link>http://www.blogjava.net/yifeng661/articles/71601.html</link><dc:creator>伊峰</dc:creator><author>伊峰</author><pubDate>Sun, 24 Sep 2006 13:53:00 GMT</pubDate><guid>http://www.blogjava.net/yifeng661/articles/71601.html</guid><wfw:comment>http://www.blogjava.net/yifeng661/comments/71601.html</wfw:comment><comments>http://www.blogjava.net/yifeng661/articles/71601.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yifeng661/comments/commentRss/71601.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yifeng661/services/trackbacks/71601.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<strong>3.1 登录和退出系统</strong>
				<br />
				<br />　　1. 启动系统 <br />　　通常LILO是安装在MBR上的，计算机启动后，MBR上的程序被执行，将出现一个不是很漂亮的图形：左边是一个小红帽图像，右边列出了可以启动的操作系统，你可以使用键盘箭头切换。刚安装好后默认值是Linux，也就是你不选择，一会儿将自己启动Linux。 <br />　　如果你想默认的选择是Windows的话，那你可以在启动Linux后，用vi修改/etc目录下的lilo.conf文件，加上default=windows，然后再执行/sbin/lilo重新生成LILO。 <br /><br />　　2. 用户登录 <br />　　Linux是一个真正意义上的多用户操作系统，用户要使用该系统，首先必须登录，使用完系统后，必须退出。用户登录系统时，为了使系统能够识别该用户，必须输入用户名和密码，经系统验证无误后才可以登录系统使用。 <br />　　Linux下有两种用户： <br />　　1） root用户：超级权限者，系统的拥有者，在Linux系统中有且只有一个root用户，它可以在系统中任何操作。在系统安装时所设定的密码就是root用户的密码。 <br />　　2） 普通用户：Linux系统可以创建许多普通用户，并为其指定相应的权限，使其有限地使用Linux系统。 <br />　　关于用户的管理，我们将在后面详细说明。 <br />　　用户登录分两步进行： <br />　　1） 输入用户的登录名，系统根据该登录名来识别用户； <br />　　2） 输入用户的口令，该口令是用户自己选择的一个字符串，对其他用户完全保密，是登录系统时识别用户的唯一根据，因此每一个用户都应该保护好自己的口令！ <br />　　系统在建立之初，仅有root用户，其它的用户则是由root用户创建的。由于root用户的权限太大了，所以如果root用户误操作将可能造成很大的损失。所以建议系统管理员为自已新建一个用户，只有需要做系统维护、管理任务时才以root用户登录。 <br />　　下面就是一个登录实例：（其中黑体字为输入） <br />　　Red Hat Linux release 7.1 (Seawolf) <br />　　Kernerl 2.4.2-2 on an i686 <br />　　Home login:root <br />　　Password: <br />　　在上面的例子中，我们发现在Password后面是空的，其实并不是不输入密码，而是在输入时，Linux系统不会把它显示出来，这样用来保护密码！<br /><br />　 　如果登录成功的话，我们将获得Shell（Shell是用来与用户交互的程序，它就象DOS中的COMMAND.COM，不过在Linux下可以有多种 Shell供选择，如bash、csh、ksh等）提示符，如果以root用户登录的话，那么获得的提示符是“#”，否则将是“$”。 <br />　　提示：如果当时在安装时设置为一启动就进入图形界面的话，那系统启动后，用户登录界面将是图形化的，有点象Windows，而且当你输入正确的用户名与密码，就会直接进入X Window。这个设置是可以修改的： <br />　　在/etc目录下有一个inittab文件，其中有一行配置： <br />　　id:3:default <br />　　其中，数字3就是代表一启动进入字符终端，如果改为5则代表一启动进入X Window。 <br /><br />　　3. 修改口令 <br />　　为了更好地保护用户帐号的安全，Linux允许用户在登录之后随时使用passwd命令修改自己的口令。修改口令需要经历： <br />　　1） 输入原来的口令，如果口令输错，将中止程序，无法修改口令； <br />　　2） 输入新的口令； <br />　　3） 提示重复一遍新的口令，如果两次输入的口令相吻合，则口令修改成功。 <br />　　需要注意的是，Red Hat Linux 7.1为了更好地保护口令，如果你输入的新口令过于简单，它将会拒绝修改。下面就是一个修改口令的实例：（其中黑体字为输入） <br />　　$ passwd <br />　　Changing password for user1 <br />　　(current) UNIX password: ß 在些输入原来的密码 <br />　　New UNIX password: ß 输入新的密码 <br />　　Retype new UNIX password: ß 再输入一遍新的密码 <br />　　Passwd:all authentication tokens updated successfully ß 修改成功！ <br />　　注意，在这里输入的口令同样不会显示出来。 <br />　　而如果是root用户修改口令，则不需要输入老密码！也就是说，它可以修改任何用户的口令。 <br /><br />　　4. 退出登录 <br />　　不论你是root用户还是普通用户，只需简单地执行exit命令就可以退出登录。 <br /><br />　　5. 关闭机器 <br />　　在Linux系统中，普通用户是无权关闭系统的！只有root用户才能够关闭它。当然如果你是按关机按钮则别当别论。我们可以通过以下几种方法实现： <br />　　1） 按下CTRL+ALT+DEL组合键，这样系统将重新启动！ <br />　　2） 执行reboot命令，这样系统也将重新启动！ <br />　　3） 执行shutdown -h now命令，这样系统将关闭计算机！ <br />　　4） 执行halt命令，可以关闭计算机。 <br />　　注意千万不要随意采用硬关机、重启动键等方式关闭系统，那样会导致Linux文件系统遭受破坏！ <br /><br />　　6. 虚拟控制台 <br />　　Linux是真正的多用户操作系统，可以同时接受多个用户的远程和本地登录，也允许同一个用户多次登录。Linux为本地用户（也就是做在计算机面前的用户）提供了虚拟控制台访问方式，允许用户在同一时间从不同的控制台进行多次登录。 <br />　　虚拟控制台的选择可以通过按ALT键加上F1-F6六个功能键来实现。例如，用户登录后，按一下ALT+F2组合键，用户又可以看到“login:”提示符，这其实就是第二个虚拟控制台，而这时再按下ALT+F1组合键，用户则又可以回到第一个虚拟控制台。 <br />　 　大家可以通过使用虚拟控制台来感受Linux系统多用户的特性。例如用户可以在某一虚拟控制台上进行的工作尚未结束时，就可以切换到另一个虚拟控制台上 开始另一项工作。例如在开发软件时，可以在一个控制台上编辑程序，在另一个控制台上进行编译，在第三个控制台上查阅信息。<br /><br />　　<strong>3.2 文件与目录操作</strong><br />　　与其它操作系统一样，在Linux系统下用户的数据和程序也是以文件的形式保存的。所以在使用Linux的过程中，是经常要对文件与目录进行操作的。现在我们就以一个Window用户的立场来学习一下Linux下的文件与目录操作方法。 <br /><br />　　1. 文件名与文件类型 <br />　　文件名是一个文件的标识。从这个角度来说，文件名的规则与Windows 9x下的是基本上相同的。它同样是由字母、数字、下划线、圆点组成，最大的长度是255个字符。 <br />　 　与Windows 9x一样，Linux系统中也有普通文件和目录文件，不过目录文件在Window中被简称为目录就是了。而在Linux系统中有一种特殊的文件，那就是设 备文件。在Linux系统中，把每一个I/O设置都映射成为一个文件，可以象普通文件一样处理，这就使得文件与设备的操作尽可能统一。从用户的用户来说， 对I/O设备的使用和一般文件的使用几乎一样，这样就可以不必了解I/O设备的细节。 <br /><br />　　2. 目录结构 <br />　　与Windows下一样，在Linux中也是通过目录来组织文件的。但不同的是，在Linux下只有一个根目录，而不象Windows那样一个分区一个根目录。如果有多个分区的话，就需要将其它分区mount到根目录上来用。 <br />　　大家回忆一下当时为Linux分区时，有一个选项要填，那就是Mount Point，我们将其中一个写成了“/”，也就是根目录（这点与Windows相反，一个是“\”，一个是“/”，真是天生冤家）。其它脑蚩赡苁?home、/usr。 <br />　　安装完系统后，你会发现/home、/usr就是根目录下面的home、usr目录！对了，整个分区就用于该目录了。 <br />　　安装完Linux后，有许许多多的目录，下面我们就说明一些重要的目录： <br />　　/bin：存放着一百多个Linux下常用的命令、工具 <br />　　/dev：存放着Linux下所有的设备文件！<br /><br />　　/home：用户主目录，每建一个用户，就会在这里新建一个与用户同名的目录，给该用户一个自己的空间 <br />　　/lost+found：顾名思义，一些丢失的文件可能可以在这里找到 <br />　 　/mnt：外部设备的挂接点，通常用cdrom与floppy两个子目录！它的存在简化了光盘与软盘的使用。你只需在塞入光盘后，运行：mount /mnt/cdrom，就可以将光盘上的内容Mount到/mnt/cdrom上，你就可以访问了。不过你使用完成后，应该离开该目录，并执行 umount /mnt/cdrom。同样的，软盘就是mount /mnt/floppy和umount /mnt/floppy了。 <br />　　/proc：这其实是一个假的目录，通过这里你可以访问到内存里的内容。 <br />　　/sbin：这里存放着系统级的命令与工具 <br />　　/usr：通常用来安装各种软件的地方 <br />　　/usr/X11R6 X Window目录 <br />　　/usr/bin与/usr/sbin 一些后安装的命令与工具 <br />　　/usr/include、/usr/lib及/usr/share 则是存放一些共享链接库 <br />　　/usr/local 常用来安装新软件 <br />　　/usr/src Linux源程序 <br />　　/boot：Linux就是从这里启动的 <br />　　/etc：这里存放在Linux大部分的配置文件 <br />　　/lib：静态链接库 <br />　　/root：root用户的主目录，这就是特权之一！ <br />　　/var：通常用来存放一些变化中的东西！ <br />　　/var/log：存放系统日志 <br />　　/var/spool：存放一些邮件、新闻、打印队列等 <br />　　另外，要说明的是，在Linux下“当前目录”、“路径”等概念与Windows下是一样的。 <br />　　<strong>3. 显示文件内容</strong><br />　　使用过DOS命令的人都应该知道，我们可以使用type命令来查看一个文件的内容。在Linux下有五个相关的命令，功能各有千秋，不过它们都象type命令一样，只能用来查看文本文件。 <br />　　1） cat命令 <br />　　cat命令是最象type命令的，使用的方法很简单：“cat 文件名”。不过比type命令更强大的是，它可以同时查看多个文件：“cat 文件名一 文件名二”。 <br />　　2） more命令 <br />　 　如果文本文件比较长，一屏无法显示完，那么使用cat命令就可能无法看清。这里我们可以简单地使用more来代替cat命令即可。其效果与type 文件名/p类似。使用more命令将一次显示一屏文本，显示满后，停下来，并提示出已显示全部内容的百分比，按空格键就可以看到下一屏。 <br />　　3） less命令 <br />　　less命令的功能几乎和more命令一样，也是按页显示文件，不同之处在于less命令在显示文件时允许用户既可以向前又可以向后翻阅文件。 <br />　　Ø 向前翻：按b键； <br />　　Ø 向后翻：按p键； <br />　　Ø 指定位置：输入百分比 <br />　　Ø 退出：q <br />　　我经常使用more和less，几乎不使用cat查看文件。 <br />　　4） head命令 <br />　　通过head命令可以仅查看某文件的前几行，格式为： <br />　　head 行数 文件名 <br />　　如果未指定行数，则使用默认值10。 <br />　　5） tail命令 <br />　　与head命令相对应的，我们可以使用tail命令来查看文件尾部的内容。通常用来实时监测某个文件是否被修改，通常用来观察日志。如： <br />　　tail -f maillog <br /><br />　　4. 编辑文件 <br />　　在Red Hat Linux 7中有许多文字编辑工具，其中最常用的应该是vi，这是一个广泛应用于所有UNIX系统的编辑器。它的使用有些特别： <br />　　首先，可以使用命令“vi 文件名”打开一个文件。 <br />　　刚启动的时候，vi处于命令状态，不能够输入任何字符。在这个状态下，可以使用方向键进行移动，而需要输入内容时，你需要输入“i”或“a”命令进入编辑状态。编辑完成后，你需要按下“ESC”键回到命令状态。 <br />　　在命令状态下，你可以输入“:q!”不存盘退出，输入“:wq”存盘退出。 <br /><br />　　5. 文件的复制、删除与移动 <br />　　大家都早已熟知在DOS下我们可以使用copy、del、move命令来实现文件的复制、删除与移动。下面我们说说如何在Linux系统中做以上操作。 <br />　　1） cp命令：文件/目录复制命令 <br />　　它的语法格式为：cp [选项] 源文件或目录 目标文件或目录 <br />　　常用的选项有： <br />　　Ø a 该选项常在复制目录时使用，它保留链接、文件属性，并递归地复制目录，就象DOS中的xcopy /s一样 <br />　　Ø f 如果目标文件或目录已存在，就覆盖它，并且不做提示<br /><br />　　Ø i 与f选项正好相反，它在覆盖时，会让用户回答“Y”来确认 <br />　　Ø p 使用该选项，复制文件时将保留修改时间和访问权限 <br />　　Ø r 若给出的源是一个目录，那么cp将递归复制该目录下所有的子目录和文件，不过这要求目标也是一个目录名 <br />　　另外，大家要注意的是，如果源是文件名，目标是目录名的话，那么使用cp命令可以指定多个源文件名。如： <br />　　$ cp a.txt b.txt /home/user1 <br />　　该命令将把a.txt和b.txt文件复制到/home/usr1目录中。 <br />　　2） rm命令：文件/目录删除命令 <br />　　它的语法格式为：rm [选项] 文件 … <br />　　常用的选项有： <br />　　Ø f 在删除过程中不给任何指示，直接删除 <br />　　Ø r 指示rm将参数中列出的全部目录和子目录都递归地删除 <br />　　Ø i 交互式的删除，每个文件在删除时都给出提示 <br />　　使用rm命令时一定要小心，特别是以root用户登录时，我就看到过一个朋友在使用rm命令删除/home/tmp目录时将命令“rm -rf /home/tmp”误输成了 “rm -rf / home/tmp”，结果等他走回电脑面前，整个系统都被删除了！ <br />　　3） mv命令：文件/目录移动命令 <br />　　它的语法格式为：mv [选项] 源文件或目录 目标文件或目录 <br />　　常用的选项有： <br />　　Ø f 如果操作要覆盖某已有的目标文件时不给任何指示 <br />　　Ø i 交互式的操作，如果操作要覆盖某已有的目标文件时会询问用户是否覆盖 <br />　　mv命令的执行效果与参数类型的不同而不同！ <br />　　第一参数（源） 第二个参数（目标） 结果 <br />　　文件名 文件名 将源文件名改为目标文件名 <br />　　文件名 目录名 将文件移动到目标目录 <br />　　目录名 目录名 目标目录已存在：源目录移动到目标目录 <br />　　目标目录不存在：改名 <br />　　目录名 文件名 出错 <br /><br />　　<strong>6. 目录相关操作</strong><br />　　1） 创建新目录：mkdir，它的使用与DOS下的md相同：mkdir 目录名； <br />　　2） 删除空目录：rmdir，它的使用与DOS下的rd相同：rmdir 目录名； <br />　 　3） 改变目录：cd，它的使用与DOS下的cd命令基本相同，唯一一个不同的是，不管目录名是什么，cd与目录名之间必须有空格，也就是：“cd/”、 “cd..”、“cd.”都是非法的，而应该输入：“cd /”、“cd ..”、“cd .”，如果直接输入命令“cd”，而不加任何参数，将回到这个用户的主目录。 <br />　　4） 显示当前目录：pwd <br />　　5） 列目录命令：ls，相当于DOS下的dir <br />　　它的语法为：ls [选项] [目录或文件] <br />　　常用的选项有： <br />　　Ø a 显示指定目录下所有的子目录与文件，包括隐藏文件； <br />　　Ø c 按文件的修改时间排序 <br />　　Ø l 采用长格式来显示文件的详细信息，每个文件一行信息，其内容为：文件类型与权限 链接数 文件属主 文件属组 文件大小 最近修改时间 文件名 <br /><br />　　7. 文件与目录的权限操作 <br />　　在Linux系统中，每一个文件和目录都有相应的访问许可权限，我们可以用它来确定谁可以通过何种方式对文件和目录进行访问和操作。文件或目录的访问权限分为可读、可写和可执行三种，分别以r，w，x表示，其含义为： <br />　　r w x <br />　　文件 可读 可写 可执行 <br />　　目录 可列出目录 可在目录中做写操作 可以访问该目录 <br />　　在文件被创建时，文件所有者可以对该文件的权限进行设置。 <br />　　对于一个文件来说，可以将用户分成三种，并对其分别赋予不同的权限： <br />　　1） 文件所有者 <br />　　2） 与文件所有者同组用户 <br />　　3） 其它用户 <br />　　每一个文件或目录的访问权限都有三组，每组用三位表示，如： <br />　　d rwx r-x r-- <br />　　第一部分：这里的d代表目录，其它的有：- 代表普通文件 c 代表字符设备文件； <br />　　第二部分：文件所有者的权限字，这里为r w x表示可读、可写、可执行 (目录的可执行指的可以进入目录)； <br />　　第三部分：与文件所有者同组的用户的权限字，这里为r - x表示可读、不可写、可执行。由于同组用户之间交流较多，让他看看文件，别乱改就行了嘛。 <br />　　第四部分：其它用户的权限字，这里为- - -，当然给我无关的人嘛，我的文件当然不但不给你写，也不让你读。 <br />　　1） 文件/目录权限设置命令：chmod <br />　　这是Linux系统管理员最常用到的命令之一，它用于改变文件或目录的访问权限。该命令有两种用法： <br />　　Ø 用包含字母和操作符表达式的文字设定法 <br />　　其语法格式为：chmod [who] [opt] [mode] 文件/目录名 <br />　　其中who表示对象，是以下字母中的一个或组合： <br />　　u：表示文件所有者 <br />　　g：表示同组用户 <br />　　o：表示其它用户 <br />　　a：表示所有用户 <br />　　opt则是代表操作，可以为： <br />　　+：添加某个权限 <br />　　-：取消某个权限 <br />　　=：赋予给定的权限，并取消原有的权限 <br />　　而mode则代表权限： <br />　　r：可读 <br />　　w：可写 <br />　　x：可执行 <br />　　例如：为同组用户增加对文件a.txt的读写权限： <br />　　chmod g+rw a.txt <br />　　Ø 用数字设定法 <br />　　而数字设定法则更为简单：chmod [mode] 文件名 <br />　　关键是mode的取值，一开始许多初学者会被搞糊涂，其实很简单，我们将rwx看成二进制数，如果有则有1表示，没有则有0表示，那么rwx r-x r--则可以表示成为： <br />　　111 101 100 <br />　　再将其每三位转换成为一个十进制数，就是754。 <br />　　例如，我们想让a.txt这个文件的权限为： <br />　　自己 同组用户 其他用户 <br />　　可读 是 是 是 <br />　　可写 是 是 <br />　　可执行 <br />　　那么，我们先根据上表得到权限串为：rw-rw-r--，那么转换成二进制数就是110 110 100，再每三位转换成为一个十进制数，就得到664，因此我们执行命令： <br />　　chmod 664 a.txt <br />　　2） 改变文件的属主命令：chown <br />　　语法格式很简单：chown [选项] 用户名 文件/目录名 <br />　　其中最常用的选项是“R”，加上这个参数，可以将整个目录里的所有子目录和文件的属主都改变成指定用户。 <br />　　3） 改变文件属组命令：chgrp <br />　　该命令也很简单：chgrp 组名 文件名 <br />　　<strong>3.3 用户管理</strong><br /><br />　　用户管理，主要的工作就是建立一个合法的用户帐户、设置和管理用户的密码、修改用户帐户的属性以及在必要时删除已经废弃的用户帐号。 <br /><br />　　1. 增加一个新用户 <br />　　在Linux系统中，只有root用户才能够创建一个新用户，如下的命令将新建一个登录名user1的用户。<br /><br />　　# useradd user1 <br />　　但是，这个用户还不能够登录，因为还没给它设置初始密码，而没有密码的用户是不能够登录系统的。在默认情况下，将会在/home目录下新建一个与用户名相同的用户主目录。如果需要另外指定用户主目录的话，那么可以使用如下命令： <br />　　# useradd -d /home/xf user1 <br />　　同时，该用户登录时将获得一个Shell程序：/bin/bash，而假如你不想让这个用户登录，也就可以指定该用户的Shell程序为：/bin/false，这样该用户即使登录，也不能够执行Linux下的命令： <br />　　# useradd -s /bin/false user1 <br />　　在Linux中，新增一个用户的同时会创建一个新组，这个组与该用户同名，而这个用户就是该组的成员。如果你想让新的用户归属于一个已经存在的组，则可以使用如下命令： <br />　　# useradd -g user user1 <br />　　这样该用户就属于user组的一员了。而如果只是想让其再属于一个组，那么应该使用： <br />　　# useradd -G user user1 <br />　　完成了这一操作后，你还应该使用passwd命令为其设置一个初始密码。 <br /><br />　　2. 删除一个用户 <br />　　删除用户，只需使用一个简单的命令“userdel 用户名”即可。不过最好将它留在系统上的文件也删除掉，你可以使用“userdel -r 用户名”来实现这一目的。 <br /><br />　　3. 修改用户属性 <br />　　在前面我们看到了在新建一个用户的时候如何指定它的用户主目录，如何指定它的Shell，如何设置它所属的组…等等。在Linux中提供了一个命令来实现： <br />　　usermod -g组名 -G 组名 -d 用户主目录 -s 用户Shell <br />　　还有一种直接的方法，那就是修改/etc/passwd文件，在这个文件中每个用户占用一行，它的内容为： <br />　　用户名:密码:用户ID:组ID:用户全名:用户主目录:用户Shell <br />　　不过值得注意的是，密码这一项通常是用一个*号代替的，你是看不到的。 <br /><br />　　4. 增加一个组 <br />　　还记得Linux的文件可以为同组的人、非同组的人设置不同的访问权限吗？我们可以根据自己的需要创建用户组： <br />　　groupadd 组名 <br /><br />　　5. 删除一个组 <br />　　同样的，我们有时会需要删除一个组，它的命令就是groupdel 组名。 <br /><br />　　6. 修改组成员 <br />　　如果我们需要将一个用户加入一个组，只需编辑/etc/group文件，将用户名写到组名的后面。例如将newuser用户加入到softdevelop组，只需找到softdevelop这一行： <br />　　softdevelop:x:506:user1,user2 <br />　　然后在后面加上newuser，形成： <br />　　softdevelop:x:506:user1,user2,newuser <br />　　另外，在Red Hat Linux中还提供一个图形化的用户管理工具：userconf，通过它可以更直接地进行用户管理。 <br />　　<strong>3.4 进程管理</strong><br /><br />　　Linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用计算机系统；多任务是指Linux可以同时执行几个任务，它可以在还未执行完一个任务时又执行另一项任务。 <br />　　在Linux系统上所有运行的东西都可以称之为一个进程。每个用户任务、每个系统管理守护进程，都可以称之为进程。Linux用分时管理方法使用所有的任务共同分享系统资源。下面我们就看一下如何控制这些进程。<br /><br />　　1. 启动进程 <br />　　在Linux系统中有两种启动进程的方法： <br />　　1） 直接输入命令，就将直接启动一个进程 <br />　　Ø 在普通情况下，进程将在前台执行，这时我们无法再执行新的命令 <br />　　Ø 如果我们在命令之后加上一个“&amp;”，那行进程将会放在后台执行，我们仍然可以执行新的命令 <br />　　2） 通过at、cron、crontab命令可以像Windows中的计划任务一样定时启动某个进程，具体的使用方法大家可以使用man 命令名来查询。 <br /><br />　　2. 查看进程 <br />　　在Linux系统中，我们可以使用ps命令来查看正在运行的进程例如： <br />　　列出属于当前用户的进程： <br />　　# ps <br />　　PID TTY TIME CMD <br />　　16767 pts/1 0:00 ps <br />　　18029 pts/1 0:00 bash <br />　　其中PID代表进程ID，TTY是该进程是由哪个控制台启动的，CMD则是命令。 <br />　　如果你想列出更详细的信息，则可使用命令：“ps -auxw”。 <br /><br />　　3. 终止进程 <br />　　一个进程在任务完成之后，将会自动完成。如果要中途中止该进程的话，有两种方法： <br />　　1） 对于在前台运行的程序，直接通过组合键CTRL+C就可以中止进程； <br />　　2） 而对于在后台运行的程序，则需要通过前面介绍的ps命令找到它的进程号，然后使用“kill 进程号”来终止该进程。 <br /><br /><br />　　<strong>3.5 磁盘管理</strong><br /><br />　　系统软件和应用软件，都要以文件的形式存储在计算机的磁盘空间中，做为系统管理员应随时监视磁盘空间的使用情况。我们可以使用下面两个命令来实现： <br /><br />　　1. df命令 <br />　　df，就是Disk Free，顾名思义就是检查磁盘上还剩下多少空间等信息。下面是一个使用实例： <br />　　# df <br />　　FileSystem 1k-blocks Used Available Use% Mounted on <br />　　/dev/hda5 4134900 1749728 2175124 45% / <br />　　/dev/hda6 6048320 5741092 0 100% /home <br />　　共显示了6列信息： <br />　　1） FileSystem：硬盘分区 <br />　　2） 1k-blocks：按K计算的分区大小 <br />　　3） Used：已经使用的分区大小（按K计算） <br />　　4） Available：还要用的分区大小 <br />　　5） Use%：已使用的空间所占百分比 <br />　　6） Mounted on：挂接点 <br />　　可以看到/home是另一个分区，现在空间已经用完了！这都时当时没有规划好！ <br />　　如果对与以K为计算单位表示硬盘空间，那么你可以使用df -m，这样就会以M为计算单位。 <br /><br />　　2. du命令 <br />　　du，就是disk usage，就是看一下磁盘使用了多少。下面就是一个使用实例： <br />　　# pwd <br />　　/var/log <br />　　# du <br />　　4 ./uucp <br />　　776 . <br />　　在这里，我们使用du命令列出了/var/log目录所占用的磁盘空间。它统计出了该目录有一个子目录：uucp，占用了4K，而/var/log目录下的文件则共有776K。 <br />　　该命令还有一些常用的选项，用来完成更多的功能： <br />　　Ø -a 将列出当前目录下所有的文件、子目录、子目录下的文件、子目录下的子目录…的磁盘占用情况 <br />　　Ø -b 以字节为单位表示占用的磁盘空间 <br />　　Ø -c 在最后显示出一个统计值 <br />　　<strong>3.6 软件安装</strong><br /><br />　　在Red Hat Linux下，应用软件的安装包通常有两种格式： <br />　　1） rpm包，如software-1.2.3-1.i386.rpm。它是Redhat Linux创造的一种包封装格式。 <br />　　2） tar包，如software-1.2.3-1.tar.gz。它是使用UNIX系统的打包工具tar打包的。 <br />　　而且，大多数Linux应用软件包的命名也有一定的规律，它遵循： <br />　　名称-版本-修正版-类型 <br />　　例如： <br />　　sfotware-1.2.3-1.i386.rpm <br />　　软件名称：software <br />　　版本号：1.2.3 <br />　　修正版本：1 <br />　　可用平台：i386，适用于Intel 80x86平台。 <br />　　类型：rpm，说明是一个rpm包。 <br />　　根据Linux应用程序软件安装包中的内容不同可以分为：： <br />　　1） 是可执行文件，也就是解开包后就可以直接运行的。在Windows中所有的软件包都是这种类型。安装完这个程序后，你就可以使用。不过下载时要注意这个软件是否是你所使用的平台，否则将无法正常安装。 <br />　　2） 另一种则是源程序，也就解开包后，你还需要使用编译器将其编译成为可执行文件。这在Windows系统中是几乎没有的，因为Windows的思想是不开放源程序的。 <br />　　通常，用tar打包的，都是源程序；而用rpm打包的则常是可执行程序。 <br /><br />　　1.搞定使用rpm打包的应用软件 <br />　　rpm可谓是Redhat公司的一大贡献，它使Linux的软件安装工作变得更加简单容易。<br /><br />　　1） 安装： <br />　　我只需简单的一句话，就可以说完。执行： <br />　　rpm -ivh rpm软件包名 <br />　　更高级的，请见下表： <br />　　rpm参数 参数说明 <br />　　-i 安装软件 <br />　　-t 测试安装，不是真的安装 <br />　　-p 显示安装进度 <br />　　-f 不管任何错误 <br />　　-U 升级安装 <br />　　-v 检测套件是否正确安装 <br />　　这些参数可以同时采用。更多的内容可以参考RPM的命令帮助。 <br />　　2） 卸载： <br />　　我同样只需简单的一句话，就可以说完。执行： <br />　　rpm -e 软件名 <br />　　不过要注意的是，后面使用的是软件名，而不是软件包名。例如，要安装software-1.2.3-1.i386.rpm这个包时，应执行： <br />　　rpm -ivh software-1.2.3-1.i386.rpm <br />　　而当卸载时，则应执行： <br />　　rpm -e software。 <br /><br />　　2． 搞定使用tar打包的应用软件 <br />　　1） 安装： <br />　　整个安装过程可以分为以下几步： <br />　　Ø 取得应用软件：通过下载、购买光盘的方法获得； <br />　 　Ø 解压缩文件：一般tar包，都会再做一次压缩，如gzip、bz2等，所以你需要先解压。如果是最常见的gz格式，则可以执行：“tar -xvzf 软件包名”，就可以一步完成解压与解包工作。如果不是，则先用解压软件，再执行“tar -xvf 解压后的tar包”进行解包； <br />　　Ø 阅读附带的INSTALL文件、README文件； <br />　　Ø 执行“./configure”命令为编译做好准备； <br />　　Ø 执行“make”命令进行软件编译； <br />　　Ø 执行“make install”完成安装； <br />　　Ø 执行“make clean”删除安装时产生的临时文件。 <br />　 　好了，到此大功告成。我们就可以运行应用程序了。但这时，有的读者就会问，我怎么执行呢？这也是一个Linux特色的问题。其实，一般来说，Linux 的应用软件的可执行文件会存放在/usr/local/bin目录下！不过这并不是“放四海皆准”的真理，最可靠的还是看这个软件的INSTALL和 README文件，一般都会有说明。 <br />　　2） 卸载： <br />　　通常软件的开发者很少考虑到如何卸载自己的软件，而tar又仅是完成打包的工作，所以并没有提供良好的卸载方法。一般都提供 make uninstall 来卸载软件的。<br /><br /><br />转自 http://rsgd.blogbus.com/index.html</div>
<img src ="http://www.blogjava.net/yifeng661/aggbug/71601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yifeng661/" target="_blank">伊峰</a> 2006-09-24 21:53 <a href="http://www.blogjava.net/yifeng661/articles/71601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>