﻿<?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-Tinysun</title><link>http://www.blogjava.net/tinysun/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 19:01:25 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 19:01:25 GMT</pubDate><ttl>60</ttl><item><title>svn修订版和最后修改的修订版[转]</title><link>http://www.blogjava.net/tinysun/archive/2012/08/23/386100.html</link><dc:creator>何克勤</dc:creator><author>何克勤</author><pubDate>Thu, 23 Aug 2012 05:13:00 GMT</pubDate><guid>http://www.blogjava.net/tinysun/archive/2012/08/23/386100.html</guid><wfw:comment>http://www.blogjava.net/tinysun/comments/386100.html</wfw:comment><comments>http://www.blogjava.net/tinysun/archive/2012/08/23/386100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tinysun/comments/commentRss/386100.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tinysun/services/trackbacks/386100.html</trackback:ping><description><![CDATA[<div style="display: inline-block; "><h1 class="xspace-title" style="word-break: break-all; font-size: 22px; background-image: url(http://www.51testing.com/attachments/2009/09/94816_200909231633415aj7m.gif); background-color: #ffffff; padding-left: 0.2em; line-height: 30px; color: #467ca2; font-family: Georgia, Arial, Helvetica, sans-serif, 微软雅黑; text-align: left; background-position: 0% 100%; background-repeat: repeat no-repeat; "></h1></div><p style="word-break: break-all; margin: 10px 0px; color: #333333; font-family: Georgia, Arial, Helvetica, sans-serif, 微软雅黑; font-size: 12px; text-align: left; background-color: #ffffff; ">花了点时间把svnbook看了遍，对于svn有了个比较好的认识。svn info时，修订版和最后修改的修订版总是让我感觉很困惑。要搞明白这个需要对下面几个关键字有所了解。</p><p style="word-break: break-all; margin: 10px 0px; color: #333333; font-family: Georgia, Arial, Helvetica, sans-serif, 微软雅黑; font-size: 12px; text-align: left; background-color: #ffffff; ">HEAD：版本库中的最新版本。</p><p style="word-break: break-all; margin: 10px 0px; color: #333333; font-family: Georgia, Arial, Helvetica, sans-serif, 微软雅黑; font-size: 12px; text-align: left; background-color: #ffffff; ">COMMITED：文件最后提交生成的版本号。</p><p style="word-break: break-all; margin: 10px 0px; color: #333333; font-family: Georgia, Arial, Helvetica, sans-serif, 微软雅黑; font-size: 12px; text-align: left; background-color: #ffffff; ">PREV：文件倒数第二次提交生成的版本号。</p><p style="word-break: break-all; margin: 10px 0px; color: #333333; font-family: Georgia, Arial, Helvetica, sans-serif, 微软雅黑; font-size: 12px; text-align: left; background-color: #ffffff; ">BASE：目录签出或者签入生成的版本号。</p><p style="word-break: break-all; margin: 10px 0px; color: #333333; font-family: Georgia, Arial, Helvetica, sans-serif, 微软雅黑; font-size: 12px; text-align: left; background-color: #ffffff; ">HEAD、COMMITED和PREV比较好理解，BASE比较难于理解。假设一个目录下有两个文件configure.ac和Makefile.am，第一次将它们check out出来时，会生成一个新的revision，这个便是BASE了。此时使用svn info configure.ac/Makefile.am可以发现它们的修订版是一样的，但是最后修改的修订版不同。这里的修订版对应其实就是BASE，而最后修改的修订版则是COMMITED。插一句，很多人很容易误解为啥修订版号和最后修改的修订版号不一致。</p><p style="word-break: break-all; margin: 10px 0px; color: #333333; font-family: Georgia, Arial, Helvetica, sans-serif, 微软雅黑; font-size: 12px; text-align: left; background-color: #ffffff; ">若将configure.ac修改并check in，这个时候会生成一个新的revision，configure.ac的BASE和COMMITED的值相当。而svn info Makefile.am，发现它的BASE和COMMITED没有改变。svn up一下，发现Makefile.am的BASE会变成最新的，和configure.ac相同。</p><p style="word-break: break-all; margin: 10px 0px; color: #333333; font-family: Georgia, Arial, Helvetica, sans-serif, 微软雅黑; font-size: 12px; text-align: left; background-color: #ffffff; ">签出代码库。</p><div id="highlighter_324879"  plain"="" style="word-break: break-all; margin: 10px 0px; color: #333333; font-family: Georgia, Arial, Helvetica, sans-serif, 微软雅黑; font-size: 12px; text-align: left; background-color: #ffffff; "><div style="word-break: break-all; line-height: normal !important; margin: 10px 0px; "><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">1</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">[henshao@henshao ~/svn]$ svn co file:///Users/henshao/svn/dogg/learn_svn/ learn_svn2</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">2</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">A&nbsp;&nbsp;&nbsp; learn_svn2/trunk</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">3</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">A&nbsp;&nbsp;&nbsp; learn_svn2/trunk/configure.ac</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">4</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">A&nbsp;&nbsp;&nbsp; learn_svn2/trunk/Makefile.am</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">5</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Checked out revision 17.</code></td></tr></tbody></table></div></div></div><p style="word-break: break-all; margin: 10px 0px; color: #333333; font-family: Georgia, Arial, Helvetica, sans-serif, 微软雅黑; font-size: 12px; text-align: left; background-color: #ffffff; ">显示修订版（BASE）和最后修改的修订版（COMMITED）。</p><div id="highlighter_440758"  plain"="" style="word-break: break-all; margin: 10px 0px; color: #333333; font-family: Georgia, Arial, Helvetica, sans-serif, 微软雅黑; font-size: 12px; text-align: left; background-color: #ffffff; "><div style="word-break: break-all; line-height: normal !important; margin: 10px 0px; "><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">01</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">[henshao@henshao ~/svn/learn_svn2/trunk]$ svn st -v</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">02</code></td><td style="word-break: break-all; "><code style="word-break: break-all; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="" style="word-break: break-all; ">17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17 henshao&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">03</code></td><td style="word-break: break-all; "><code style="word-break: break-all; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="" style="word-break: break-all; ">17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17 henshao&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; configure.ac</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">04</code></td><td style="word-break: break-all; "><code style="word-break: break-all; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="" style="word-break: break-all; ">17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15 henshao&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Makefile.am</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">05</code></td><td style="word-break: break-all; "><code style="word-break: break-all; ">&nbsp;</code>&nbsp;</td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">06</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">[henshao@henshao ~/svn/learn_svn2/trunk]$ svn info Makefile.am</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">07</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Path: Makefile.am</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">08</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Name: Makefile.am</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">09</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">URL: file:///Users/henshao/svn/dogg/learn_svn/trunk/Makefile.am</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">10</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Repository Root: file:///Users/henshao/svn/dogg</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">11</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Repository UUID: 7ee338c4-a6e3-468b-b576-d1b767dd90e2</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">12</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Revision: 17</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">13</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Node Kind: file</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">14</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Schedule: normal</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">15</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Last Changed Author: henshao</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">16</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Last Changed Rev: 15</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">17</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Last Changed Date: 2011-06-23 17:03:08 +0800 (四, 23&nbsp; 6 2011)</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">18</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Text Last Updated: 2011-06-23 18:37:50 +0800 (四, 23&nbsp; 6 2011)</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">19</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Checksum: 5b211a202b8ae001a86a557108d4989c</code></td></tr></tbody></table></div></div></div><p style="word-break: break-all; margin: 10px 0px; color: #333333; font-family: Georgia, Arial, Helvetica, sans-serif, 微软雅黑; font-size: 12px; text-align: left; background-color: #ffffff; ">修改Makefile.am并签入看看。</p><div id="highlighter_10862"  plain"="" style="word-break: break-all; margin: 10px 0px; color: #333333; font-family: Georgia, Arial, Helvetica, sans-serif, 微软雅黑; font-size: 12px; text-align: left; background-color: #ffffff; "><div style="word-break: break-all; line-height: normal !important; margin: 10px 0px; "><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">01</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">[henshao@henshao ~/svn/learn_svn2/trunk]$ svn ci Makefile.am -m "LD_ADD add ssl library"</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">02</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Sending&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Makefile.am</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">03</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Transmitting file data .</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">04</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Committed revision 18.</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">05</code></td><td style="word-break: break-all; "><code style="word-break: break-all; ">&nbsp;</code>&nbsp;</td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">06</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">[henshao@henshao ~/svn/learn_svn2/trunk]$ svn info Makefile.am</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">07</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Path: Makefile.am</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">08</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Name: Makefile.am</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">09</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">URL: file:///Users/henshao/svn/dogg/learn_svn/trunk/Makefile.am</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">10</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Repository Root: file:///Users/henshao/svn/dogg</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">11</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Repository UUID: 7ee338c4-a6e3-468b-b576-d1b767dd90e2</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">12</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Revision: 18</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">13</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Node Kind: file</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">14</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Schedule: normal</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">15</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Last Changed Author: henshao</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">16</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Last Changed Rev: 18</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">17</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Last Changed Date: 2011-06-23 18:41:41 +0800 (四, 23&nbsp; 6 2011)</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">18</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Text Last Updated: 2011-06-23 18:41:31 +0800 (四, 23&nbsp; 6 2011)</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">19</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Checksum: e4cc7bf424ff911c9619060a5f1c1030</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">20</code></td><td style="word-break: break-all; "><code style="word-break: break-all; ">&nbsp;</code>&nbsp;</td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">21</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">[henshao@henshao ~/svn/learn_svn2/trunk]$ svn info configure.ac</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">22</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Path: configure.ac</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">23</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Name: configure.ac</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">24</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">URL: file:///Users/henshao/svn/dogg/learn_svn/trunk/configure.ac</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">25</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Repository Root: file:///Users/henshao/svn/dogg</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">26</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Repository UUID: 7ee338c4-a6e3-468b-b576-d1b767dd90e2</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">27</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Revision: 17</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">28</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Node Kind: file</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">29</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Schedule: normal</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">30</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Last Changed Author: henshao</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">31</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Last Changed Rev: 17</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">32</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Last Changed Date: 2011-06-23 17:44:51 +0800 (四, 23&nbsp; 6 2011)</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">33</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Text Last Updated: 2011-06-23 18:37:50 +0800 (四, 23&nbsp; 6 2011)</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">34</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Checksum: 6b49ae8f3346120311e11843c23b0b00</code></td></tr></tbody></table></div></div></div><p style="word-break: break-all; margin: 10px 0px; color: #333333; font-family: Georgia, Arial, Helvetica, sans-serif, 微软雅黑; font-size: 12px; text-align: left; background-color: #ffffff; ">svn update一下看看。</p><div id="highlighter_909821"  plain"="" style="word-break: break-all; margin: 10px 0px; color: #333333; font-family: Georgia, Arial, Helvetica, sans-serif, 微软雅黑; font-size: 12px; text-align: left; background-color: #ffffff; "><div style="word-break: break-all; line-height: normal !important; margin: 10px 0px; "><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">01</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">[henshao@henshao ~/svn/learn_svn2/trunk]$ svn up</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">02</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">At revision 18.</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">03</code></td><td style="word-break: break-all; "><code style="word-break: break-all; ">&nbsp;</code>&nbsp;</td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">04</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">[henshao@henshao ~/svn/learn_svn2/trunk]$ svn info configure.ac</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">05</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Path: configure.ac</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">06</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Name: configure.ac</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">07</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">URL: file:///Users/henshao/svn/dogg/learn_svn/trunk/configure.ac</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">08</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Repository Root: file:///Users/henshao/svn/dogg</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">09</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Repository UUID: 7ee338c4-a6e3-468b-b576-d1b767dd90e2</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">10</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Revision: 18</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">11</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Node Kind: file</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">12</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Schedule: normal</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">13</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Last Changed Author: henshao</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">14</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Last Changed Rev: 17</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">15</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Last Changed Date: 2011-06-23 17:44:51 +0800 (四, 23&nbsp; 6 2011)</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">16</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Text Last Updated: 2011-06-23 18:37:50 +0800 (四, 23&nbsp; 6 2011)</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">17</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">Checksum: 6b49ae8f3346120311e11843c23b0b00</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">18</code></td><td style="word-break: break-all; "><code style="word-break: break-all; ">&nbsp;</code>&nbsp;</td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">19</code></td><td style="word-break: break-all; "><code plain"="" style="word-break: break-all; ">[henshao@henshao ~/svn/learn_svn2/trunk]$ svn st -v</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">20</code></td><td style="word-break: break-all; "><code style="word-break: break-all; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="" style="word-break: break-all; ">18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18 henshao&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .</code></td></tr></tbody></table></div><div alt1"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">21</code></td><td style="word-break: break-all; "><code style="word-break: break-all; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="" style="word-break: break-all; ">18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17 henshao&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; configure.ac</code></td></tr></tbody></table></div><div alt2"="" style="word-break: break-all; margin: 10px 0px; "><table style="word-break: break-all; "><tbody style="word-break: break-all; "><tr style="word-break: break-all; "><td style="word-break: break-all; "><code style="word-break: break-all; ">22</code></td><td style="word-break: break-all; "><code style="word-break: break-all; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="" style="word-break: break-all; ">18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 18 henshao&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Makefile.am</code></td></tr></tbody></table></div></div></div><p style="word-break: break-all; margin: 10px 0px; color: #333333; font-family: Georgia, Arial, Helvetica, sans-serif, 微软雅黑; font-size: 12px; text-align: left; background-color: #ffffff; ">svn一个版本库的revision是全局的，不管是在trunk还是branch，也不管使用merge合并代码还是消除修改，签入和签出都会生成一个新的revision。当项目中一个文件签入时会导致别的文件的BASE暂时低于HEAD，但是一旦update，二者将保持一致。</p><img src ="http://www.blogjava.net/tinysun/aggbug/386100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tinysun/" target="_blank">何克勤</a> 2012-08-23 13:13 <a href="http://www.blogjava.net/tinysun/archive/2012/08/23/386100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux分布式编译distcc和ccache的部署 </title><link>http://www.blogjava.net/tinysun/archive/2012/02/24/370682.html</link><dc:creator>何克勤</dc:creator><author>何克勤</author><pubDate>Fri, 24 Feb 2012 06:49:00 GMT</pubDate><guid>http://www.blogjava.net/tinysun/archive/2012/02/24/370682.html</guid><wfw:comment>http://www.blogjava.net/tinysun/comments/370682.html</wfw:comment><comments>http://www.blogjava.net/tinysun/archive/2012/02/24/370682.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tinysun/comments/commentRss/370682.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tinysun/services/trackbacks/370682.html</trackback:ping><description><![CDATA[<div id="cnblogs_post_body">
<p>unset LANGUAGE<br />export LANG="en"<br />cd /home/kingsoft<br />mkdir distcc<br />cd distcc</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>rpm包用：rpm -ivh ...<br />bz2包用：tar -xvf ...<br />进入distcc解压后的目录<br />./configure &amp;&amp; make &amp;&amp; make install<br />mkdir /usr/lib/distcc<br />mkdir /usr/lib/distcc/bin<br />cd /usr/lib/distcc/bin<br />ln -s /usr/local/bin/distcc gcc<br />ln -s /usr/local/bin/distcc cc<br />ln -s /usr/local/bin/distcc g++<br />ln -s /usr/local/bin/distcc c++</p>
<p>&nbsp;</p>
<p><br />进入ccache解压目录<br />./configure &amp;&amp; make &amp;&amp; make install</p>
<p>mkdir /Data<br />mkdir /Data/Cache<br />mkdir /Data/Cache/CCache<br />cd /Data/Cache<br />touch /var/log/distccd.log</p>
<p>vim ~/.bash_profile<br />把 /usr/lib/distcc/bin 加到PATH<br />并添加下面内容<br />## ----- Distcc -----<br /># <br />DISTCC_HOSTS="localhost 192.168.1.1"<br />DISTCC_VERBOSE=1<br />DISTCC_LOG="/var/log/distcc.log"<br />export DISTCC_HOSTS PATH DISTCC_VERBOSE DISTCC_LOG<br />#<br />## ----- End -----</p>
<p>## ----- Ccache -----<br />#<br /># export CCACHE_DISABLE=1<br />CCACHE_DIR=/Data/Cache/CCache<br />CCACHE_LOGFILE=/Data/Cache/CCache.log<br />CCACHE_PREFIX="distcc"<br />CC="ccache gcc"<br />CXX="ccache g++"<br />export CCACHE_DIR CCACHE_LOGFILE CCACHE_PREFIX CC CXX<br />#<br />## ----- End -----</p>
<p><br />vim /etc/rc.local<br />distccd --daemon --allow 10.20.0.0/16</p>
<p><br />==========================================<br />启动监控：distccd --daemon --allow 10.20.0.0/16<br />查看监控：distccmon-text 1</p></div><script type="text/javascript">
if ($ != jQuery) {
	$ = jQuery.noConflict();
}
var isLogined = false;
var cb_blogId = 20515;
var cb_entryId = 1821490;
var cb_blogApp = "linn";
var cb_blogUserGuid = "665c360b-63cf-dd11-9e4d-001cf0cd104b";
var cb_entryCreatedDate = '2010/9/8 15:24:00';
</script><img src ="http://www.blogjava.net/tinysun/aggbug/370682.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tinysun/" target="_blank">何克勤</a> 2012-02-24 14:49 <a href="http://www.blogjava.net/tinysun/archive/2012/02/24/370682.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 网络编程之nagle算法和TCP_NODELAY </title><link>http://www.blogjava.net/tinysun/archive/2011/05/20/350659.html</link><dc:creator>何克勤</dc:creator><author>何克勤</author><pubDate>Fri, 20 May 2011 01:27:00 GMT</pubDate><guid>http://www.blogjava.net/tinysun/archive/2011/05/20/350659.html</guid><wfw:comment>http://www.blogjava.net/tinysun/comments/350659.html</wfw:comment><comments>http://www.blogjava.net/tinysun/archive/2011/05/20/350659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tinysun/comments/commentRss/350659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tinysun/services/trackbacks/350659.html</trackback:ping><description><![CDATA[<p>TCP/IP协议中，无论发送多少数据，总是要在数据前面加上协议头，同时，对方接收到数据，也需要发送ACK表示确认。为了尽可能的利用网络带宽，TCP总是希望尽可能的发送足够大的数据。（一个连接会设置MSS参数，因此，TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据）。<br />Nagle算法就是为了尽可能发送大块数据，避免网络中充斥着许多小数据块。</p>
<p>Nagle算法的基本定义是任意时刻，最多只能有一个未被确认的小段。 所谓&#8220;小段&#8221;，指的是小于MSS尺寸的数据块，所谓&#8220;未被确认&#8221;，是指一个数据块发送出去后，没有收到对方发送的ACK确认该数据已收到。</p>
<p>举个例子，比如之前的blog中的实验，一开始client端调用socket的write操作将一个int型数据(称为A块)写入到网络中，由于此时连接是空闲的（也就是说还没有未被确认的小段），因此这个int型数据会被马上发送到server端，接着，client端又调用write操作写入&#8216;\r\n&#8217;（简称B块），这个时候，A块的ACK没有返回，所以可以认为已经存在了一个未被确认的小段，所以B块没有立即被发送，一直等待A块的ACK收到（大概40ms之后），B块才被发送。整个过程如图所示：</p>
<p>&nbsp;</p>
<p>这里还隐藏了一个问题，就是A块数据的ACK为什么40ms之后才收到？这是因为TCP/IP中不仅仅有nagle算法，还有一个ACK延迟机制 。当Server端收到数据之后，它并不会马上向client端发送ACK，而是会将ACK的发送延迟一段时间（假设为t），它希望在t时间内server端会向client端发送应答数据，这样ACK就能够和应答数据一起发送，就像是应答数据捎带着ACK过去。在我之前的时间中，t大概就是40ms。这就解释了为什么'\r\n'(B块)总是在A块之后40ms才发出。</p>
<p>如果你觉着nagle算法太捣乱了，那么可以通过设置TCP_NODELAY将其禁用 。当然，更合理的方案还是应该使用一次大数据的写操作，而不是多次小数据的写操作。</p>
<p><br />本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/historyasamirror/archive/2011/05/15/6423235.aspx">http://blog.csdn.net/historyasamirror/archive/2011/05/15/6423235.aspx</a></p><img src ="http://www.blogjava.net/tinysun/aggbug/350659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tinysun/" target="_blank">何克勤</a> 2011-05-20 09:27 <a href="http://www.blogjava.net/tinysun/archive/2011/05/20/350659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 构建Linux 库文件 </title><link>http://www.blogjava.net/tinysun/archive/2011/01/20/343244.html</link><dc:creator>何克勤</dc:creator><author>何克勤</author><pubDate>Wed, 19 Jan 2011 16:21:00 GMT</pubDate><guid>http://www.blogjava.net/tinysun/archive/2011/01/20/343244.html</guid><wfw:comment>http://www.blogjava.net/tinysun/comments/343244.html</wfw:comment><comments>http://www.blogjava.net/tinysun/archive/2011/01/20/343244.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tinysun/comments/commentRss/343244.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tinysun/services/trackbacks/343244.html</trackback:ping><description><![CDATA[<p><font style="background-color: #cde9d1">1.库文件简介</font></p>
<p><font style="background-color: #cde9d1">库文件是一个包含了编译后代码、数据的文件，用于与程序其他代码连编，它可以使得程序模块化、编译速度更快，并且易于更新。库文件分为三种（实质为两种，在随后两句话有解释）：静态库（在程序之前就已经装载进其中了）、共享库（在程序启动之时加载进去，在程序直接共享）、动态加载库（dynamically loaded，DL）（在程序运行中任何时候都可以被加载进程序中使用，事实上DL并非是一个完全不同的库类型，共享库可以用作DL而被动态加载（静态库在Linux貌似无法用dlopen加载）。注意有些人使用dynamically linked libraries (DLLs)来指代共享库，有些人使用DLL这个词来形容任何可以被用作DL的库文件，这个请区分对待。</font></p>
<p><font style="background-color: #cde9d1">在具体使用中，我们应该多使用共享库，这使得用户可以独立于使用该库文件的程序而更新库。DL的确非常有用，但有时候我们可能并不需要那些灵活性，而对于静态库，由于更新起来实在费劲，我们一般不使用。</font></p>
<p><font style="background-color: #cde9d1">2.静态库的建立</font></p>
<p><font style="background-color: #cde9d1">静态库就是一堆普通的目标文件（object file），习惯上静态库以.a为后缀，这是使用ar命令生成的。静态库允许用户不用重新编译代码就可以链接程序，以节省重新编译的时间，其实这个时间已经在强大的机器配置和快速的编译器中显得微不足道了，这个常常用来提供程序而不是源代码。速度上，静态ELF（Executable and Linking Format）库文件比共享库或者动态加载库快1%-5%，但实际上常常因为其他因素而并不一定快。</font></p>
<p><font style="background-color: #cde9d1">我们写主文件prog.c：</font></p>
<p><font style="background-color: #cde9d1">&nbsp; 1: #include <br />
&nbsp; 2: void ctest1(int *);<br />
&nbsp; 3: void ctest2(int *);<br />
&nbsp; 4: <br />
&nbsp; 5: int main()<br />
&nbsp; 6: {<br />
&nbsp; 7:&nbsp;&nbsp;&nbsp; int x;<br />
&nbsp; 8:&nbsp;&nbsp;&nbsp; ctest1(&amp;x);<br />
&nbsp; 9:&nbsp;&nbsp;&nbsp; printf("Valx=%d\n",x);<br />
&nbsp;10: <br />
&nbsp;11:&nbsp;&nbsp;&nbsp; return 0;<br />
&nbsp;12: }<br />
&nbsp;13: 然后写这两个函数的实现：</font></p>
<p><font style="background-color: #cde9d1">ctest1.c</font></p>
<p><font style="background-color: #cde9d1">&nbsp; 1: void ctest1(int *i)<br />
&nbsp; 2: {<br />
&nbsp; 3:&nbsp;&nbsp;&nbsp; *i=5;<br />
&nbsp; 4: }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ctest2.c</font></p>
<p><font style="background-color: #cde9d1">&nbsp; 1: void ctest2(int *i)<br />
&nbsp; 2: {<br />
&nbsp; 3:&nbsp;&nbsp;&nbsp; *i=100;<br />
&nbsp; 4: }我们首先编译这两个函数实现的源文件：</font></p>
<p><font style="background-color: #cde9d1">gnuhpc@gnuhpc-desktop:~/MyCode/lib/statics$ gcc -Wall -c ctest1.c ctest2.c <br />
gnuhpc@gnuhpc-desktop:~/MyCode/lib/statics$ ls <br />
ctest1.c&nbsp; ctest1.o&nbsp; ctest2.c&nbsp; ctest2.o&nbsp; prog.c</font></p>
<p><font style="background-color: #cde9d1">然后创建静态库libctest.a：</font></p>
<p><font style="background-color: #cde9d1">gnuhpc@gnuhpc-desktop:~/MyCode/lib/statics$ ar -cvq libctest.a ctest1.o ctest2.o</font></p>
<p><font style="background-color: #cde9d1">a - ctest1.o <br />
a - ctest2.o</font></p>
<p><font style="background-color: #cde9d1">我们查看一下这个库中的文件：</font></p>
<p><font style="background-color: #cde9d1">gnuhpc@gnuhpc-desktop:~/MyCode/lib/statics$ ar -t libctest.a <br />
ctest1.o <br />
ctest2.o</font></p>
<p><font style="background-color: #cde9d1">此时我们可以编译我们的程序了，注意-l选项，后边的参数是去掉lib和.a的部分，并且需要放在要编译的文件名之后，否则会报错。：</font></p>
<p><font style="background-color: #cde9d1">gnuhpc@gnuhpc-desktop:~/MyCode/lib/statics$ gcc -o test prog.c -L./ &#8211;lctest <br />
gnuhpc@gnuhpc-desktop:~/MyCode/lib/statics$ ls <br />
ctest1.c&nbsp; ctest1.o&nbsp; ctest2.c&nbsp; ctest2.o&nbsp; libctest.a&nbsp; prog.c&nbsp; test <br />
gnuhpc@gnuhpc-desktop:~/MyCode/lib/statics$ ./test <br />
Valx=5</font></p>
<p><font style="background-color: #cde9d1">3.共享库的建立</font></p>
<p><font style="background-color: #cde9d1">共享库是在程序启动时加载的库文件。当共享库加载完毕后所有启动的起来的程序都将使用新的共享库。在创建共享库之前，还需要了解一些知识：</font></p>
<p><font style="background-color: #cde9d1">命名规则： <br />
每一个共享库都有一个soname，一般都形如libname.so.versionNumber，其中versionNumber每当接口发生改变时都要增加，一个完全的soname的前缀应该是它所在目录，在一个实际系统中，一个完整的soname只是共享库文件的real name的符号链接。程序运行时在内部列出所需的共享库时使用的就是soname。 <br />
每一个共享库也有一个real name，这是包含实际代码的文件名，real name使用soname为前缀，并且在后边添加一些信息，一般都形如soname.MinorNumber.ReleaseNumber。 最后的releaseNumber可有可无。这个是生成共享库时实际文件的名称。 <br />
同时，在编译器要求使用一个共享库时使用的名字称为linker name，一般都是去掉版本号的soname，用于gcc中-lname这样的选项的编译。 <br />
这几个名字的关系：你在创建实际库文件中指定libreadline.so.3.0为real name ，并且使用符号链接创建soname -&gt;libreadline.so.3和linker name-&gt; /usr/lib/libreadline.so。 <br />
放置位置： <br />
GNU标准推荐将所有默认的库安装在/usr/local/lib，这指的是开发者源代码默认的位置。 <br />
FHS指出大多数的库文件应该放在/usr/lib，而启动所需的库则应该放在/lib中，而非系统库应该放在/usr/local/lib。这指的是发行版默认的位置，这两个标准并没有矛盾。 <br />
共享库的主要有三个步骤：</font></p>
<p><font style="background-color: #cde9d1">创建目标代码。 <br />
创建库。 <br />
使用符号链接创建默认版本的共享库（可选）。 <br />
现在我们举个例子来说明，首先我们编译源代码，使用-fPIC选项生成共享库所需的位置独立代码（position-independent code (PIC)）：</font></p>
<p><font style="background-color: #cde9d1">gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ gcc -Wall -fPIC -c *.c <br />
gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ ls <br />
ctest1.c&nbsp; ctest1.o&nbsp; ctest2.c&nbsp; ctest2.o&nbsp; prog.c&nbsp; prog.o</font></p>
<p><font style="background-color: #cde9d1">然后我们创建库文件：</font></p>
<p><font style="background-color: #cde9d1">gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ gcc -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0&nbsp;&nbsp; *.o <br />
gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ ls <br />
ctest1.c&nbsp; ctest1.o&nbsp; ctest2.c&nbsp; ctest2.o&nbsp; libctest.so.1.0&nbsp; prog.c&nbsp; prog.o</font></p>
<p><font style="background-color: #cde9d1">-shared选项指明生成共享目标文件，-W1（注意是小写L而不是一）指明传入链接器的参数，在此我们设定了该库的soname为libctest.so.1，-o则指明了生成的目标库文件为libctest.so.1.0（这个就是real name）。</font></p>
<p><font style="background-color: #cde9d1">最后创建所需的符号链接：</font></p>
<p><font style="background-color: #cde9d1">gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ sudo mv libctest.so.1.0 /usr/local/lib/libctest.so.1.0 <br />
gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ sudo ln -sf /usr/local/lib/libctest.so.1.0 /usr/local/lib/libctest.so.1 <br />
gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ sudo ln -sf /usr/local/lib/libctest.so.1.0 /usr/local/lib/libctest.so</font></p>
<p><font style="background-color: #cde9d1">创建的libctest.so就是上面所谓linker name，用于编译时-lctest选项。</font></p>
<p><font style="background-color: #cde9d1">创建的libctest.so.1就是soname，我们在上边说过程序在运行时需要这个名字的符号链接。</font></p>
<p><font style="background-color: #cde9d1">此时我们的共享库就建好了，接着我们编译程序：</font></p>
<p><font style="background-color: #cde9d1">gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ gcc -Wall -L/usr/local/lib prog.c -lctest -o prog <br />
gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ ls <br />
ctest1.c&nbsp; ctest1.o&nbsp; ctest2.c&nbsp; ctest2.o&nbsp; prog&nbsp; prog.c&nbsp; prog.o</font></p>
<p><font style="background-color: #cde9d1">我们编译完毕，该库并不会包含在可执行文件中，只有在执行时来会动态加载进来。我们可以通过ldd列出一个可执行程序所有的依赖，在我的系统中还找不到/usr/local/bin的路径：</font></p>
<p><font style="background-color: #cde9d1">gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ ldd prog <br />
&nbsp;&nbsp;&nbsp; linux-gate.so.1 =&gt;&nbsp; (0x00a5c000) <br />
&nbsp;&nbsp;&nbsp; libctest.so.1 =&gt; not found <br />
&nbsp;&nbsp;&nbsp; libc.so.6 =&gt; /lib/tls/i686/cmov/libc.so.6 (0x00a6f000) <br />
&nbsp;&nbsp;&nbsp; /lib/ld-linux.so.2 (0x00451000)</font></p>
<p><font style="background-color: #cde9d1">此时，运行会报找不到库的错误：</font></p>
<p><font style="background-color: #cde9d1">gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ ./prog <br />
./prog: error while loading shared libraries: libctest.so.1: cannot open shared object file: No such file or directory</font></p>
<p><font style="background-color: #cde9d1">我们可以将所需库的路径加入到系统路径中，有三种方法可以完成：</font></p>
<p><font style="background-color: #cde9d1">A.在/etc/ld.so.conf中加入所在路径，然后执行ldconfig配置链接器运行时绑定配置。你也可以创建一个文件，将路径写入，然后使用ldconfig &#8211;f filename将配置写入。 <br />
B.修改LD_LIBRARY_PATH环境变量（Linux下，AIX下为LIBPATH），在其中添加路径。若你直接在.bashrc文件中配置则重启后不失效，否则在shell中设置重启后失效。 <br />
我们使用A方法中的-f选项：</font></p>
<p><font style="background-color: #cde9d1">gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ vi libctest.conf <br />
gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ sudo ldconfig -f libctest.conf <br />
gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ ./prog <br />
Valx=5 <br />
gnuhpc@gnuhpc-desktop:~/MyCode/lib/shared$ ldd prog <br />
&nbsp;&nbsp;&nbsp; linux-gate.so.1 =&gt;&nbsp; (0x00f6f000) <br />
&nbsp;&nbsp;&nbsp; libctest.so.1 =&gt; /usr/local/lib/libctest.so.1 (0x005d9000) <br />
&nbsp;&nbsp;&nbsp; libc.so.6 =&gt; /lib/tls/i686/cmov/libc.so.6 (0x00718000) <br />
&nbsp;&nbsp;&nbsp; /lib/ld-linux.so.2 (0x001e6000)</font></p>
<p><font style="background-color: #cde9d1">其中libctest.conf中写入路径：/usr/local/lib。程序运行正常。</font></p>
<p><font style="background-color: #cde9d1">4.动态加载库的使用</font></p>
<p><font style="background-color: #cde9d1">动态加载库是在非程序启动时动态加载进入程序的库，这对于实现插件或动态模块有很大的帮助。在Linux中，动态加载库的形式并不特殊，它使用上述两种程序库，使用提供的API在程序运行时动态加载。注意，在不同平台上动态加载库的API并不相同，所以可能会有移植问题出现。</font></p>
<p><font style="background-color: #cde9d1">我们可以通过nm命令先查看一下我们创建的库里面有哪些symbol（可以理解为函数方法）供我们使用：</font></p>
<p><font style="background-color: #cde9d1">gnuhpc@gnuhpc-desktop:~/MyCode/lib$ nm /usr/local/lib/libctest.so <br />
00001f18 a _DYNAMIC <br />
00001ff4 a _GLOBAL_OFFSET_TABLE_ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w _Jv_RegisterClasses <br />
00001f08 d __CTOR_END__ <br />
00001f04 d __CTOR_LIST__ <br />
00001f10 d __DTOR_END__ <br />
00001f0c d __DTOR_LIST__ <br />
000005a0 r __FRAME_END__ <br />
00001f14 d __JCR_END__ <br />
00001f14 d __JCR_LIST__ <br />
00002014 A __bss_start <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w __cxa_finalize@@GLIBC_2.1.3 <br />
00000540 t __do_global_ctors_aux <br />
00000420 t __do_global_dtors_aux <br />
00002010 d __dso_handle <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w __gmon_start__ <br />
000004d7 t __i686.get_pc_thunk.bx <br />
00002014 A _edata <br />
0000201c A _end <br />
00000578 T _fini <br />
000003a0 T _init <br />
00002014 b completed.7021 <br />
000004dc T ctest1 <br />
000004ec T ctest2 <br />
00002018 b dtor_idx.7023 <br />
000004a0 t frame_dummy <br />
000004fc T main <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; U printf@@GLIBC_2.0</font></p>
<p><font style="background-color: #cde9d1">这个命令对静态库和共享库都支持，第二列为symbol类型，小写字母表示符号是本地的，大写字母表示符号是全局（外部）的，几个常见的字母含义如下：T为代码段普通定义，D为已初始化数据段，B为未初始化数据段，U为未定义（用到该符号但是没有在该库中定义）。</font></p>
<p><font style="background-color: #cde9d1">我们创建ctest.h：</font></p>
<p><font style="background-color: #cde9d1">&nbsp; 1: #ifndef CTEST_H<br />
&nbsp; 2: #define CTEST_H<br />
&nbsp; 3: <br />
&nbsp; 4: #ifdef __cplusplus<br />
&nbsp; 5: extern "C" {<br />
&nbsp; 6: #endif<br />
&nbsp; 7: <br />
&nbsp; 8: void ctest1(int *);<br />
&nbsp; 9: void ctest2(int *);<br />
&nbsp;10: <br />
&nbsp;11: #ifdef __cplusplus<br />
&nbsp;12: }<br />
&nbsp;13: #endif<br />
&nbsp;14: <br />
&nbsp;15: #endif这里使用extern C是为了使得该库既可以用于C语言又可以用于C++。</font></p>
<p><font style="background-color: #cde9d1">我们动态加载库进来：progdl.c</font></p>
<p><font style="background-color: #cde9d1">&nbsp; 1: #include <br />
&nbsp; 2: #include <br />
&nbsp; 3: #include "ctest.h"<br />
&nbsp; 4: <br />
&nbsp; 5: int main(int argc, char **argv) <br />
&nbsp; 6: {<br />
&nbsp; 7:&nbsp;&nbsp;&nbsp; void *lib_handle;<br />
&nbsp; 8:&nbsp;&nbsp;&nbsp; double (*fn)(int *);<br />
&nbsp; 9:&nbsp;&nbsp;&nbsp; int x;<br />
&nbsp;10:&nbsp;&nbsp;&nbsp; char *error;<br />
&nbsp;11: <br />
&nbsp;12:&nbsp;&nbsp;&nbsp; lib_handle = dlopen("/usr/local/lib/libctest.so", RTLD_LAZY);<br />
&nbsp;13:&nbsp;&nbsp;&nbsp; if (!lib_handle) <br />
&nbsp;14:&nbsp;&nbsp;&nbsp; {<br />
&nbsp;15:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr, "%s\n", dlerror());<br />
&nbsp;16:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<br />
&nbsp;17:&nbsp;&nbsp;&nbsp; }<br />
&nbsp;18: <br />
&nbsp;19:&nbsp;&nbsp;&nbsp; fn = dlsym(lib_handle, "ctest1");<br />
&nbsp;20:&nbsp;&nbsp;&nbsp; if ((error = dlerror()) != NULL)&nbsp; <br />
&nbsp;21:&nbsp;&nbsp;&nbsp; {<br />
&nbsp;22:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr, "%s\n", error);<br />
&nbsp;23:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<br />
&nbsp;24:&nbsp;&nbsp;&nbsp; }<br />
&nbsp;25: <br />
&nbsp;26:&nbsp;&nbsp;&nbsp; (*fn)(&amp;x);<br />
&nbsp;27:&nbsp;&nbsp;&nbsp; printf("Valx=%d\n",x);<br />
&nbsp;28: <br />
&nbsp;29:&nbsp;&nbsp;&nbsp; dlclose(lib_handle);<br />
&nbsp;30:&nbsp;&nbsp;&nbsp; return 0;<br />
&nbsp;31: }里面的方法解释如下：</font></p>
<p><font style="background-color: #cde9d1">void * dlopen(const char *filename, int flag);&nbsp; <br />
若filename为绝对路径，那么dlopen就会试图打开它而不搜索相关路径，否则就现在环境变量LD_LIBRARY_PATH处搜索，然后在/etc/ld.so.cache以及/lib和/usr/lib搜索。flag我们只解释两个常用的选项：若为RTLD_LAZY则表示在动态库执行时解决未定义符号问题，而RTLD_NOW则表示在dlopen返回前解决未定义符号问题。当你调试时你应该用RTLD_NOW，这个时候若存在未解决的引用程序还可以继续进行。另外，RTLD_NOW选项可能会使打开库的这个操作稍微慢一点，但是以后寻找函数时就会快一点。注意，若程序库相互依赖则应该按依赖顺序依次载入，比如X依赖Y，那么要先载入Y然后再载入X。返回的是一个句柄，若失败则返回null. </font></p>
<p><font style="background-color: #cde9d1">char *dlerror(void); <br />
报告任何上一次对加载库操作的错误。两次调用期间若有操作错误则第二次会报告， 否则第二次则返回null——它报告完错误就等待下一个错误的发生，上一次错误的情况一旦报告就不再提及。 </font></p>
<p><font style="background-color: #cde9d1">void *dlsym(void *handle, const char *symbol); <br />
寻找对应symbol的函数方法，handle就是dlopen返回的句柄。一般如下使用： <br />
&nbsp; 1:&nbsp; dlerror(); /* clear error code */<br />
&nbsp; 2:&nbsp; s = (actual_type) dlsym(handle, symbol_being_searched_for);<br />
&nbsp; 3:&nbsp; if ((err = dlerror()) != NULL) {<br />
&nbsp; 4:&nbsp;&nbsp; /* handle error, the symbol wasn't found */<br />
&nbsp; 5:&nbsp; } else {<br />
&nbsp; 6:&nbsp;&nbsp; /* symbol found, its value is in s */<br />
&nbsp; 7:&nbsp; }int dlclose(void *handle); <br />
关闭一个动态加载库。当一个动态库被加载多次时，你需要用同样次数dlclose该动态库才可以deallocated. </font></p>
<p><font style="background-color: #cde9d1">我们编译该代码gcc -g -rdynamic -o progdl progdl.c -ldl，即可得到可执行文件（其中-g选项是为了gdb调试所用），其中的库为动态加载后又关闭的。我们使用gdb看一下代码：</font></p>
<p><font style="background-color: #cde9d1">(gdb) b main <br />
Breakpoint 1 at 0x804878d: file progdl.c, line 12. <br />
(gdb) r <br />
Starting program: /home/gnuhpc/MyCode/lib/dynamic/progdl </font></p>
<p><font style="background-color: #cde9d1">Breakpoint 1, main (argc=1, argv=0xbffff4a4) at progdl.c:12 <br />
12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lib_handle = dlopen("/usr/local/lib/libctest.so", RTLD_LAZY); <br />
(gdb) f <br />
#0&nbsp; main (argc=1, argv=0xbffff4a4) at progdl.c:12 <br />
12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lib_handle = dlopen("/usr/local/lib/libctest.so", RTLD_LAZY); <br />
(gdb) s <br />
13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!lib_handle) <br />
(gdb) n <br />
19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fn = dlsym(lib_handle, "ctest1"); <br />
(gdb) <br />
20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((error = dlerror()) != NULL)&nbsp; <br />
(gdb) <br />
26&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (*fn)(&amp;x); <br />
(gdb) <br />
27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Valx=%d\n",x); <br />
(gdb) p x <br />
$1 = 5 <br />
(gdb) p fn <br />
$2 = (double (*)(int *)) 0x28c4dc </font></p>
<p><font style="background-color: #cde9d1">可以看到fn获得了ctest1的地址。</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">参考文献：</font></p>
<p><font style="background-color: #cde9d1">http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html</font></p>
<p><font style="background-color: #cde9d1">http://www.linuxjournal.com/article/3687</font></p>
<p><font style="background-color: #cde9d1">http://www.dwheeler.com/program-library/Program-Library-HOWTO/</font></p>
<p><font style="background-color: #cde9d1"></font>&nbsp;</p>
<p><font style="background-color: #cde9d1">本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/gnuhpc/archive/2010/12/20/6086143.aspx</font></p>
<img src ="http://www.blogjava.net/tinysun/aggbug/343244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tinysun/" target="_blank">何克勤</a> 2011-01-20 00:21 <a href="http://www.blogjava.net/tinysun/archive/2011/01/20/343244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解可执行程序的各种神器 </title><link>http://www.blogjava.net/tinysun/archive/2011/01/19/343184.html</link><dc:creator>何克勤</dc:creator><author>何克勤</author><pubDate>Tue, 18 Jan 2011 16:05:00 GMT</pubDate><guid>http://www.blogjava.net/tinysun/archive/2011/01/19/343184.html</guid><wfw:comment>http://www.blogjava.net/tinysun/comments/343184.html</wfw:comment><comments>http://www.blogjava.net/tinysun/archive/2011/01/19/343184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tinysun/comments/commentRss/343184.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tinysun/services/trackbacks/343184.html</trackback:ping><description><![CDATA[<div id="detail" style="line-height: 1.3">
<p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 宋体">ldd</span></strong><span style="color: black; font-family: 宋体">查看应用程序链接了哪些动态库。 </span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 宋体">nm</span></strong><span style="color: black; font-family: 宋体">列出目标文件中包含的符号信息。</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 宋体">size</span></strong><span style="color: black; font-family: 宋体">列出各个段的大小及总的大小。</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 宋体">strings</span></strong><span style="color: black; font-family: 宋体">列出文件中的字符串。</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 宋体">readelf</span></strong><span style="color: black; font-family: 宋体">读取elf文件的完整结构。</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 宋体">objdump</span></strong><span style="color: black; font-family: 宋体">导出目标文件的相关信息（elf文件相关工具的源头）。</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 宋体">gdb</span></strong><span style="color: black; font-family: 宋体">对文件的执行过程进行调试分析，设置断点(b)、单步执行(n)、函数调用追踪(bt)、反汇编(disassemble)。</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 宋体">strace</span></strong><span style="color: black; font-family: 宋体">跟踪程序中的系统调用及信号处理信息。</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 宋体">LD_DEBUG</span></strong><span style="color: black; font-family: 宋体">通过设置这个环境变量，可以方便的看到 loader 的加载过程（包括库的加载，符号解析等过程），使用【LD_DEBUG=help 可执行文件路径】可查看使用帮助。</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 宋体">LD_PRELOAD</span></strong><span style="color: black; font-family: 宋体">环境变量指定的共享库会被预先加载，如果出现重名的函数，预先加载的函数将会被调用，如在预先加载的库中包含自定义的puts函数，则在执行程序时将使用自定义版本的puts函数，而不是libc库中的puts函数。</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 宋体">proc</span></strong><strong><span style="color: black; font-family: 宋体">文件系统</span></strong><span style="color: black; font-family: 宋体">中包含进程的地址空间映射关系，具体查看/proc/进程id/maps文件的内容。</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 宋体">valgrind</span></strong><span style="color: black; font-family: 宋体">工具对可执行程序文件进行内存检查（还有cache模拟、调用过程跟踪等功能），以避免内存泄露等问题。</span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="color: black; font-family: 宋体">addrline</span></strong><span style="color: black; font-family: 宋体">将可执行文件中的地址转换为其在源文件中对应的位置（文件名：行号）。</span></p>
</div>
<img src ="http://www.blogjava.net/tinysun/aggbug/343184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tinysun/" target="_blank">何克勤</a> 2011-01-19 00:05 <a href="http://www.blogjava.net/tinysun/archive/2011/01/19/343184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Vim配置</title><link>http://www.blogjava.net/tinysun/archive/2011/01/08/342585.html</link><dc:creator>何克勤</dc:creator><author>何克勤</author><pubDate>Sat, 08 Jan 2011 09:45:00 GMT</pubDate><guid>http://www.blogjava.net/tinysun/archive/2011/01/08/342585.html</guid><wfw:comment>http://www.blogjava.net/tinysun/comments/342585.html</wfw:comment><comments>http://www.blogjava.net/tinysun/archive/2011/01/08/342585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tinysun/comments/commentRss/342585.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tinysun/services/trackbacks/342585.html</trackback:ping><description><![CDATA[vimrc文件:
<p><a id="more"></a></p>
<p>&nbsp;</p>
<div class="hl_result">
<div class="text" style="border-right: rgb(191,208,217) 1px solid; padding-right: 0px; border-top: rgb(191,208,217) 1px solid; padding-left: 0px; background: rgb(221,238,255); padding-bottom: 0px; margin: 8px; border-left: rgb(191,208,217) 1px solid; color: rgb(0,0,0); padding-top: 0px; border-bottom: rgb(191,208,217) 1px solid; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""<br />
" 一般设定<br />
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""<br />
" 设定默认解码<br />
set fenc=utf-8<br />
set fencs=utf-8,usc-bom,euc-jp,gb18030,gbk,gb2312,cp936<br />
<br />
" 设置不与之前版本兼容 <br />
set nocompatible<br />
<br />
" 查找结果高亮度显示<br />
set hlsearch<br />
<br />
" 配色<br />
colorscheme desert<br />
<br />
" 显示行号<br />
set nu<br />
<br />
" 检测文件的类型<br />
filetype on<br />
<br />
" 设置当文件被改动时自动载入<br />
set autoread<br />
<br />
" 记录历史的行数<br />
set history=80<br />
<br />
" 设置语法高亮度<br />
syntax on<br />
<br />
" 在处理未保存或只读文件的时候，弹出确认<br />
set confirm<br />
<br />
" 与windows共享剪贴板<br />
set clipboard+=unnamed<br />
<br />
" 载入文件类型插件<br />
filetype plugin on<br />
<br />
" 为特定文件类型载入相关缩进文件<br />
filetype indent on<br />
<br />
" 保存全局变量<br />
set viminfo+=!<br />
<br />
" 带有如下符号的单词不要被换行分割<br />
set iskeyword+=_,$,@,%,#,-<br />
<br />
" 设置鼠标一直可用<br />
set mouse=a<br />
<br />
" 高亮当前行<br />
set cursorline<br />
<br />
" 命令行高度<br />
set cmdheight=1<br />
<br />
" 启动的时候不显示那个援助索马里儿童的提示<br />
set shortmess=atI<br />
<br />
" 设置帮助语言<br />
if version &gt;= 603<br />
&nbsp; set helplang=cn<br />
&nbsp; set encoding=utf-8<br />
endif<br />
<br />
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""<br />
" 文件设置<br />
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""<br />
" 不要备份文件（根据自己需要取舍）<br />
set nobackup<br />
<br />
" 不要生成swap文件，当buffer被丢弃的时候隐藏它<br />
setlocal noswapfile<br />
set bufhidden=hide<br />
<br />
" 字符间插入的像素行数目<br />
set linespace=0<br />
<br />
" 增强模式中的命令行自动完成操作<br />
set wildmenu<br />
<br />
" 在状态行上显示光标所在位置的行号和列号<br />
set ruler<br />
<br />
" 不让vim发出讨厌的滴滴声<br />
set noerrorbells<br />
<br />
" 在被分割的窗口间显示空白，便于阅读<br />
set fillchars=vert:\ ,stl:\ ,stlnc:\<br />
<br />
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""<br />
" 搜索和匹配<br />
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""<br />
" 高亮显示匹配的括号<br />
set showmatch<br />
<br />
" 不要高亮被搜索的句子（phrases）<br />
"set nohlsearch<br />
<br />
" 在搜索时，输入的词句的逐字符高亮（类似firefox的搜索）<br />
set incsearch<br />
<br />
" 搜索时忽略大小写<br />
set ignorecase<br />
<br />
" 不要闪烁<br />
set novisualbell<br />
<br />
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""<br />
" 文本格式和排版<br />
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""<br />
" 自动格式化<br />
set formatoptions=tcrqn<br />
<br />
" 继承前一行的缩进方式，特别适用于多行注释<br />
set autoindent<br />
<br />
" 为C程序提供自动缩进<br />
set smartindent<br />
<br />
" 使用C样式的缩进<br />
set cindent<br />
<br />
" 制表符为4<br />
set tabstop=4<br />
<br />
" 统一缩进为4<br />
set softtabstop=4<br />
set shiftwidth=4<br />
<br />
" 不要用空格代替制表符<br />
set noexpandtab<br />
<br />
" 设置每行80个字符自动换行<br />
set textwidth=80<br />
<br />
" -------------------------------------------------------------------------------------------------<br />
" set mapleader<br />
let mapleader = ","<br />
<br />
" platform<br />
function! MySys()<br />
&nbsp; &nbsp; &nbsp; &nbsp; if has("win32")<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return "windows"<br />
&nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return "linux"<br />
&nbsp; &nbsp; &nbsp; &nbsp; endif<br />
endfunction<br />
<br />
" if file not opened, create a new tab, or switch to the opened file<br />
function! SwitchToBuf(filename)<br />
&nbsp; &nbsp; &nbsp; &nbsp; " find in current tab<br />
&nbsp; &nbsp; &nbsp; &nbsp; let bufwinnr = bufwinnr(a:filename)<br />
&nbsp; &nbsp; &nbsp; &nbsp; if bufwinnr != -1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exec bufwinnr . "wincmd w"<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return <br />
&nbsp; &nbsp; &nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; " search each tab<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tabfirst<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let tb = 1<br />
&nbsp; &nbsp; &nbsp; &nbsp; while tb &lt;= tabpagenr("$")<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let bufwinnr = bufwinnr(a:filename)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if bufwinnr != -1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exec "normal " . tb . "gt"<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exec bufwinnr . "wincmd w"<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; endif<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tabnext<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let tb = tb +1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; endwhile<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; " not exist, new tab<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exec "tabnew " . a:filename<br />
&nbsp; &nbsp; &nbsp; &nbsp; endif<br />
endfunction<br />
<br />
" fast edit .vimrc<br />
if MySys() == 'linux'<br />
&nbsp; &nbsp; &nbsp; &nbsp; " fast reloading of the .vimrc<br />
&nbsp; &nbsp; &nbsp; &nbsp; map &lt;silent&gt; &lt;leader&gt;ss :source ~/.vimrc&lt;cr&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; " fast editing of the .vimrc<br />
&nbsp; &nbsp; &nbsp; &nbsp; map &lt;silent&gt; &lt;leader&gt;ee :call SwitchToBuf("~/.vimrc")&lt;cr&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; " when .vimrc is edited, reload it<br />
&nbsp; &nbsp; &nbsp; &nbsp; autocmd! bufwritepost .vimrc source ~/.vimrc<br />
elseif MySys() == 'windows'<br />
&nbsp; &nbsp; &nbsp; &nbsp; " Set helplang<br />
&nbsp; &nbsp; set helplang=cn<br />
&nbsp; &nbsp; "Fast reloading of the _vimrc<br />
&nbsp; &nbsp; map &lt;silent&gt; &lt;leader&gt;ss :source ~/_vimrc&lt;cr&gt;<br />
&nbsp; &nbsp; "Fast editing of _vimrc<br />
&nbsp; &nbsp; map &lt;silent&gt; &lt;leader&gt;ee :call SwitchToBuf("~/_vimrc")&lt;cr&gt;<br />
&nbsp; &nbsp; "When _vimrc is edited, reload it<br />
&nbsp; &nbsp; autocmd! bufwritepost _vimrc source ~/_vimrc<br />
endif<br />
if MySys() == 'windows'<br />
&nbsp; &nbsp; source $VIMRUNTIME/mswin.vim<br />
&nbsp; &nbsp; behave mswin<br />
endif<br />
<br />
" quickfix模式<br />
autocmd FileType c,cpp&nbsp; map &lt;buffer&gt; &lt;leader&gt;&lt;space&gt; :w&lt;cr&gt;:make&lt;cr&gt;<br />
nmap &lt;leader&gt;cn :cn&lt;cr&gt;<br />
nmap &lt;leader&gt;cp :cp&lt;cr&gt;<br />
nmap &lt;leader&gt;cw :cw 10&lt;cr&gt;<br />
<br />
" vimgrep/lvimgrep(lv)<br />
" 在当前文件中快速查找光标下的单词, 并在窗口的位置列表中显示<br />
" 好像该功能有mark插件可以代劳:)<br />
nmap &lt;leader&gt;lv :lv /&lt;c-r&gt;=expand("&lt;cword&gt;")&lt;cr&gt;/ %&lt;cr&gt;:lw&lt;cr&gt;<br />
<br />
" omni completion(全能补全)<br />
" 为支持C++的全能补全，需安装插件: OmniCppComplete<br />
" 并且生成tag文件的命令是(src为源文件目录): ctags -R --c++-kinds=+p --fields=+iaS --extra=+q src<br />
" 因为在对C++文件进行补全时，OmniCppComplete插件需要tag文件中包含C++的额外信息<br />
" C++的补全连&#8221;CTRL-X CTRL-O&#8220;都不必输入呵呵，测试通过<br />
set completeopt=longest,menu " 只在下拉菜单中显示匹配项目，并且会自动插入所有匹配项目的相同文本<br />
inoremap &lt;C-J&gt;&nbsp; &lt;C-X&gt;&lt;C-O&gt;<br />
<br />
" generic completion(其他补全方式)<br />
" 文件名补全<br />
inoremap &lt;C-F&gt;&nbsp; &lt;C-X&gt;&lt;C-F&gt;<br />
" 宏定义补全<br />
inoremap &lt;C-D&gt;&nbsp; &lt;C-X&gt;&lt;C-D&gt;<br />
" 整行补全<br />
inoremap &lt;C-L&gt;&nbsp; &lt;C-X&gt;&lt;C-L&gt;<br />
<br />
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""<br />
" Plugin<br />
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""<br />
" CTags<br />
set tags=tags " 当前目录, 不知道为什么写成./tags就无效<br />
set tags+=../tags<br />
" 为/usr/include目录生成tags文件，缺点可能会导致自动完成的速度减慢，必要时去除<br />
" 更好的办法是需要时才加，例如/usr/include/gtk2.0/tags<br />
" set tags+=/usr/include/tags&nbsp; <br />
<br />
" Cscope<br />
if has("cscope")<br />
&nbsp; set csprg=/usr/bin/cscope<br />
&nbsp; set csto=1<br />
&nbsp; set cst<br />
&nbsp; set nocsverb<br />
&nbsp; " add any database in current directory<br />
&nbsp; if filereadable("cscope.out")<br />
&nbsp; &nbsp; &nbsp; cs add cscope.out<br />
&nbsp; endif<br />
&nbsp; set csverb<br />
endif<br />
<br />
nmap &lt;C-@&gt;s :cs find s &lt;C-R&gt;=expand("&lt;cword&gt;")&lt;CR&gt;&lt;CR&gt;<br />
nmap &lt;C-@&gt;g :cs find g &lt;C-R&gt;=expand("&lt;cword&gt;")&lt;CR&gt;&lt;CR&gt;<br />
nmap &lt;C-@&gt;c :cs find c &lt;C-R&gt;=expand("&lt;cword&gt;")&lt;CR&gt;&lt;CR&gt;<br />
nmap &lt;C-@&gt;t :cs find t &lt;C-R&gt;=expand("&lt;cword&gt;")&lt;CR&gt;&lt;CR&gt;<br />
nmap &lt;C-@&gt;e :cs find e &lt;C-R&gt;=expand("&lt;cword&gt;")&lt;CR&gt;&lt;CR&gt;<br />
nmap &lt;C-@&gt;f :cs find f &lt;C-R&gt;=expand("&lt;cfile&gt;")&lt;CR&gt;&lt;CR&gt;<br />
nmap &lt;C-@&gt;i :cs find i ^&lt;C-R&gt;=expand("&lt;cfile&gt;")&lt;CR&gt;$&lt;CR&gt;<br />
nmap &lt;C-@&gt;d :cs find d &lt;C-R&gt;=expand("&lt;cword&gt;")&lt;CR&gt;&lt;CR&gt;<br />
<br />
" Tag List<br />
" 按照名称排序<br />
let Tlist_Sort_Type = "name"<br />
" 在右侧显示窗口<br />
let Tlist_Use_Right_Window = 1<br />
" 如果只有一个buffer，kill窗口也kill掉buffer<br />
let Tlist_Exist_OnlyWindow = 1<br />
" 使taglist只显示当前文件tag，其它文件的tag都被折叠起来(同时显示多个文件中的tag时)<br />
let Tlist_File_Fold_Auto_Close = 1<br />
" 不要显示折叠树<br />
let Tlist_Enable_Fold_Column = 1<br />
"不同时显示多个文件的tag，只显示当前文件的<br />
let Tlist_Show_One_File = 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
" 键盘映射<br />
nmap tl :TlistToggle&lt;cr&gt;<br />
<br />
" Buf Explorer<br />
let g:bufExplorerDefaultHelp=0&nbsp; &nbsp; &nbsp; &nbsp;" Do not show default help.<br />
let g:bufExplorerShowRelativePath=1&nbsp; " Show relative paths.<br />
let g:bufExplorerSortBy='mru'&nbsp; &nbsp; &nbsp; &nbsp; " Sort by most recently used.<br />
let g:bufExplorerSplitRight=0&nbsp; &nbsp; &nbsp; &nbsp; " Split left.<br />
let g:bufExplorerSplitVertical=1&nbsp; &nbsp; &nbsp;" Split vertically.<br />
let g:bufExplorerSplitVertSize = 30&nbsp; " Split width<br />
let g:bufExplorerUseCurrentWindow=1&nbsp; " Open in new window.<br />
autocmd BufWinEnter \[Buf\ List\] setl nonumber<br />
<br />
" Win Manager<br />
let g:winManagerWindowLayout = "BufExplorer,FileExplorer|TagList"<br />
let g:persistentBehaviour = 0<br />
let g:winManagerWidth = 30<br />
let g:defaultExplorer = 0<br />
nmap &lt;C-W&gt;&lt;C-F&gt; :FirstExplorerWindow&lt;cr&gt;<br />
nmap &lt;C-W&gt;&lt;C-B&gt; :BottomExplorerWindow&lt;cr&gt;<br />
nmap wm :WMToggle&lt;cr&gt;<br />
<br />
" Lookupfile<br />
let g:LookupFile_MinPatLength = 2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"最少输入2个字符才开始查找<br />
let g:LookupFile_PreserveLastPattern = 0&nbsp; &nbsp; &nbsp; &nbsp; "不保存上次查找的字符串<br />
let g:LookupFile_PreservePatternHistory = 1&nbsp; &nbsp; &nbsp;"保存查找历史<br />
let g:LookupFile_AlwaysAcceptFirst = 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "回车打开第一个匹配项目<br />
let g:LookupFile_AllowNewFiles = 0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "不允许创建不存在的文件<br />
" 通过shell脚本: lookupfile_tag.sh生成当前目录的filenametags文件<br />
" 该脚本在~/.vim目录下有备份<br />
if filereadable("./filenametags")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "设置tag文件的名字<br />
let g:LookupFile_TagExpr = '"./filenametags"'<br />
endif<br />
nmap &lt;silent&gt; &lt;leader&gt;lk &lt;Plug&gt;LookupFile<br />
nmap &lt;silent&gt; &lt;leader&gt;lb :LUBufs&lt;cr&gt;<br />
nmap &lt;silent&gt; &lt;leader&gt;lw :LUWalk&lt;cr&gt;<br />
" lookup file with ignore case<br />
function! LookupFile_IgnoreCaseFunc(pattern)<br />
&nbsp; &nbsp; let _tags = &amp;tags<br />
&nbsp; &nbsp; try<br />
&nbsp; &nbsp; &nbsp; &nbsp; let &amp;tags = eval(g:LookupFile_TagExpr)<br />
&nbsp; &nbsp; &nbsp; &nbsp; let newpattern = '\c' . a:pattern<br />
&nbsp; &nbsp; &nbsp; &nbsp; let tags = taglist(newpattern)<br />
&nbsp; &nbsp; catch<br />
&nbsp; &nbsp; &nbsp; &nbsp; echohl ErrorMsg | echo "Exception: " . v:exception | echohl NONE<br />
&nbsp; &nbsp; &nbsp; &nbsp; return ""<br />
&nbsp; &nbsp; finally<br />
&nbsp; &nbsp; &nbsp; &nbsp; let &amp;tags = _tags<br />
&nbsp; &nbsp; endtry<br />
<br />
&nbsp; &nbsp; " Show the matches for what is typed so far.<br />
&nbsp; &nbsp; let files = map(tags, 'v:val["filename"]')<br />
&nbsp; &nbsp; return files<br />
endfunction<br />
let g:LookupFile_LookupFunc = 'LookupFile_IgnoreCaseFunc'<br />
<br />
" Mark<br />
nmap &lt;silent&gt; &lt;leader&gt;hl &lt;Plug&gt;MarkSet<br />
vmap &lt;silent&gt; &lt;leader&gt;hl &lt;Plug&gt;MarkSet<br />
nmap &lt;silent&gt; &lt;leader&gt;hh &lt;Plug&gt;MarkClear<br />
vmap &lt;silent&gt; &lt;leader&gt;hh &lt;Plug&gt;MarkClear<br />
nmap &lt;silent&gt; &lt;leader&gt;hr &lt;Plug&gt;MarkRegex<br />
vmap &lt;silent&gt; &lt;leader&gt;hr &lt;Plug&gt;MarkRegex<br />
<br />
" SuperTab<br />
" 记住上次的补全方式，直到按ESC退出插入模式为止<br />
let g:SuperTabRetainCompletionType = 2<br />
" 缺省的补全方式(设置为全能补全)<br />
let g:SuperTabDefaultCompletionType = "&lt;C-X&gt;&lt;C-O&gt;"<br />
<br />
" DoxygenToolkit <br />
let g:DoxygenToolkit_authorName="simplyzhao" <br />
nmap da :DoxAuthor&lt;cr&gt;<br />
nmap dx :Dox&lt;cr&gt;<br />
nmap db :DoxBlock&lt;cr&gt;</div>
</div>
<img src ="http://www.blogjava.net/tinysun/aggbug/342585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tinysun/" target="_blank">何克勤</a> 2011-01-08 17:45 <a href="http://www.blogjava.net/tinysun/archive/2011/01/08/342585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>进程上下文和中断上下文</title><link>http://www.blogjava.net/tinysun/archive/2010/11/07/337492.html</link><dc:creator>何克勤</dc:creator><author>何克勤</author><pubDate>Sun, 07 Nov 2010 15:59:00 GMT</pubDate><guid>http://www.blogjava.net/tinysun/archive/2010/11/07/337492.html</guid><wfw:comment>http://www.blogjava.net/tinysun/comments/337492.html</wfw:comment><comments>http://www.blogjava.net/tinysun/archive/2010/11/07/337492.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tinysun/comments/commentRss/337492.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tinysun/services/trackbacks/337492.html</trackback:ping><description><![CDATA[<p><font style="background-color: #cde9d1">进程上下文和中断上下文是操作系统中很重要的两个概念，这两个概念在操作系统课程中不断被提及，是最经常接触、看上去很懂但又说不清楚到底怎么回事。造成这种局面的原因，可能是原来接触到的操作系统课程的教学总停留在一种浅层次的理论层面上，没有深入去研究。</font></p>
<p><font style="background-color: #cde9d1">处理器总处于以下状态中的一种：<br />
１、内核态，运行于进程上下文，内核代表进程运行于内核空间；<br />
２、内核态，运行于中断上下文，内核代表硬件运行于内核空间；<br />
３、用户态，运行于用户空间。</font></p>
<p><font style="background-color: #cde9d1">用户空间的应用程序，通过系统调用，进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核，内核态运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的&#8220;进程上下文&#8221;，可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。</font></p>
<p><font style="background-color: #cde9d1">硬件通过触发信号，导致内核调用中断处理程序，进入内核空间。这个过程中，硬件的一些变量和参数也要传递给内核，内核通过这些参数进行中断处理。所谓的&#8220;中断上下文&#8221;，其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境（主要是当前被打断执行的进程环境）。</font></p>
<font style="background-color: #cde9d1">
<p><br />
关于进程上下文LINUX完全注释中的一段话： </p>
<p>&nbsp;&nbsp; 当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下文。当内核需要切换到另一个进程时，它需要保存当前进程的所有状态，即保存当前进程的上下文，以便在再次执行该进程时，能够必得到切换时的状态执行下去。在LINUX中，当前进程上下文均保存在进程的任务数据结构中。在发生中断时,内核就在被中断进程的上下文中，在内核态下执行中断服务例程。但同时会保留所有需要用到的资源，以便中继服务结束时能恢复被中断进程的执行。</p>
<p><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/eroswang/archive/2007/11/28/1905830.aspx</font></p>
<img src ="http://www.blogjava.net/tinysun/aggbug/337492.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tinysun/" target="_blank">何克勤</a> 2010-11-07 23:59 <a href="http://www.blogjava.net/tinysun/archive/2010/11/07/337492.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Socket send函数和recv函数详解</title><link>http://www.blogjava.net/tinysun/archive/2010/10/20/335699.html</link><dc:creator>何克勤</dc:creator><author>何克勤</author><pubDate>Wed, 20 Oct 2010 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/tinysun/archive/2010/10/20/335699.html</guid><wfw:comment>http://www.blogjava.net/tinysun/comments/335699.html</wfw:comment><comments>http://www.blogjava.net/tinysun/archive/2010/10/20/335699.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tinysun/comments/commentRss/335699.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tinysun/services/trackbacks/335699.html</trackback:ping><description><![CDATA[<meta http-equiv="content-type" content="text/html; charset=utf-8" /><span  style="border-collapse: collapse; ">
<p><font size="3">i<font size="2">nt send( SOCKET s,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char FAR *buf,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int len,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int flags );&nbsp;&nbsp;</font></font></p>
<p><font size="2">不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。</font></p>
<p><font size="2">客户程序一般用send函数向服务器发送请求，而服务器则通常用send函数来向客户程序发送应答。</font></p>
<p><font size="2">该函数的第一个参数指定发送端套接字描述符；</font></p>
<p><font size="2">第二个参数指明一个存放应用程序要发送数据的缓冲区；</font></p>
<p><font size="2">第三个参数指明实际要发送的数据的字节数；</font></p>
<p><font size="2">第四个参数一般置0。</font></p>
<p><font size="2">这里只描述同步Socket的send函数的执行流程。当调用该函数时，send先比较待发送数据的长度len和套接字s的<strong><strong>发送缓冲</strong>的 长度</strong>，如果len大于s的发送缓冲区的长度，该函数返回SOCKET_ERROR；如果len小于或者等于s的发送缓冲区的长度，那么send先检查协议是否正在发送s的发送缓冲中的数据，如果是就等待协议把数据发送完，如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据，那么 send就比较s的发送缓冲区的剩余空间和len，如果len大于剩余空间大小send就一直等待协议把s的发送缓冲中的数据发送完，如果len小于剩余空间大小send就仅仅把buf中的数据copy到剩余空间里（<strong><font color="#000000">注意并不是send把s的发送缓冲中的数据传到连接的另一端的，而是协议传的，</font></strong><font color="#ff0000"><strong><font color="#000000"><strong>send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里</strong></font></strong><font color="#000000">）。</font></font>如果send函数copy数据成功，就返回实际copy的字节数，如果send在copy数据时出现错误，那么send就返回SOCKET_ERROR；如果send在等待协议传送数据时网络断开的话，那么send函数也返回SOCKET_ERROR。</font></p>
<p><font size="2"><font color="#000000"><strong>要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了，但是此时这些数据并不一定马上被传到连接的另一端</strong>。</font>如果协议在后续的传送过程中出现网络错误的话，那么下一个Socket函数就会返回SOCKET_ERROR。（每一个除send外的Socket函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续，如果在等待时出现网络错误，那么该Socket函数就返回 SOCKET_ERROR）</font></p>
<p><font size="2">注意：在Unix系统下，如果send在等待协议传送数据时网络断开的话，调用send的进程会接收到一个SIGPIPE信号，进程对该信号的默认处理是进程终止。</font></p>
<p><font color="#ff0000">通过测试发现，异步socket的send函数在网络刚刚断开时还能发送返回相应的字节数，同时使用select检测也是可写的，但是过几秒钟之后，再send就会出错了，返回-1。select也不能检测出可写了。</font></p>
<p><font size="3"><font color="#000000" size="3"><strong>recv函数</strong></font><br />
</font></p>
<p><font size="3">i<font size="2">nt recv( SOCKET s,&nbsp;&nbsp;&nbsp;&nbsp; char FAR *buf,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int len,&nbsp;&nbsp;&nbsp;&nbsp; int flags&nbsp;&nbsp;&nbsp;&nbsp; );&nbsp;&nbsp;&nbsp;</font></font></p>
<p><font size="2">不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。</font></p>
<p><font size="2">该函数的第一个参数指定接收端套接字描述符；</font></p>
<p><font size="2">第二个参数指明一个缓冲区，该缓冲区用来存放recv函数接收到的数据；</font></p>
<p><font size="2">第三个参数指明buf的长度；</font></p>
<p><font size="2">第四个参数一般置0。</font></p>
<p><font size="2">这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时，recv先等待s的发送缓冲中的数据被协议传送完毕，如果协议在传送s的发送缓冲中的数据时出现网络错误，那么recv函数返回SOCKET_ERROR，如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后，recv先检查套接字s的接收缓冲区，如果s接收缓冲区中没有数据或者协议正在接收数据，那么recv就一直等待，只到协议把数据接收完毕。当协议把数据接收完毕，recv函数就把s的接收缓冲中的数据copy到buf中（<strong><font color="#000000">注意协议接收到的数据可能大于buf的长度，所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。<strong>recv函数仅仅是copy数据，真正的接收数据是协议来完成的</strong></font></strong>），recv函数返回其实际copy的字节数。如果recv在copy时出错，那么它返回SOCKET_ERROR；如果recv函数在等待协议接收数据时网络中断了，那么它返回0。</font></p>
<p><font size="2">注意：在Unix系统下，如果recv函数在等待协议接收数据时网络断开了，那么调用recv的进程会接收到一个SIGPIPE信号，进程对该信号的默认处理是进程终止。</font></p>
</span>
<img src ="http://www.blogjava.net/tinysun/aggbug/335699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tinysun/" target="_blank">何克勤</a> 2010-10-20 16:21 <a href="http://www.blogjava.net/tinysun/archive/2010/10/20/335699.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>手机背景</title><link>http://www.blogjava.net/tinysun/archive/2010/10/16/335298.html</link><dc:creator>何克勤</dc:creator><author>何克勤</author><pubDate>Sat, 16 Oct 2010 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/tinysun/archive/2010/10/16/335298.html</guid><wfw:comment>http://www.blogjava.net/tinysun/comments/335298.html</wfw:comment><comments>http://www.blogjava.net/tinysun/archive/2010/10/16/335298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tinysun/comments/commentRss/335298.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tinysun/services/trackbacks/335298.html</trackback:ping><description><![CDATA[<p><font style="background-color: #cde9d1">转载时请注明出处和作者联系方式：http://blog.csdn.net/absurd</font></p>
<p><font style="background-color: #cde9d1">作者联系方式：李先静 &lt;xianjimli at hotmail dot com&gt;</font></p>
<p><font style="background-color: #cde9d1">更新时间：2007-6-21</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">在正式进入Marvell-linux研究之前，我们介绍一点背景知识，让没有手机开发经验的朋友有个概念。</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基带(BaseBand)</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">基带是传统手机中最重要的功能，它直接与无线网络交互，负责信号的发送和接收。所有编码/解码和网络协议处理都是它负责的，这一部分也是最复杂，涉及专利最多的部分。所幸的是，大部分处理都集成在芯片里了，对于一般手机设计来说，至少在软件方面是不用太关心的。</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">我们知道，交变电流在流经导体时会产生无线电波，无线电波可以经过空间传播出去，这就是无线发送的原理。而无线电波又可以让导体产生电流，电流信号可恢复为与发送时的一致信号，这就是无线接收的原理。</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">在无线电设备中，这里的导体就是天线，天线的长度是有要求的，它一般不能小于波长的一半，像耳朵能听声音频率范围是20Hz～20KHz，最敏感的部分在2500赫兹到3000赫兹之间。因为波长x频率=光速，以3000赫兹的无线电波为例，它对应的波长是100公里，如果直接收/发这种电波，那么天线长度至少要50公里，我们当然不可能在手机上安装一个50公里长的天线，怎么办呢？</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">要缩短天线的长度，只能提高电波的频率。发送时，把低频信号调制在高频信号上再发送出去，接收时，先得到高频信号，然后从中解调出低频信号。这里高频信号称为载波，一般GSM手机使用1800M或900M的载波，而CDMA使用800M或1900M的载波。当然这里的频率指的是中心频率，信号本身要占一定的带宽，而且为了避免干扰，发送和接收所用的频率也不一样，以900M的载波来看，接收频率为925M-960M，发送频率为880M-915M。</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">高频信号是真正在空间中传播的无线信号，对高频信号的处理也就是所谓的射频(RF) 信号处理，高频信号让天线变短了，这是它的好处，同时也带来了副作用，因为它的波长太短，它可能把印刷板上的导线都当作天线，在上面产生感应电流，原本两根无关的导线，现在变得关系暧昧，加上无线电波的反射互相影响，使其中充满太多不确定因素，导致射频电路设计非常复杂。按照温伯格的《系统化思维导论》里的说法，这是一个典型的中数系统，即不能采用小数系统中那样的简化，又不能采用大数系统中的概率统计。</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">手机的功率比较小，它不能直接与卫星建立通信，而是与基站(BS)之间通信，基站呈蜂窝状布置，所以以前称手机为蜂窝电话。</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">现在的手机都是数字信号，即使音频信号也要进行数字编码之后才能传递，任何通信都有一套通信协议，手机和基站之间的通信当然也不例外，多个手机共享基站，信道的建立，手机在基站之间的切换，如此等等，还有很多复杂的情况，所以整套协议非常复杂。 </font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">多个手机共享一个基站，如何共享，这就是所谓的多址问题。常见的有频分多址（FDMA）、时分多址（TDMA）和码分多址（CDMA）。在2G中通常使用频分多址（FDMA）和时分多址（TDMA）的组合，而在3G中使用码分多址（CDMA）。</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 应用处理器(AP)</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">AP从逻辑上讲是一个独立的东西，在物理上可以独立于基带处理器，也可以从属于基带处理器。如果使用Marvell的Monahans系列芯片，那么可以肯定AP是独立于基带处理器的。</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">AP的功能是运行应用程序，我们常说的MMI就是在这上面运行，一般手机设计公司的主要工作就是开发这些应用程序。一个典型软件(linux平台)的分层视图如下图所示：</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">&nbsp;<img height="485" alt="" src="http://www.blogjava.net/images/blogjava_net/tinysun/o_linux_mobile_platform.jpg" width="619" border="0" /></font></p>
<p><font style="background-color: #cde9d1">在Marvell-linux这个系列中，我们关注的主要是linux kernel中与平台相关的部分。</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BB与AP的桥梁</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">既然像电话这种通信类应用程序是在AP上跑的，而通信功能又是在BB上实现的，那么就一定会存在一个连接AP和BB的通道。</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">最常见的连接方式就是串口，在linux下，也就是tty设备。在AP这边，用AT命令控制BB，来实现打电话和发短信等功能，在3GPP的《AT command set for User Equipment (UE)》文档中定义标准的AT命令，各个模组厂家为了增加功能，在上面都做了些扩展，在使用AT时，要参考模组厂家的手册。</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">AT命令是文本格式的，它经过串口发送到BB。它控制BB来完成打电话和发短信等传统功能没有问题，但是要通过BB无线上网(如GPRS)，就遇到麻烦了，因为上网的数据是二进制的，如果和AT命令混在一起从串口传输，那就会乱成一团了。</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">为了解决AT命令和二进制数据共享串口的问题，3GPP制定了一个称为多路复用的协议，它把一个物理串口虚拟成多个逻辑上的串口。应用程序使用各自独立的虚拟串口而互不干扰。</font></p>
<p><font style="background-color: #cde9d1">&nbsp;</font></p>
<p><font style="background-color: #cde9d1">有人会问GPRS数据和AT命令是通过多路复用协议经串口在AP和BB之间传递的，那么打电话时的语音数据呢，是不是也是走条通道呢？答案是否，因为那样做效率太低了，所以对于下行语音数据，BB解码后直接送到speaker，对上行的语音数据，从MIC采样/处理后，直接通过BB发送出去。</font></p>
<p><font style="background-color: #cde9d1">本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/absurd/archive/2007/06/21/1661231.aspx</font></p>
<img src ="http://www.blogjava.net/tinysun/aggbug/335298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tinysun/" target="_blank">何克勤</a> 2010-10-16 17:44 <a href="http://www.blogjava.net/tinysun/archive/2010/10/16/335298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>。。。。</title><link>http://www.blogjava.net/tinysun/archive/2010/10/11/334455.html</link><dc:creator>何克勤</dc:creator><author>何克勤</author><pubDate>Mon, 11 Oct 2010 09:20:00 GMT</pubDate><guid>http://www.blogjava.net/tinysun/archive/2010/10/11/334455.html</guid><wfw:comment>http://www.blogjava.net/tinysun/comments/334455.html</wfw:comment><comments>http://www.blogjava.net/tinysun/archive/2010/10/11/334455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tinysun/comments/commentRss/334455.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tinysun/services/trackbacks/334455.html</trackback:ping><description><![CDATA[http://blog.csdn.net/absurd/archive/2006/07/25/976820.aspx
<div>
<meta http-equiv="content-type" content="text/html; charset=utf-8" /><a href="http://blog.csdn.net/eroswang/category/322381.aspx?PageNumber=2">http://blog.csdn.net/eroswang/category/322381.aspx?PageNumber=2</a></div>
<img src ="http://www.blogjava.net/tinysun/aggbug/334455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tinysun/" target="_blank">何克勤</a> 2010-10-11 17:20 <a href="http://www.blogjava.net/tinysun/archive/2010/10/11/334455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>