﻿<?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>IT博客-Eric.wei-随笔分类-linux</title><link>http://www.cnitblog.com/hustwei/category/6577.html</link><description>The dream starts</description><language>zh-cn</language><lastBuildDate>Tue, 27 Sep 2011 22:27:07 GMT</lastBuildDate><pubDate>Tue, 27 Sep 2011 22:27:07 GMT</pubDate><ttl>60</ttl><item><title>【zz】vim小技巧</title><link>http://www.cnitblog.com/hustwei/archive/2008/05/21/44034.html</link><dc:creator>wei</dc:creator><author>wei</author><pubDate>Wed, 21 May 2008 12:58:00 GMT</pubDate><guid>http://www.cnitblog.com/hustwei/archive/2008/05/21/44034.html</guid><wfw:comment>http://www.cnitblog.com/hustwei/comments/44034.html</wfw:comment><comments>http://www.cnitblog.com/hustwei/archive/2008/05/21/44034.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hustwei/comments/commentRss/44034.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hustwei/services/trackbacks/44034.html</trackback:ping><description><![CDATA[<p>删除文件中所有的空行<br>:g/^\s*$/d</p>
<p>去掉所有的行尾空格：<br>:%s/\s\+$//</p>
<p>整个文件特定字符串的替换<br>:%s/old_word/new_word/g</p>
<p>删除从当前行开始到最后一行的所有内容:<br>.,$d</p>
<p><br>去掉所有的&#8220;//&#8221;注释：<br>:%s!\s*//.*!!<br>（首先可以注意到，这儿分隔符改用了&#8220;!&#8221;，原因是在模式或字符串部分使用了&#8220;/&#8221;字符，不换用其他分隔符的话就得在每次使用&#8220;/&#8221;字符本身时写成&#8220;\/&#8221;，上面的命令得写成&#8220;:%s/\s*\/\/.*//&#8221;，可读性较低。命令本身倒是相当简单，用过正则表达式的人估计都知道&#8220;.&#8221;匹配表示除换行符之外的任何字符吧。 ）</p>
<p>去掉所有的&#8220;/* */&#8221;注释：<br>:%s!\s*/\*\_.\{-}\*/\s*! !g<br>（这个略有点复杂了，用到了几个不太常用的 Vim 正则表达式特性。&#8220;\_.&#8221;匹配包含换行在内的所有字符；&#8220;\{-}&#8221;表示前一个字符可出现零次或多次，但在整个正则表达式可以匹配成功的前提下，匹配的字符数越少越好；标志&#8220;g&#8221;表示一行里可以匹配和替换多次。替换的结果是个空格的目的是保证像&#8220;int/* space not necessary around comments */main()&#8221;这样的表达式在替换之后仍然是合法）</p>
<p>{}()[]匹配: %</p>
<p>精确匹配查找单词<br>如果你输入 "/the"，你也可能找到 "there"。要找到以 "the" 结尾的单词，可以用：<br>/the\&gt; "\&gt;" 是一个特殊的记号，表示只匹配单词末尾。类似地，"\&lt;" 只匹配单词的开头。<br>这样，要匹配一个完整的单词 "the"，只需：/\&lt;the\&gt;</p>
<p><br>特殊的&#8220;寄存器&#8221;：&#8220;=&#8221;。<br>在插入模式或命令模式中，键入&#8220;Ctrl-R=&#8221;，Vim 会提示你输入一个表达式，普通的整数运算在此完全有效。</p>
<p><br>Vim 支持单词的自动完成。<br>Ctrl+p<br>比如，你前面使用了一个很长的变量名，叫 aLongVariable，下面你在输入时，就不用完整键入了。很可能，你只需要键入&#8220;aL&#8221;，然后按下&#8220;Ctrl-P&#8221;（向前搜索可匹配的单词并完成）就可以得到完整的变量名（没有得到想要的结果的话，多按几下&#8220;Ctrl-P&#8221;；或者前面多输入几个字符，如&#8220;aLongV&#8221;）。类似的命令还有&#8220;Ctrl-N&#8221;（向后搜索可匹配的单词并完成）、&#8220;Ctrl-X Ctrl-L&#8221;（搜索可匹配的行并完成）、&#8220;Ctrl-X Ctrl-F&#8221;（搜索可匹配的文件名并完成）等，具体可参看&#8220;:help ins-completion&#8221;。</p>
<p><br>Make 和 grep</p>
<p>Make [17] 和grep [18] 应当算是 Unix 世界里无人不晓的基本工具了吧。很自然的，Vim 对它们有着特殊的支持。该支持主要通过访问一个特殊的快速修订窗口（quickfix window）来实现。直接在 Vim 的命令模式里输入相应的 make 或 grep 命令（如&#8220;:grep foo *.c&#8221;）即可将命令的执行结果放入该窗口，同时根据返回的结果跳转到第一个错误（make 的情况；在使用 grep 时是匹配成功之处）。以下是常用的&#8220;快速修订&#8221;命令：</p>
<p>:cn（显示下一个错误） </p>
<p>:cp（显示上一个错误） </p>
<p>:cl（列出所有的错误及其编号） </p>
<p>:cc（跳转到指定编号的错误） </p>
<p>:copen（打开快速修订窗口，在其中显示所有错误，可在错误上双击鼠标或按回车键跳转至该错误</p>
<p><br>执行外部命令<br>:!命令</p>
<p>&nbsp;</p>
<p>guw（光标下的单词变为小写） </p>
<p>gUw（光标下的单词变为大写）</p>
<p>&nbsp;</p>
<p>Vim 在搜索和替换时会对匹配成功的文本进行加亮，在已经完成搜索和替换任务后，这种加亮有时反而会妨碍显示。<br>Vim 专门提供一个命令取消这种加亮（直到用户再一次使用搜索或替换命令）：&#8220;:nohlsearch&#8221;。<br>建议用户创建一个键盘映射（key mapping）加入到 .vimrc 中，如：<br>nmap &lt;F2&gt; :nohlsearch&lt;CR&gt;</p>
<p>&nbsp;</p>
<p><br>&nbsp;</p>
<img src ="http://www.cnitblog.com/hustwei/aggbug/44034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hustwei/" target="_blank">wei</a> 2008-05-21 20:58 <a href="http://www.cnitblog.com/hustwei/archive/2008/05/21/44034.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]lsof 命令详解</title><link>http://www.cnitblog.com/hustwei/archive/2008/04/13/42318.html</link><dc:creator>wei</dc:creator><author>wei</author><pubDate>Sun, 13 Apr 2008 13:08:00 GMT</pubDate><guid>http://www.cnitblog.com/hustwei/archive/2008/04/13/42318.html</guid><wfw:comment>http://www.cnitblog.com/hustwei/comments/42318.html</wfw:comment><comments>http://www.cnitblog.com/hustwei/archive/2008/04/13/42318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hustwei/comments/commentRss/42318.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hustwei/services/trackbacks/42318.html</trackback:ping><description><![CDATA[lsof 命令详解&nbsp;<br><br>&nbsp;download<br><a href="ftp://sunsite.ualberta.ca/pub/Mirror/lsof/"><span style="COLOR: #000000">ftp://sunsite.ualberta.ca/pub/Mirror/lsof/</span></a><br><br>[ 作者:&nbsp; 加入时间:2007-08-29 11:19:52&nbsp; 来自:Linux联盟收集整理 ] <br>&nbsp;<br>&nbsp;<br>&nbsp;<br>&nbsp;一般root用户才能执行lsof命令，普通用户可以看见/usr/sbin/lsof命令，但是普通用户执行会显示&#8220;permission denied&#8221;<br>我总结一下lsof指令的用法：<br>&nbsp;&nbsp;&nbsp; lsof abc.txt 显示开启文件abc.txt的进程<br>&nbsp;&nbsp;&nbsp; lsof -i :22 知道22端口现在运行什么程序<br>&nbsp;&nbsp;&nbsp; lsof -c abc 显示abc进程现在打开的文件<br>&nbsp;&nbsp;&nbsp; lsof -g gid 显示归属gid的进程情况<br>&nbsp;&nbsp;&nbsp; lsof +d /usr/local/ 显示目录下被进程开启的文件<br>&nbsp;&nbsp;&nbsp; lsof +D /usr/local/ 同上，但是会搜索目录下的目录，时间较长<br>&nbsp;&nbsp;&nbsp; lsof -d 4&nbsp; 显示使用fd为4的进程<br>&nbsp;&nbsp;&nbsp; lsof -i 用以显示符合条件的进程情况<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语法: lsof -i[46] [protocol][@hostname|hostaddr][:service|port]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 46 --&gt; IPv4 or IPv6<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protocol --&gt; TCP or UDP<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hostname --&gt; Internet host name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hostaddr --&gt; IPv4位置<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; service --&gt; /etc/service中的 service name (可以不只一个)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; port --&gt; 端口号 (可以不只一个)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子: TCP:25 - TCP and port 25<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @1.2.3.4 - Internet IPv4 host address 1.2.3.4<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#99;&#112;&#64;&#111;&#104;&#97;&#104;&#97;&#46;&#107;&#115;&#46;&#101;&#100;&#117;&#46;&#116;&#119;&#58;&#102;&#116;&#112;">tcp@ohaha.ks.edu.tw:ftp</a> - TCP protocol hosthaha.ks.edu.tw service name:ftp<br>&nbsp;&nbsp;&nbsp; lsof -n 不将IP转换为hostname，缺省是不加上-n参数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子: lsof -i <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#99;&#112;&#64;&#111;&#104;&#97;&#104;&#97;&#46;&#107;&#115;&#46;&#101;&#100;&#117;&#46;&#116;&#119;&#58;&#102;&#116;&#112;">tcp@ohaha.ks.edu.tw:ftp</a> -n<br>&nbsp;&nbsp;&nbsp; lsof -p 12&nbsp; 看进程号为12的进程打开了哪些文件&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; lsof +|-r [t] 控制lsof不断重复执行，缺省是15s刷新<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -r，lsof会永远不断的执行，直到收到中断信号<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +r，lsof会一直执行，直到没有档案被显示<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子：不断查看目前ftp连接的情况：lsof -i <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#99;&#112;&#64;&#111;&#104;&#97;&#104;&#97;&#46;&#107;&#115;&#46;&#101;&#100;&#117;&#46;&#116;&#119;&#58;&#102;&#116;&#112;">tcp@ohaha.ks.edu.tw:ftp</a> -r<br>&nbsp;&nbsp;&nbsp; lsof -s 列出打开文件的大小，如果没有大小，则留下空白<br>&nbsp;&nbsp;&nbsp; lsof -u username&nbsp; 以UID，列出打开的文件<br><br>一般root用户才能执行lsof命令，普通用户可以看见/usr/sbin/lsof命令，但是普通用户执行会显示&#8220;permission denied&#8221;<br>我总结一下lsof指令的用法：<br>lsof abc.txt 显示开启文件abc.txt的进程<br>&nbsp;&nbsp;&nbsp; lsof -i :22 知道22端口现在运行什么程序<br>&nbsp;&nbsp;&nbsp; lsof -c abc 显示abc进程现在打开的文件<br>&nbsp;&nbsp;&nbsp; lsof -g gid 显示归属gid的进程情况<br>&nbsp;&nbsp;&nbsp; lsof +d /usr/local/ 显示目录下被进程开启的文件<br>&nbsp;&nbsp;&nbsp; lsof +D /usr/local/ 同上，但是会搜索目录下的目录，时间较长<br>&nbsp;&nbsp;&nbsp; lsof -d 4&nbsp; 显示使用fd为4的进程<br>&nbsp;&nbsp;&nbsp; lsof -i 用以显示符合条件的进程情况<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语法: lsof -i[46] [protocol][@hostname|hostaddr][:service|port]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 46 --&gt; IPv4 or IPv6<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protocol --&gt; TCP or UDP<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hostname --&gt; Internet host name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hostaddr --&gt; IPv4位置<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; service --&gt; /etc/service中的 service name (可以不只一个)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; port --&gt; 端口号 (可以不只一个)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子: TCP:25 - TCP and port 25<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @1.2.3.4 - Internet IPv4 host address 1.2.3.4<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#99;&#112;&#64;&#111;&#104;&#97;&#104;&#97;&#46;&#107;&#115;&#46;&#101;&#100;&#117;&#46;&#116;&#119;&#58;&#102;&#116;&#112;">tcp@ohaha.ks.edu.tw:ftp</a> - TCP protocol hosthaha.ks.edu.tw service name:ftp<br>&nbsp;&nbsp;&nbsp; lsof -n 不将IP转换为hostname，缺省是不加上-n参数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子: lsof -i <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#99;&#112;&#64;&#111;&#104;&#97;&#104;&#97;&#46;&#107;&#115;&#46;&#101;&#100;&#117;&#46;&#116;&#119;&#58;&#102;&#116;&#112;">tcp@ohaha.ks.edu.tw:ftp</a> -n<br>&nbsp;&nbsp;&nbsp; lsof -p 12&nbsp; 看进程号为12的进程打开了哪些文件&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; lsof +|-r [t] 控制lsof不断重复执行，缺省是15s刷新<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -r，lsof会永远不断的执行，直到收到中断信号<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +r，lsof会一直执行，直到没有档案被显示<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子：不断查看目前ftp连接的情况：lsof -i <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#99;&#112;&#64;&#111;&#104;&#97;&#104;&#97;&#46;&#107;&#115;&#46;&#101;&#100;&#117;&#46;&#116;&#119;&#58;&#102;&#116;&#112;">tcp@ohaha.ks.edu.tw:ftp</a> -r<br>&nbsp;&nbsp;&nbsp; lsof -s 列出打开文件的大小，如果没有大小，则留下空白<br>&nbsp;&nbsp;&nbsp; lsof -u username&nbsp; 以UID，列出打开的文件<br><br>[root@tcx160 FILES]# lsof -i tcp:22<br>COMMAND&nbsp;&nbsp; PID USER&nbsp;&nbsp; FD&nbsp;&nbsp; TYPE DEVICE SIZE NODE NAME<br>sshd&nbsp;&nbsp;&nbsp;&nbsp; 3261 root&nbsp;&nbsp;&nbsp; 3u&nbsp; IPv6&nbsp;&nbsp; 7301&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TCP *:ssh (LISTEN)<br>sshd&nbsp;&nbsp;&nbsp; 19692 root&nbsp;&nbsp;&nbsp; 3u&nbsp; IPv6 348642&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TCP 9.186.96.160:ssh-&gt;9.186.96.117:32914 (ESTABLISHED)<br>&nbsp;<br>
<img src ="http://www.cnitblog.com/hustwei/aggbug/42318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hustwei/" target="_blank">wei</a> 2008-04-13 21:08 <a href="http://www.cnitblog.com/hustwei/archive/2008/04/13/42318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sock-Richard Stevens' sock program</title><link>http://www.cnitblog.com/hustwei/archive/2008/04/13/42317.html</link><dc:creator>wei</dc:creator><author>wei</author><pubDate>Sun, 13 Apr 2008 12:54:00 GMT</pubDate><guid>http://www.cnitblog.com/hustwei/archive/2008/04/13/42317.html</guid><wfw:comment>http://www.cnitblog.com/hustwei/comments/42317.html</wfw:comment><comments>http://www.cnitblog.com/hustwei/archive/2008/04/13/42317.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/hustwei/comments/commentRss/42317.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hustwei/services/trackbacks/42317.html</trackback:ping><description><![CDATA[<p><a href="http://www.icir.org/christian/downloads/sock-0.3.tar.gz">http://www.icir.org/christian/downloads/sock-0.3.tar.gz</a></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usage:&nbsp;sock&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">[</span><span style="COLOR: #800000">&nbsp;options&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">]</span><span style="COLOR: #000000">&nbsp;&lt;host&gt;&nbsp;&lt;port&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(for&nbsp;client</span><span style="COLOR: #008000">;</span><span style="COLOR: #008000">&nbsp;default)</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sock&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">[</span><span style="COLOR: #800000">&nbsp;options&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">]</span><span style="COLOR: #000000">&nbsp;-s&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">[</span><span style="COLOR: #800000">&nbsp;&lt;IPaddr&gt;&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">]</span><span style="COLOR: #000000">&nbsp;&lt;port&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(for&nbsp;server)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sock&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">[</span><span style="COLOR: #800000">&nbsp;options&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">]</span><span style="COLOR: #000000">&nbsp;-i&nbsp;&lt;host&gt;&nbsp;&lt;port&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(for&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">source</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;client)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sock&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">[</span><span style="COLOR: #800000">&nbsp;options&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">]</span><span style="COLOR: #000000">&nbsp;-i&nbsp;-s&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">[</span><span style="COLOR: #800000">&nbsp;&lt;IPaddr&gt;&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">]</span><span style="COLOR: #000000">&nbsp;&lt;port&gt;&nbsp;&nbsp;(for&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sink</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;server)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options:&nbsp;-b&nbsp;n&nbsp;&nbsp;bind&nbsp;n&nbsp;as&nbsp;client's&nbsp;local&nbsp;port&nbsp;number<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-c&nbsp;&nbsp;&nbsp;&nbsp;convert&nbsp;newline&nbsp;to&nbsp;CR/LF&nbsp;&amp;&nbsp;vice&nbsp;versa<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-f&nbsp;a.b.c.d.p&nbsp;&nbsp;foreign&nbsp;IP&nbsp;address&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;a.b.c.d</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;foreign&nbsp;port#&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;p<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-g&nbsp;a.b.c.d&nbsp;&nbsp;loose&nbsp;source&nbsp;route<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-h&nbsp;&nbsp;&nbsp;&nbsp;issue&nbsp;TCP&nbsp;half&nbsp;close&nbsp;on&nbsp;standard&nbsp;input&nbsp;EOF<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-i&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">source</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;data&nbsp;to&nbsp;socket</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sink</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;data&nbsp;from&nbsp;socket&nbsp;(w/-s)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-j&nbsp;a.b.c.d&nbsp;&nbsp;join&nbsp;multicast&nbsp;group<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-k&nbsp;&nbsp;&nbsp;&nbsp;write&nbsp;or&nbsp;writev&nbsp;in&nbsp;chunks<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-l&nbsp;a.b.c.d.p&nbsp;&nbsp;client's&nbsp;local&nbsp;IP&nbsp;address&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;a.b.c.d</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;local&nbsp;port#&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;p<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-n&nbsp;n&nbsp;&nbsp;#buffers&nbsp;to&nbsp;write&nbsp;for&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">source</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;client&nbsp;(default&nbsp;</span><span style="COLOR: #000000">1024</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-o&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;NOT&nbsp;connect&nbsp;UDP&nbsp;client<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-p&nbsp;n&nbsp;&nbsp;#ms&nbsp;to&nbsp;pause&nbsp;before&nbsp;each&nbsp;read&nbsp;or&nbsp;write&nbsp;(source/sink)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-q&nbsp;n&nbsp;&nbsp;size&nbsp;of&nbsp;listen&nbsp;queue&nbsp;for&nbsp;TCP&nbsp;server&nbsp;(default&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-r&nbsp;n&nbsp;&nbsp;#bytes&nbsp;per&nbsp;read()&nbsp;for&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sink</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;server&nbsp;(default&nbsp;</span><span style="COLOR: #000000">1024</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-s&nbsp;&nbsp;&nbsp;&nbsp;operate&nbsp;as&nbsp;server&nbsp;instead&nbsp;of&nbsp;client<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-t&nbsp;n&nbsp;&nbsp;set&nbsp;multicast&nbsp;ttl<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-u&nbsp;&nbsp;&nbsp;&nbsp;use&nbsp;UDP&nbsp;instead&nbsp;of&nbsp;TCP<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-v&nbsp;&nbsp;&nbsp;&nbsp;verbose<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-w&nbsp;n&nbsp;&nbsp;#bytes&nbsp;per&nbsp;write()&nbsp;for&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">source</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;client&nbsp;(default&nbsp;</span><span style="COLOR: #000000">1024</span><span style="COLOR: #000000">)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-x&nbsp;n&nbsp;&nbsp;#ms&nbsp;for&nbsp;SO_RCVTIMEO&nbsp;(receive&nbsp;timeout)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-y&nbsp;n&nbsp;&nbsp;#ms&nbsp;for&nbsp;SO_SNDTIMEO&nbsp;(send&nbsp;timeout)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-A&nbsp;&nbsp;&nbsp;&nbsp;SO_REUSEADDR&nbsp;option<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-B&nbsp;&nbsp;&nbsp;&nbsp;SO_BROADCAST&nbsp;option<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-C&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;terminal&nbsp;to&nbsp;cbreak&nbsp;mode<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-D&nbsp;&nbsp;&nbsp;&nbsp;SO_DEBUG&nbsp;option<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-E&nbsp;&nbsp;&nbsp;&nbsp;IP_RECVDSTADDR&nbsp;option<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-F&nbsp;&nbsp;&nbsp;&nbsp;fork&nbsp;after&nbsp;connection&nbsp;accepted&nbsp;(TCP&nbsp;concurrent&nbsp;server)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-G&nbsp;a.b.c.d&nbsp;&nbsp;strict&nbsp;source&nbsp;route<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-H&nbsp;n&nbsp;&nbsp;IP_TOS&nbsp;option&nbsp;(</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">min&nbsp;del</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">max&nbsp;thru</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">max&nbsp;rel</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">min$)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-I&nbsp;&nbsp;&nbsp;&nbsp;SIGIO&nbsp;signal<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-J&nbsp;n&nbsp;&nbsp;IP_TTL&nbsp;option<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-K&nbsp;&nbsp;&nbsp;&nbsp;SO_KEEPALIVE&nbsp;option<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-L&nbsp;n&nbsp;&nbsp;SO_LINGER&nbsp;option</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;n&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;linger&nbsp;time<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-N&nbsp;&nbsp;&nbsp;&nbsp;TCP_NODELAY&nbsp;option<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-O&nbsp;n&nbsp;&nbsp;#ms&nbsp;to&nbsp;pause&nbsp;after&nbsp;listen</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;but&nbsp;before&nbsp;first&nbsp;accept<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-P&nbsp;n&nbsp;&nbsp;#ms&nbsp;to&nbsp;pause&nbsp;before&nbsp;first&nbsp;read&nbsp;or&nbsp;write&nbsp;(source/sink)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-Q&nbsp;n&nbsp;&nbsp;#ms&nbsp;to&nbsp;pause&nbsp;after&nbsp;receiving&nbsp;FIN</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;but&nbsp;before&nbsp;close<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-R&nbsp;n&nbsp;&nbsp;SO_RCVBUF&nbsp;option<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-S&nbsp;n&nbsp;&nbsp;SO_SNDBUF&nbsp;option<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-T&nbsp;&nbsp;&nbsp;&nbsp;SO_REUSEPORT&nbsp;option<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-U&nbsp;n&nbsp;&nbsp;enter&nbsp;urgent&nbsp;mode&nbsp;before&nbsp;write&nbsp;number&nbsp;n&nbsp;(source&nbsp;only)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-V&nbsp;&nbsp;&nbsp;&nbsp;use&nbsp;writev()&nbsp;instead&nbsp;of&nbsp;write()</span><span style="COLOR: #008000">;</span><span style="COLOR: #008000">&nbsp;enables&nbsp;-k&nbsp;too</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-W&nbsp;&nbsp;&nbsp;&nbsp;ignore&nbsp;write&nbsp;errors&nbsp;for&nbsp;sink&nbsp;client<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-X&nbsp;n&nbsp;&nbsp;TCP_MAXSEG&nbsp;option&nbsp;(set&nbsp;MSS)<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-Y&nbsp;&nbsp;&nbsp;&nbsp;SO_DONTROUTE&nbsp;option<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-Z&nbsp;&nbsp;&nbsp;&nbsp;MSG_PEEK<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<img src ="http://www.cnitblog.com/hustwei/aggbug/42317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hustwei/" target="_blank">wei</a> 2008-04-13 20:54 <a href="http://www.cnitblog.com/hustwei/archive/2008/04/13/42317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>核态编程常用范式</title><link>http://www.cnitblog.com/hustwei/archive/2008/01/10/38725.html</link><dc:creator>wei</dc:creator><author>wei</author><pubDate>Thu, 10 Jan 2008 14:43:00 GMT</pubDate><guid>http://www.cnitblog.com/hustwei/archive/2008/01/10/38725.html</guid><wfw:comment>http://www.cnitblog.com/hustwei/comments/38725.html</wfw:comment><comments>http://www.cnitblog.com/hustwei/archive/2008/01/10/38725.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hustwei/comments/commentRss/38725.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hustwei/services/trackbacks/38725.html</trackback:ping><description><![CDATA[1.调试模块debug.h<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#ifndef&nbsp;_DEBUG_H<br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;_DEBUG_H</span><span style="color: #000000;"><br><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">linux</span><span style="color: #000000;">/</span><span style="color: #000000;">kernel.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">linux</span><span style="color: #000000;">/</span><span style="color: #000000;">types.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#if</span><span style="color: #000000;">&nbsp;defined(__KERNEL__)</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;PRINT&nbsp;printk</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#else</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;PRINT&nbsp;printf</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#if</span><span style="color: #000000;">&nbsp;!defined(CONFIG_ISCSI_DEBUG)</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_SET(mask)&nbsp;do&nbsp;{&nbsp;}&nbsp;while(0)</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_GET(mask)&nbsp;do&nbsp;{&nbsp;}&nbsp;while(0)</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_TEST(mask)&nbsp;(0)</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE(mask,&nbsp;args<img src="http://www.cnitblog.com/Images/dot.gif">)&nbsp;do&nbsp;{&nbsp;}&nbsp;while(0)</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_BUFFER(mask,&nbsp;buffer,&nbsp;len,&nbsp;args<img src="http://www.cnitblog.com/Images/dot.gif">)&nbsp;do&nbsp;{&nbsp;}&nbsp;while(0)</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#else</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_ENDING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0000</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_DEBUG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0001</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_ISCSI_FULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0002</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_ISCSI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0004</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_NET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0008</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_BUF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0010</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_SEM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0020</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_ENTER_LEAVE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0040</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_MY_MEMORY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0080</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_TIMERS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0100</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_ERROR_RECOVERY&nbsp;&nbsp;&nbsp;&nbsp;0x0200</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_VERBOSE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0400</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_ISER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0800</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_CHAP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x1000</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_SRP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x2000</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_TASK_MGT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x4000</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_VFS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x8000</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_ALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xffff</span><span style="color: #000000;"><br><br>#ifdef&nbsp;CONFIG_ISCSI_DEBUG<br><br></span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;__u32&nbsp;iscsi_trace_mask&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRACE_DEBUG&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;TRACE_ISCSI_FULL&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;TRACE_ISCSI&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;TRACE_NET&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">**&nbsp;TRACE_BUF&nbsp;|&nbsp;**</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">**&nbsp;TRACE_SEM&nbsp;|&nbsp;**</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">**&nbsp;TRACE_VFS&nbsp;|&nbsp;**</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRACE_ENTER_LEAVE&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">**&nbsp;TRACE_MY_MEMORY&nbsp;|&nbsp;**</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">**&nbsp;TRACE_TIMERS&nbsp;|&nbsp;**</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">**&nbsp;TRACE_ERROR_RECOVERY&nbsp;|&nbsp;**</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">**&nbsp;TRACE_ISER&nbsp;|&nbsp;**</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRACE_ENDING;<br><br></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_SET(mask)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iscsi_trace_mask&nbsp;=&nbsp;mask</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_GET(mask)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mask&nbsp;=&nbsp;iscsi_trace_mask</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_TEST(mask)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(iscsi_trace_mask&nbsp;&amp;&nbsp;(mask))</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE(mask,&nbsp;args<img src="http://www.cnitblog.com/Images/dot.gif">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">do</span><span style="color: #000000;">&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(iscsi_trace_mask&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;(mask))&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(iscsi_trace_mask&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;TRACE_VERBOSE)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT(</span><span style="color: #000000;">"</span><span style="color: #000000;">%s:%d:</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;__FUNCTION__,&nbsp;__LINE__);&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT(args);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_BUFFER(mask,&nbsp;buffer,&nbsp;len,&nbsp;args<img src="http://www.cnitblog.com/Images/dot.gif">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">do</span><span style="color: #000000;">&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(iscsi_trace_mask&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;(mask))&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;ndx;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT(args);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(ndx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;ndx&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;len;&nbsp;ndx</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;((ndx&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0xf</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT(</span><span style="color: #000000;">"</span><span style="color: #000000;">%3d:</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;ndx);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT(</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;%02x</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">((__u8&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)(buffer)</span><span style="color: #000000;">+</span><span style="color: #000000;">ndx));&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;((ndx&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0xf</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0xf</span><span style="color: #000000;">)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT(</span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;((ndx&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0xf</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT(</span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br><br></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_ERROR(args<img src="http://www.cnitblog.com/Images/dot.gif">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">do</span><span style="color: #000000;">&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT(</span><span style="color: #000000;">"</span><span style="color: #000000;">%s:%d:</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;__FUNCTION__,&nbsp;__LINE__);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT(__FILE__&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">:&nbsp;***ERROR***&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;args);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;TRACE_WARNING(args<img src="http://www.cnitblog.com/Images/dot.gif">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">do</span><span style="color: #000000;">&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINT(</span><span style="color: #000000;">"</span><span style="color: #000000;">***Warning***&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;args);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br><br></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"><br></span></div>
<br><br>2.信号量<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">asm</span><span style="color: #000000;">/</span><span style="color: #000000;">semaphore.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;semaphore&nbsp;my_mutex_t;<br><br>init_MUTEX_LOCKED(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">my_mutex_t);<br>init_MUTEX(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">my_mutex_t);<br>sema_init(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">my_mutex_t,&nbsp;count);&nbsp;<br><br>down(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">my_mutex_t);<br>down_interruptible(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">my_mutex_t);<br>down_trylock(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">my_mutex_t);<br><br>up(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">my_mutex_t);</span></div>
<br>3.链表<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">#include &lt;linux/list.h&gt;<br><br>struct</span><span style="color: #000000;">&nbsp;list_head&nbsp;cmd_queue;<br><br>INIT_LIST_HEAD&nbsp;(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">cmd_queue);<br><br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">(list_empty&nbsp;(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">cmd_queue))<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">。。。</span><span style="color: #008000;"><br></span><span style="color: #000000;">}<br><br>list_for_each_safe&nbsp;(lptr,&nbsp;next,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">cmd_queue)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">。。。</span><span style="color: #008000;"><br></span><span style="color: #000000;">}<br><br>list_del&nbsp;(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">cmd_queue</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">link);<br><br>list_add_tail&nbsp;(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">cmd</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">link,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">commands);<br></span><span style="color: #008000;">//</span><span style="color: #008000;">struct&nbsp;list_head&nbsp;commands;</span></div>
<br>    <img src ="http://www.cnitblog.com/hustwei/aggbug/38725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hustwei/" target="_blank">wei</a> 2008-01-10 22:43 <a href="http://www.cnitblog.com/hustwei/archive/2008/01/10/38725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]Network Programming in the Kernel</title><link>http://www.cnitblog.com/hustwei/archive/2007/12/21/37967.html</link><dc:creator>wei</dc:creator><author>wei</author><pubDate>Fri, 21 Dec 2007 13:18:00 GMT</pubDate><guid>http://www.cnitblog.com/hustwei/archive/2007/12/21/37967.html</guid><wfw:comment>http://www.cnitblog.com/hustwei/comments/37967.html</wfw:comment><comments>http://www.cnitblog.com/hustwei/archive/2007/12/21/37967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hustwei/comments/commentRss/37967.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hustwei/services/trackbacks/37967.html</trackback:ping><description><![CDATA[<div class="head">
<h3>Kernel Korner - Network Programming in the Kernel</h3>
<h4>August 26th, 2005 by <a  href="http://www.linuxjournal.com/user/800841" title="View user profile.">Pradeep Padala</a> and <a  href="http://www.linuxjournal.com/user/1001384" title="View user profile.">Ravi Parimi</a><span class="taxonomy"> in
<ul class="links inline">
    <li class="first last taxonomy_term_29"><a  href="http://www.linuxjournal.com/taxonomy/term/29" rel="tag" title="" class="taxonomy_term_29">Linux Journal</a></li>
</ul>
</span>    </h4>
</div>
<div class="content">
Take a tour of the kernel's networking functionality by writing a network client that runs in kernel space.
<div class="article" lang="en">
<div class="simplesect" lang="en">
<div class="titlepage"><a name="N0xa50890.0xb44d28"></a></div>
<p>
All Linux distributions provide a wide range of
network applications—from d&#230;mons that provide a
variety of services such as WWW, mail and SSH to
client programs that access one or more of these
services. These programs are written in user mode
and use the system calls provided by the kernel
to perform various operations like network read
and write. Although this is the traditional method of
writing programs, there is another interesting way
to develop these applications by implementing them
in the kernel. The TUX Web server is a good example of
an application that runs inside the kernel and serves
static content. In this article, we explain the basics
of writing network applications within the kernel and
their advantages and disadvantages. As an example, we
explain the implementation of an in-kernel FTP client.
</p>
</div>
<div class="simplesect" lang="en">
<div class="titlepage"><a name="N0xa50890.0xb44e30"></a>
Advantages and Disadvantages of In-Kernel Implementations</div>
<p>
Why would one want to implement applications within the kernel?
Here are a few advantages:
</p>
<div class="itemizedlist">
<ul type="disc">
    <li>
    <p>
    When a user-space program makes a system call, there is some
    overhead associated in the user-space/kernel-space transition. By
    programming all functionality in the kernel, we can make gains in performance.
    </p>
    </li>
    <li>
    <p>
    The data corresponding to any application that sends or receives
    packets is copied from user mode to kernel mode and
    vice versa. By implementing network applications within the
    kernel, it is possible to reduce such overhead and increase
    efficiency by not copying data to user mode.
    </p>
    </li>
    <li>
    <p>
    In specific research and high-performance computing
    environments, there is a need for achieving data transfers at
    great speeds. Kernel applications find use in such situations.
    </p>
    </li>
</ul>
</div>
<p>
On the other hand, in-kernel
implementations have certain disadvantages:
</p>
<div class="itemizedlist">
<ul type="disc">
    <li>
    <p>
    Security is a primary concern within the kernel, and a large class
    of user-mode applications are not suitable to be run directly in
    the kernel. Consequently, special care needs to be taken while
    designing in-kernel applications. For example, reading and writing
    to files within the kernel is usually a bad idea, but most
    applications require some kind of file I/O.
    </p>
    </li>
    <li>
    <p>
    Large applications cannot be implemented in the kernel due to
    memory constraints.
    </p>
    </li>
</ul>
</div>
</div>
<div class="simplesect" lang="en">
<div class="titlepage"><a name="N0xa50890.0xb453b0"></a>
Network Programming Basics</div>
<p>
Network programming is usually done with sockets. A socket serves as a
communication end point between two processes. In this article, we
describe network programming with TCP/IP sockets.
</p>
<p>
Server programs create sockets, bind to well-known ports, listen and
accept connections from clients. Servers are usually designed to accept
multiple connections from clients—they either fork a new process to
serve each client request (concurrent servers) or completely serve one
request before accepting more connections (iterative servers). Client
programs, on the other hand, create sockets to connect to servers and
exchange information.
</p>
</div>
<div class="simplesect" lang="en">
<div class="titlepage"><a name="N0xa50890.0xb45510"></a>
FTP Client-Server Interaction</div>
<p>
Let's take a quick look at how an FTP client and
server are implemented in user mode. We discuss
only active FTP in this article. The differences between
active and passive FTP are not relevant to our
discussion of network programming here.
</p>
</div>
<div class="simplesect" lang="en">
<div class="titlepage"><a name="N0xa50890.0xb45618"></a>Socket Programming Basics</div>
<p>
Here is a brief explanation of the design of an FTP client and server.
The server program creates a socket using the
<tt>socket()</tt> system call.
It then binds on a well-known port using <tt>bind()</tt> and waits for
connections from clients using the <tt>listen()</tt> system call. The server
then accepts incoming requests from clients using
<tt>accept()</tt> and forks a
new process (or thread) to serve each incoming client request.
</p>
<p>
The client program creates a control socket using
<tt>socket()</tt> and next
calls <tt>connect()</tt> to establish a connection with the server. It then
creates a separate socket for data transfer using
<tt>socket()</tt> and binds
to an unprivileged port (&gt;1024) using <tt>bind()</tt>. The
client now <tt>listen()</tt>s
on this port for data transfer from the server. The server now has
enough knowledge to honor a data transfer request from the client.
Finally, the client uses <tt>accept()</tt> to accept connections from the
server to send and receive data. For sending and receiving data, the client
and server use the <tt>write()</tt> and
<tt>read()</tt> or <tt>sendmsg()</tt> and
<tt>recvmsg()</tt>
system calls. The client issues <tt>close()</tt> on all open sockets to tear
down its connection to the server. Figure 1 sums it up.
</p>
<div class="mediaobject"><a  href="http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/076/7660/7660f1.png"><img  src="http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/076/7660/7660f1.inline.png"></a>
<div class="caption">
<p>
Figure 1. The FTP protocol uses two sockets: one for control messages and
one for data.
</p>
</div>
</div>
</div>
<div class="simplesect" lang="en">
<div class="titlepage"><a name="N0xa50890.0xb45e58"></a>
FTP Commands</div>
<p>
Here is a list of a few the FTP commands we used.
Because our program provides only a basic implementation
of the protocol, we discuss only the relevant
commands:
</p>
<div class="itemizedlist">
<ul type="disc">
    <li>
    <p>
    The client sends a <tt>USER &lt;username&gt;\r\n</tt> command to the server to
    begin the authentication process.
    </p>
    </li>
    <li>
    <p>
    To send the password, the client uses <tt>PASS
    password\r\n'</tt>.
    </p>
    </li>
    <li>
    <p>
    In some cases, the client sends a PORT command to inform the
    server of its preferred port for data transfer. In such cases, the
    client sends <tt>PORT &lt;a1,a2,a3,a4,p1,p2&gt;\r\n</tt>. The RFC for FTP
    requires that the a1&#8211;a4 constitute the 32-bit IP address of the
    client, and p1&#8211;p2 constitute the 16-bit port number. For example, if
    the client's IP address is 10.10.1.2 and it chooses port 12001 for
    data transfer, the client sends <tt>PORT
    10,10,1,2,46,225</tt>.
    </p>
    </li>
    <li>
    <p>
    Some FTP clients request, by default, that data be transferred in
    binary format, while others explicitly ask the server to enable
    data transfer in binary mode. Such clients send a <tt>TYPE
    I\r\n</tt>
    command to the server to request this.
    </p>
    </li>
</ul>
</div>
<p>
Figure 2 is a diagram that shows a few FTP commands and their
responses from the server.
</p>
<div class="mediaobject"><a  href="http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/076/7660/7660f2.png"><img  src="http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/076/7660/7660f2.inline.png"></a>
<div class="caption">
<p>
Figure 2. The client issues FTP commands over the
control connection to set up the file transfer.
</p>
</div>
</div>
</div>
<div class="simplesect" lang="en">
<div class="titlepage"><a name="N0xa50890.0xb3cf90"></a>
Socket Programming in the Kernel</div>
<p>
Writing programs in the kernel is different from doing the same in
user space.
</p>
<p>
We explain a few issues concerned with writing a network application in
the kernel. Refer to Greg Kroah-Hartman's article &#8220;Things You Never
Should Do in the Kernel&#8221; (see the on-line Resources). First, let's examine how a
system call in user space completes its task. For example, look at the
<tt>socket()</tt> system call:
</p>
<pre class="programlisting">sockfd = socket(AF_INET,SOCK_STREAM,0);<br></pre>
<p>
When a program executes a system call, it traps into
the kernel via an interrupt and hands over control
to the kernel. Among other things, the kernel
performs various tasks, such as saving contents
of registers, making changes to address space
boundaries and checking for errors with system call
parameters. Eventually, the <tt>sys_socket()</tt> function in
the kernel is responsible for creating the socket of
specified address and family type, finding an unused
file descriptor and returning this number back to
user space. Browsing through the kernel's code
we can trace the path followed by this function (Figure 3).
</p>
<div class="mediaobject"><a  href="http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/076/7660/7660f3.png"><img  src="http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/076/7660/7660f3.inline.png"></a>
<div class="caption">
<p>
Figure 3. Behind the scenes of a system call: when
user space executes socket(), the kernel does necessary
housekeeping and then returns a new file descriptor.
</p>
</div>
</div>
</div>
<div class="simplesect" lang="en">
<div class="titlepage"><a name="N0xa50890.0xb3d460"></a>
Design of an FTP Client</div>
<p>
We now explain the design and implementation of
a kernel FTP client. Please follow through the code
available at the <em>Linux Journal</em> FTP site (see
Resources) as you read through
the article. The main functionality of this client
is written in the form of a kernel module that adds a
system call dynamically that user-space programs can
invoke to start the FTP client process. The module
allows only the root user to read a file using FTP.
The user-space program that calls the system call in
this module should be used with extreme caution. For
example, it is easy to imagine the catastrophic
results when root runs:
</p>
<pre class="programlisting">./a.out 10.0.0.1 10.0.0.2 foo_file /dev/hda1/*<br></pre>
</div>
<div class="simplesect" lang="en">
<div class="titlepage"><a name="N0xa50890.0xb3d618"></a></div>
<p>
and overwrites /dev/hda1 with a downloaded file
from 10.0.0.1.
</p>
</div>
<div class="simplesect" lang="en">
<div class="titlepage"><a name="N0xa50890.0xb3d720"></a>
Exporting sys_call_table</div>
<p>
We first need to configure the Linux kernel to allow us to add new system
calls via a kernel module dynamically. Starting with version 2.6, the symbol
<tt>sys_call_table</tt> is no longer exported by the kernel. For our module to
be able to add a system call dynamically, we need to add the following
lines to arch/i386/kernel/i386_ksyms.c in the kernel source (assuming
you are using a Pentium-class machine):
</p>
<pre class="programlisting">extern void *sys_call_table;<br>EXPORT_SYMBOL(sys_call_table);<br></pre>
<p>
After recompiling the kernel and
booting the machine into it, we are all set to run the FTP client. Refer
to the Kernel Rebuild HOWTO (see Resources) for details on compiling a kernel.
</p>
</div>
<div class="simplesect" lang="en">
<div class="titlepage"><a name="N0xa50890.0xb3d930"></a>
Module Basics</div>
<p>
Let's examine the code for the module first. In the code
snippets in the article, we omit error-checking and other irrelevant
details for clarity. The complete code is available from the
<em>LJ</em> FTP site (see Resources):
</p>
<pre class="programlisting">#include &lt;linux/init.h&gt;<br>#include &lt;linux/module.h&gt;<br>#include &lt;linux/kernel.h&gt;<br><br>/* For socket etc */<br>#include &lt;linux/net.h&gt;<br>#include &lt;net/sock.h&gt;<br>#include &lt;linux/tcp.h&gt;<br>#include &lt;linux/in.h&gt;<br>#include &lt;asm/uaccess.h&gt;<br>#include &lt;linux/file.h&gt;<br>#include &lt;linux/socket.h&gt;<br>#include &lt;linux/smp_lock.h&gt;<br>#include &lt;linux/slab.h&gt;<br><br>...<br><br>int ftp_init(void)<br>{<br><br>    printk(KERN_INFO FTP_STRING<br>    "Starting ftp client module\n");<br>    sys_call_table[SYSCALL_NUM] = my_sys_call;<br>    return 0;<br>}<br><br>void ftp_exit(void)<br>{<br>    printk(KERN_INFO FTP_STRING<br>    "Cleaning up ftp client module, bye !\n");<br>    sys_call_table[SYSCALL_NUM] = sys_ni_syscall;<br>}<br><br>...<br><br></pre>
<p>
The program begins with the customary include directives. Notable among
the header files are linux/kernel.h for KERN_ALERT and linux/slab.h, which
contains definitions for kmalloc() and linux/smp_lock.h that define
kernel-locking routines. System calls are handled in the
kernel by functions with the same names in user space but are prefixed with
<tt>sys_</tt>. For example, the
<tt>sys_socket</tt> function in the kernel handles the
task of the <tt>socket()</tt> system call. In this module, we are using system
call number 223 for our new system call. This method is
not foolproof and will not work on SMP machines. Upon unloading the
module, we unregister our system call.
</p>
</div>
<div class="simplesect" lang="en">
<div class="titlepage"><a name="N0xa50890.0xb3dc48"></a>
The System Call</div>
<p>
The workhorse of the module is the new system call that performs an FTP
read. The system call takes a structure as a parameter. The structure is
self-explanatory and is given below:
</p>
<pre class="programlisting">struct params {<br>    /* Destination IP address */<br>    unsigned char destip[4];<br>    /* Source IP address */<br>    unsigned char srcip[4];<br>    /* Source file - file to be downloaded from<br>       the server */<br>    char src[64];<br>    /* Destination file - local file where the<br>       downloaded file is copied */<br>    char dst[64];<br>    char user[16]; /* Username */<br>    char pass[64]; /* Password */<br>};<br></pre>
<p>
The system call is given below. We explain the relevant details in next
few paragraphs:
</p>
<pre class="programlisting">asmlinkage int my_sys_call<br>(struct params __user *pm)<br>{<br>    struct sockaddr_in saddr, daddr;<br>    struct socket *control= NULL;<br>    struct socket *data = NULL;<br>    struct socket *new_sock = NULL;<br><br>    int r = -1;<br>    char *response = kmalloc(SNDBUF, GFP_KERNEL);<br>    char *reply = kmalloc(RCVBUF, GFP_KERNEL);<br><br>    struct params pmk;<br><br>    if(unlikely(!access_ok(VERIFY_READ,<br>                 pm, sizeof(pm))))<br>        return -EFAULT;<br>    if(copy_from_user(&amp;pmk, pm,<br>       sizeof(struct params)))<br>        return -EFAULT;<br>    if(current-&gt;uid != 0)<br>        return r;<br><br>    r = sock_create(PF_INET, SOCK_STREAM,<br>                    IPPROTO_TCP, &amp;control);<br><br>    memset(&amp;servaddr,0, sizeof(servaddr));<br>    servaddr.sin_family = AF_INET;<br>    servaddr.sin_port = htons(PORT);<br>    servaddr.sin_addr.s_addr =<br>        htonl(create_address(128, 196, 40, 225));<br><br>    r = control-&gt;ops-&gt;connect(control,<br>             (struct sockaddr *) &amp;servaddr,<br>             sizeof(servaddr), O_RDWR);<br>    read_response(control, response);<br>    sprintf(temp, "USER %s\r\n", pmk.user);<br>    send_reply(control, temp);<br>    read_response(control, response);<br>    sprintf(temp, "PASS %s\r\n", pmk.pass);<br>    send_reply(control, temp);<br>    read_response(control, response);<br><br></pre>
<p>
We start out by declaring pointers to a few <tt>socket</tt> structures.
<tt>kmalloc()</tt> is the kernel equivalent of
<tt>malloc()</tt> and is used to
allocate memory for our character array. The array's response and reply
will contain the responses to and replies from the server.
</p>
<p>
The first step is to read the parameters from user mode to kernel
mode. This is customarily done with <tt>access_ok</tt> and
<tt>verify_read/verify_write</tt> calls.
<tt>access_ok</tt> checks whether the user-space pointer is valid to be referenced.
<tt>verify_read</tt> is used to read
data from user mode. For reading simple variables like
<tt>char</tt> and
<tt>int</tt>, use <tt>__get_user</tt>.
</p>
<p>
Now that we have the user-specified parameters, the next
step is to create a control socket and establish
a connection with the FTP server. <tt>sock_create()</tt>
does this for us—its arguments are similar to
those we pass to the user-level <tt>socket()</tt> system
call. The <tt>struct sockaddr_in</tt> variable
<tt>servaddr</tt>
is now filled in with all the necessary information—address family, destination port and IP address of
the server. Each <tt>socket</tt> structure has a member
that is a pointer to a structure of type <tt>struct
proto_ops</tt>. This structure contains a list of
function pointers to all the operations that can
be performed on a socket. We use the <tt>connect()</tt>
function of this structure to establish a connection
to the server. Our functions <tt>read_response()</tt> and
<tt>send_reply()</tt> transfer data between the client and
server (these functions are explained later):
</p>
<pre class="programlisting">r = sock_create(PF_INET, SOCK_STREAM,<br>                IPPROTO_TCP, &amp;data);<br>memset(&amp;claddr,0, sizeof(claddr));<br>claddr.sin_family = AF_INET;<br>claddr.sin_port = htons(EPH_PORT);<br>clddr.sin_addr.s_addr= htonl(<br>                       create_address(srcip));<br>r = data-&gt;ops-&gt;bind(data,<br>         (struct sockaddr *)&amp;claddr,<br>         sizeof (claddr));<br>r = data-&gt;ops-&gt;listen(data, 1);<br><br></pre>
<p>
Now, a data socket is created to transfer data between the client and
server. We fill in another <tt>struct sockaddr_in</tt>
variable <tt>claddr</tt> with
information about the client—protocol family, local unprivileged port
that our client would bind to and, of course, the IP address. Next, the
socket is bound to the ephemeral port EPH_PORT. The function
<tt>listen()</tt>
lets the kernel know that this socket can accept incoming connections:
</p>
<pre class="programlisting">a = (char *)&amp;claddr.sin_addr;<br>p = (char *)&amp;claddr.sin_port;<br><br>send_reply(control, reply);<br>read_response(control, response);<br><br>strcpy(reply, "RETR ");<br>strcat(reply, src);<br>strcat(reply, "\r\n");<br><br>send_reply(control, reply);<br>read_response(control, response);<br><br></pre>
<p>
As explained previously, a PORT command is issued to the FTP server to let it
know the port for data transfer. This command is sent over
the control socket and not over the data socket:
</p>
<pre class="programlisting">new_sock = sock_alloc();<br>new_sock-&gt;type = data-&gt;type;<br>new_sock-&gt;ops = data-&gt;ops;<br><br>r = data-&gt;ops-&gt;accept(data, new_sock, 0);<br>new_sock-&gt;ops-&gt;getname(new_sock,<br>    (struct sockaddr *)address, &amp;len, 2);<br><br></pre>
<p>
Now, the client is ready to accept data from the server. We create a new
socket and assign it the same <tt>type</tt> and
<tt>ops</tt> as our data socket. The
<tt>accept()</tt> function pulls the first pending connection in the listen
queue and creates a new socket with the same connection properties as
<tt>data</tt>. The new socket thus created handles all data transfer between
the client and server. The <tt>getname()</tt> function gets the address at the
other end of the socket. The last three lines in the above segment of
code are useful only for printing information about the server:
</p>
<pre class="programlisting">if((total_written = write_to_file(pmk.dst,<br>            new_sock, response)) &lt; 0)<br>    goto err3;<br><br></pre>
<p>
The function <tt>write_to_file</tt> deals with opening a file
in the kernel and writing data from the socket back
into the file. Writing to sockets works like this:
</p>
<pre class="programlisting">void send_reply(struct socket *sock, char *str)<br>{<br>    send_sync_buf(sock, str, strlen(str),<br>                  MSG_DONTWAIT);<br>}<br><br><br>int send_sync_buf<br>(struct socket *sock, const char *buf,<br> const size_t length, unsigned long flags)<br>{<br>    struct msghdr msg;<br>    struct iovec iov;<br>    int len, written = 0, left = length;<br>    mm_segment_t oldmm;<br><br>    msg.msg_name     = 0;<br>    msg.msg_namelen  = 0;<br>    msg.msg_iov      = &amp;iov;<br>    msg.msg_iovlen   = 1;<br>    msg.msg_control  = NULL;<br>    msg.msg_controllen = 0;<br>    msg.msg_flags    = flags;<br><br>    oldmm = get_fs(); set_fs(KERNEL_DS);<br><br>repeat_send:<br>    msg.msg_iov-&gt;iov_len = left;<br>    msg.msg_iov-&gt;iov_base = (char *) buf +<br>                                written;<br><br>    len = <span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">sock_sendmsg</span>(sock, &amp;msg, left);<br>    ...<br>    return written ? written : len;<br>}<br><br></pre>
<p>
The <tt>send_reply()</tt> function calls
<tt>send_sync_buf()</tt>, which does the real
job of sending the message by calling
<tt><span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">sock_sendmsg</span>()</tt>. The function
<tt><span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">sock_sendmsg</span>()</tt> takes a pointer to
<tt>struct socket</tt>, the message to be sent
and the message length. The message is represented by the struture
<tt>msghdr</tt>. One of the important members of this
structure is <tt>iov</tt> (io
vector). The iovector has two members, <tt>iov_base</tt>
and <tt>iov_len</tt>:
</p>
<pre class="programlisting">struct iovec<br>{<br>    /* Should point to message buffer */<br>    void *iov_base;<br>    /* Message length */<br>    __kernel_size_t iov_len;<br>};<br></pre>
<p>
These members are filled with appropriate values, and
<tt><span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">sock_sendmsg</span>()</tt> is
called to send the message.
</p>
<p>
The macro <tt>set_fs</tt> is used to set the FS register to point to the
kernel data segment. This allows <tt><span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">sock_sendmsg</span>()</tt> to find the data in the
kernel data segment instead of the user-space data segment. The macro
<tt>get_fs</tt> saves the old value of FS. After a call to
<tt><span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">sock_sendmsg</span>()</tt>, the saved value of FS is restored.
</p>
<p>
Reading from the socket works similarly:
</p>
<pre class="programlisting">int read_response(struct socket *sock, char *str)<br>{<br>        ...<br>        len = sock_recvmsg(sock, &amp;msg,<br>                max_size, 0);<br>        ...<br>        return len;<br>}<br><br></pre>
<p>
The <tt>read_response()</tt> function is similar to
<tt>send_reply()</tt>. After
filling the <tt>msghdr</tt> structure appropriately, it uses
<tt>sock_recvmsg()</tt>
to read data from a socket and returns the number of bytes read.
</p>
</div>
<div class="simplesect" lang="en">
<div class="titlepage"><a name="N0xa50890.0x102eac0"></a>
A User-Space Program</div>
<p>
Now, let's take a look at a user-space program that
invokes our system call to transfer a file. We explain
the relevant details for calling a new system call:
</p>
<pre class="programlisting">...<br>#define __NR_my_sys_call 223<br>_syscall1(long long int, my_sys_call,<br>          struct params *, p);<br><br>int main(int argc, char **argv)<br>{<br>  struct params pm;<br>  /* fill pm with appropriate values */<br>  ...<br>  r =  my_sys_call(&amp;pm);<br>  ...<br>}<br><br></pre>
<p>
<tt>#define __NR_my_sys_call 223</tt> assigns a number to our system call.
<tt>_syscall1()</tt> is a macro that creates a stub for the system call. It
shows the type and number of arguments that our system call expects.
With this in place, <tt>my_sys_call</tt> can be invoked
just like any other
system call. Upon running the program, with correct values for the
source and destination files, a file from a remote FTP server is
downloaded onto the client machine. Here is a transcript of a sample run:
</p>
<pre class="programlisting"># make<br>make -C /lib/modules/2.6.9/build SUBDIRS=/home/ppadala/ftp modules<br>make[1]: Entering directory `/home/ppadala/linux-2.6.9'<br>  CC [M]  /home/ppadala/ftp/ftp.o<br>  Building modules, stage 2.<br>  MODPOST<br>  CC      /home/ppadala/ftp/ftp.mod.o<br>  LD [M]  /home/ppadala/ftp/ftp.ko<br>make[1]: Leaving directory `/home/ppadala/linux-2.6.9'<br># gcc do_ftp.c<br># ./a.out &lt;local host's IP address&gt; 152.2.210.80 /README /tmp/README anonymous anon@cs.edu<br>Connection from 152.2.210.80<br>return = 215 (length of file copied)<br><br></pre>
</div>
<div class="simplesect" lang="en">
<div class="titlepage"><a name="N0xa50890.0x102edd8"></a>
Conclusions</div>
<p>
We have seen a basic implementation of an FTP client within the kernel.
This article explains various issues of socket programming in the
kernel. Interested readers can follow these ideas to write various
network applications, such as an HTTP client or even a Web
server in the kernel. Kernel applications, such as the TUX Web server are
used for high-performance content serving and are well suited for
environments that demand data transfer at high rates. Careful attention
has to be paid to the design, implementation and security issues of such
applications.
</p>
<p><span class="bold"><strong>Resources for this article:</strong></span>
<a  href="http://www.linuxjournal.com/article/8453">/article/8453</a>.
</p>
</div>
</div>
<div class="authorblurb">
<p>
Pradeep Padala is a PhD student at the University of Michigan. His
general
interests are in distributed systems with specific emphasis on scheduling
and fault tolerance. He is the author of the NCurses Programming HOWTO
and contributes to various open-source projects. More about him can be
found on his Web site at <a  href="http://www.eecs.umich.edu/%7Eppadala">www.eecs.umich.edu/~ppadala</a>.
</p>
<p>
Ravi Parimi has a Master's degree in Computer Engineering and currently
works in Silicon Valley, California. His main interests are in
operating systems, networking and Internet security. He has been using
Linux since 1998 and aspires to be a kernel hacker. In his free time,
he pursues Vedic studies and Chess.
</p>
</div>
</div><img src ="http://www.cnitblog.com/hustwei/aggbug/37967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hustwei/" target="_blank">wei</a> 2007-12-21 21:18 <a href="http://www.cnitblog.com/hustwei/archive/2007/12/21/37967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu中安装的几个重要软件</title><link>http://www.cnitblog.com/hustwei/archive/2007/12/21/37952.html</link><dc:creator>wei</dc:creator><author>wei</author><pubDate>Fri, 21 Dec 2007 02:48:00 GMT</pubDate><guid>http://www.cnitblog.com/hustwei/archive/2007/12/21/37952.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cnitblog.com/hustwei/archive/2007/12/21/37952.html'>阅读全文</a><img src ="http://www.cnitblog.com/hustwei/aggbug/37952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hustwei/" target="_blank">wei</a> 2007-12-21 10:48 <a href="http://www.cnitblog.com/hustwei/archive/2007/12/21/37952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]firefox中的baidu搜索引擎插件</title><link>http://www.cnitblog.com/hustwei/archive/2007/12/19/37904.html</link><dc:creator>wei</dc:creator><author>wei</author><pubDate>Wed, 19 Dec 2007 08:32:00 GMT</pubDate><guid>http://www.cnitblog.com/hustwei/archive/2007/12/19/37904.html</guid><wfw:comment>http://www.cnitblog.com/hustwei/comments/37904.html</wfw:comment><comments>http://www.cnitblog.com/hustwei/archive/2007/12/19/37904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hustwei/comments/commentRss/37904.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hustwei/services/trackbacks/37904.html</trackback:ping><description><![CDATA[baidu.xml,&nbsp;&nbsp;&nbsp; /usr/share/firefox/searchplugins
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">SearchPlugin&nbsp;</span><span style="color: #ff0000;">xmlns</span><span style="color: #0000ff;">="http://www.mozilla.org/2007/browser/search/"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ShortName</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Baidu</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">ShortName</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Description</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Baidu&nbsp;Web&nbsp;page&nbsp;search</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Description</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">InputEncoding</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">gb2312</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">InputEncoding</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Image&nbsp;</span><span style="color: #ff0000;">width</span><span style="color: #0000ff;">="16"</span><span style="color: #ff0000;">&nbsp;height</span><span style="color: #0000ff;">="16"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">data:image/x-icon;base64,AAABAAIAEBAAAAEACABoBQAAJgAAABAQAAABACAAaAQAAI4FAAAoAAAAEAAAACAAAAABAAgAAAAAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAL8UFQCYMwAAmjQAAJ06AAChPQAAuSQaANkOGQDBFBQAwBIeAMAfHwDaEBoA2hMdAMARIwDEHiwA2xYgANoYIgDbGiQA2x4nANwcJgDbHigAwyUlAMMsKwDcJSoA3SMtAN0kLQDeKzQA3i82AMUzMADBOTYAxDA8AN4wNwDfMDkA3zU9AKNBAAClQwAApkQAAKhHAACqSQAArU0AAK9QAACyVAAAtFcAALhaAAC5XgAAvWEAAL9lAADCaAAAxGsAAMZuAADIcgAAy3QAAM12AADPeQAA0HoAANJ+AADEOkMA4DpBAOE+RgDCRUYAzUpHAM1LSwDQQlEA0E9VAMJTUwDNU1IAx19aANFXVADQWFgA4UFHAOJESwDiRk0A4klQAOJNUgDjS1QA41FYAORTWQDkV10A5VpgAOVeZQDUbWsA2HJvAMx2dgDFf38A13F0ANR3fQDbfHoA5WBnAOZjaQDnZmwA52tvAOdscQDpcXYA6XR4ANOAAADVggAA336BAOp8ggDUgoAA3YaEAN2IhwDqgYYA7IeLAOuJjQDtj5MA7ZKWAOGWmADmo6AA56ilAOelqwDlqaoA6q6rAPCipgDwpaoA8amsAPGsrgDus64A6K2zAOe2tgDqubQA87K1APS9wADrxsQA7MvIAPbIygDxzs4A/8zMAPXRxAD11MkA+NbLAPfS0wDz1NAA+NHTAPjS1AD41NUA9NjWAPbf3AD42doA+dvdAPnd3gD+6dQA/u3bAPrg4QD75ucA/u/hAPvo6QD87+gA/O7vAP7y5gD68+wA/ff3AP748gD++vYA/vf4AP75+QD//v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////ACEhISEhISEhISEhISEhISEh//////////////////8hIf//jlk6SmhoORpXkf//ISH//2UHCwsHBwsLEXD//yEh//9hDw8RDxERDxh5//8hIf//hUYREQ8RDxlOi///ISH//5aLShERDxFLi3n//yEh//9yaYtGFBhNi0pKi/8hIf98IUp4i1lai2YaEXz/ISH/cREhhf+W//+LTU2O/yEh/45OWf9nhf9ycnyO//8hIf//k/9cIU58IUV8////ISH/////XBhOiyFHi////yEh/////4llgv+Li/////8hIf//////////////////ISEhISEhISEhISEhISEhISEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAABAAAAAgAAAAAQAgAAAAAABABAAAAAAAAAAAAAAAAAAAAAAAALhbAP+0VwD/slQA/69RAP+tTgD/q0oA/6hHAP+mRAD/o0IA/6I+AP+gPAD/njoA/5w4AP+bNgD/mjQA/5gzAP+6XgD////////////////+////zP///8b////G////xv///8b////G////xv///8z///////////////+aNQD/vWEA////////////+uDh/+dlbP/hPkb/40tU/+2Pk//tj5P/4DtD/94rNP/lYGf/++jp////////////mzYA/79lAP////////7+/+uBh/7aDxn+2hAa/9oQG/7ZDhn+2g8Z/9oTHv7aEx3+2xkj//Cipv7//////////504AP/CaAD////////+/v/qfIL+2xYg/tsXIf/bGCL/2xgi/9sYIv/bGCL/2xYg/t0jLf/0vcD+//////////+eOwD/xGsA////////////+NLU/+JES//cHCb/2xgi/9sYIv/bGCL/2xgi/90lL//lWmH/+dzd////////////oD0A/8dvAP////////////339//5293/4khQ/9seKP7bGCL/2xgi/9sYIv/jUFj++dvd//S+wf7//v///////6NAAP/JcwD////////8/P/xqaz+7ZKW/vnb3f/iR0/+2x4n/t0kLP/kV13++dvd/+JOU//iSlH++d7f/v////+lQwD/zHUA///////2yMr/3zQ8/+NMUv/zsrX/+dvd/+Zjaf/nbHH/+dvd/+yHi//eMDf/2xok//bIy/7/////qEcA/853AP//////8KWq/9oYIf7fNz7+//////nb3f/+9/j////////////5293/5FNZ/+NSWf775uf//////6pJAP/QegD///////rg4f/lXmT+52ds/vGsrv/mX2b/7ZKW///////tkpb/7ZKW//bIy//64eL///////////+tTQD/0n0A/////////////O7v///////pcXb/3zA5/+ZfZv/2yMv/3i82/+FBR//2yMv/////////////////r1AA/9N/AP/////////////////++fn/6XR4/9wlKv7lW2D++dvd/+A6QP7iRkz++dvd/////////////////7JUAP/VgQD///////////////////////jZ2v7qgYX+99LT/v/////42tv++dvd/v////////////////////+0VwD/1oMA////////////////////////////////////////////////////////////////////////////uFoA/9aDAP/WgwD/1YEA/9OAAP/TfgD/0HsA/895AP/NdgD/y3QA/8hxAP/GbQD/xGsA/8JoAP+/ZQD/vWEA/7leAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Image</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Url&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/html"</span><span style="color: #ff0000;">&nbsp;method</span><span style="color: #0000ff;">="GET"</span><span style="color: #ff0000;">&nbsp;template</span><span style="color: #0000ff;">="http://www.baidu.com/s"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="wd"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="{searchTerms}"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="cl"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="3"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Url</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">SearchForm</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">http://www.baidu.com</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">SearchForm</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">SearchPlugin</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span></div>
本来自己做的，图标做的不好，直接把别人的搬过来了.<br>重启firefox即可<br><br><img src ="http://www.cnitblog.com/hustwei/aggbug/37904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hustwei/" target="_blank">wei</a> 2007-12-19 16:32 <a href="http://www.cnitblog.com/hustwei/archive/2007/12/19/37904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>［原］实用shell脚本（不定期更新中）</title><link>http://www.cnitblog.com/hustwei/archive/2007/12/18/37814.html</link><dc:creator>wei</dc:creator><author>wei</author><pubDate>Tue, 18 Dec 2007 01:57:00 GMT</pubDate><guid>http://www.cnitblog.com/hustwei/archive/2007/12/18/37814.html</guid><wfw:comment>http://www.cnitblog.com/hustwei/comments/37814.html</wfw:comment><comments>http://www.cnitblog.com/hustwei/archive/2007/12/18/37814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hustwei/comments/commentRss/37814.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hustwei/services/trackbacks/37814.html</trackback:ping><description><![CDATA[<br>1.防止在错误的计算机中运行<br>ssh远程调试中经常在2个或多个计算机中切换，特别是vmware共享文件夹启用后，2个计算机都可对其操作，而有些脚本只能在特定的这个计算机上运行，如清除日志，打包，解压，删除文件等。一旦在错误的机器上运行，很可能把重要的文件删掉而造成无法挽回的后果。<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">#</span><span style="color: #008000;">!/bin/bash</span><span style="color: #008000;"><br></span><span style="color: #000000;">s</span><span style="color: #000000;">=</span><span style="color: #000000;">`uname&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">n`<br>echo&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">s=$s</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>host</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">zhangwei-desktop</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>echo&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">host=$host</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;[&nbsp;</span><span style="color: #800080;">$s</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">$host</span><span style="color: #000000;">&nbsp;]<br>then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">Please&nbsp;run&nbsp;the&nbsp;script&nbsp;in&nbsp;$host</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">exit</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">1</span><span style="color: #000000;"><br>fi<br>rm&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">f&nbsp;cscope</span><span style="color: #000000;">.</span><span style="color: #000000;">files<br>rm&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">f&nbsp;tags<br>rm&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">f&nbsp;cscope</span><span style="color: #000000;">.</span><span style="color: #000000;">out<br><br></span><span style="color: #008000;">#</span><span style="color: #008000;">cscope:</span><span style="color: #008000;"><br></span><span style="color: #000000;">find&nbsp;</span><span style="color: #000000;">.</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">name&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">*.[csh]</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;cscope</span><span style="color: #000000;">.</span><span style="color: #000000;">files<br>cscope&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">b<br><br></span><span style="color: #008000;">#</span><span style="color: #008000;">tags:&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;">ctags&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">R&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">I&nbsp;EXPORT_SYMBOL&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">I&nbsp;MODULE_VERSION&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">I&nbsp;MODULE_AUTHOR&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">I&nbsp;MODULE_DESCRIPTION&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">I&nbsp;MODULE_SUPPORTED_DEVICE&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">I&nbsp;MODULE_LICENSE&nbsp;</span><span style="color: #000000;">\</span><span style="color: #000000;"><br></span></div>
<br>2.自定义kill脚本<br>使用kill －9 需要知道进程id，mykill脚本只需要给出程序名的一部分即可<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">#</span><span style="color: #008000;">!/bin/bash</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;i&nbsp;in&nbsp;$(&nbsp;ps&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">A&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">grep</span><span style="color: #000000;">&nbsp;$</span><span style="color: #800000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;awk&nbsp;</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;">{&nbsp;print&nbsp;$1&nbsp;}</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000;">&nbsp;)<br></span><span style="color: #0000ff;">do</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">kill&nbsp;process&nbsp;*$1*&nbsp;,&nbsp;id:&nbsp;$i&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">kill</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #800000;">9</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">$i</span><span style="color: #000000;"><br>done<br></span></div>
<br>3.ftp上传脚本<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">#</span><span style="color: #008000;">!/bin/bash</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>IP_ADDRESS</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">192.168.83.1</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>HOSTNAME</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">RD-OBS</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>REMOTE_PATH</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">/usr/obs/hustosd_zw/</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>USERNAME</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">*****</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>PASSWORD</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">*****</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br><br>ftp&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">in&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #0000ff;">EOF</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">open</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">$IP_ADDRESS</span><span style="color: #000000;"><br>user&nbsp;</span><span style="color: #800080;">$USERNAME</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">$PASSWORD</span><span style="color: #000000;"><br>binary<br>cd&nbsp;</span><span style="color: #800080;">$REMOTE_PATH</span><span style="color: #000000;"><br>put&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">src.tar.gz</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>bye<br></span><span style="color: #0000ff;">EOF</span><span style="color: #000000;"><br></span></div>
<br><br>4.源码行数统计脚本<br>（非递归）<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">#</span><span style="color: #008000;">!/bin/bash</span><span style="color: #008000;"></span><span style="color: #000000;"></span><span style="color: #000000;"></span><span style="color: #000000;"><br>w</span><span style="color: #000000;">=</span><span style="color: #800000;">0</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;s&nbsp;in&nbsp;$(&nbsp;find </span><span style="color: #800080;">.</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">name&nbsp;</span><span style="color: #000000;">*.</span><span style="color: #000000;">[hc]&nbsp;)<br></span><span style="color: #0000ff;">do</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t</span><span style="color: #000000;">=</span><span style="color: #000000;">$(&nbsp;wc&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">l&nbsp;</span><span style="color: #800080;">$s</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;awk&nbsp;</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;">{print&nbsp;$1}</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000;">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">w=w+t</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>done<br>echo&nbsp;</span><span style="color: #800080;">$w</span></div>
（递归）
<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">#</span><span style="color: #008000;">!/bin/bash</span><span style="color: #008000;"><br></span><span style="color: #000000;">f()<br>{<br>w</span><span style="color: #000000;">=</span><span style="color: #800000;">0</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;s&nbsp;in&nbsp;$(&nbsp;ls&nbsp;$</span><span style="color: #800000;">1</span><span style="color: #000000;">&nbsp;)<br></span><span style="color: #0000ff;">do</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;[&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">f&nbsp;$</span><span style="color: #800000;">1</span><span style="color: #000000;">&nbsp;]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">w+=$(wc&nbsp;-l&nbsp;&lt;$1)</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st</span><span style="color: #000000;">=</span><span style="color: #000000;">${s</span><span style="color: #000000;">%/*</span><span style="color: #000000;">}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;[&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">d&nbsp;$</span><span style="color: #800000;">1</span><span style="color: #000000;">/</span><span style="color: #800080;">$st</span><span style="color: #000000;">&nbsp;]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">w+=$(f&nbsp;$1/$st)</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;</span><span style="color: #800080;">$st</span><span style="color: #000000;">&nbsp;in<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*.</span><span style="color: #000000;">c</span><span style="color: #000000;">|*.</span><span style="color: #000000;">h)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">w+=$(wc&nbsp;-l&nbsp;&lt;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">$</span><span style="color: #800000;">1</span><span style="color: #000000;">/</span><span style="color: #800080;">$st</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">)</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esac<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br>done<br>echo&nbsp;</span><span style="color: #800080;">$w</span><span style="color: #000000;"><br>}<br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;[&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">z&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">$1</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;">&nbsp;]<br>then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">Uasge:count_code&nbsp;path!</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">exit</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">1</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;$</span><span style="color: #800000;">1</span><span style="color: #000000;"><br>fi</span></div>
<br><br>5.源文件单词替换批处理<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">#</span><span style="color: #008000;">!/bin/bash</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;s&nbsp;in&nbsp;$(ls&nbsp;</span><span style="color: #000000;">*.</span><span style="color: #000000;">[ch])<br></span><span style="color: #0000ff;">do</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">file:&nbsp;$s</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;news</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">${s}_bak</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">newfile:&nbsp;$news</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cat&nbsp;</span><span style="color: #800080;">$s</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;sed&nbsp;s</span><span style="color: #000000;">/</span><span style="color: #000000;">iscsi_socket_t</span><span style="color: #000000;">/</span><span style="color: #000000;">mds_socket_t</span><span style="color: #000000;">/</span><span style="color: #000000;">g&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;${news}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mv&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">f&nbsp;${news}&nbsp;</span><span style="color: #800080;">$s</span><span style="color: #000000;"><br>done<br></span></div>
<br>
<br>（以上代码均为原创，zz请注明！谢谢！）<br><br>            <img src ="http://www.cnitblog.com/hustwei/aggbug/37814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hustwei/" target="_blank">wei</a> 2007-12-18 09:57 <a href="http://www.cnitblog.com/hustwei/archive/2007/12/18/37814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】2次objdump法快速确定oops位置</title><link>http://www.cnitblog.com/hustwei/archive/2007/11/27/36960.html</link><dc:creator>wei</dc:creator><author>wei</author><pubDate>Tue, 27 Nov 2007 11:43:00 GMT</pubDate><guid>http://www.cnitblog.com/hustwei/archive/2007/11/27/36960.html</guid><wfw:comment>http://www.cnitblog.com/hustwei/comments/36960.html</wfw:comment><comments>http://www.cnitblog.com/hustwei/archive/2007/11/27/36960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hustwei/comments/commentRss/36960.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hustwei/services/trackbacks/36960.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cnitblog.com/hustwei/archive/2007/11/27/36960.html'>阅读全文</a><img src ="http://www.cnitblog.com/hustwei/aggbug/36960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hustwei/" target="_blank">wei</a> 2007-11-27 19:43 <a href="http://www.cnitblog.com/hustwei/archive/2007/11/27/36960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】自定义的ip转化函数</title><link>http://www.cnitblog.com/hustwei/archive/2007/11/27/36923.html</link><dc:creator>wei</dc:creator><author>wei</author><pubDate>Tue, 27 Nov 2007 08:16:00 GMT</pubDate><guid>http://www.cnitblog.com/hustwei/archive/2007/11/27/36923.html</guid><wfw:comment>http://www.cnitblog.com/hustwei/comments/36923.html</wfw:comment><comments>http://www.cnitblog.com/hustwei/archive/2007/11/27/36923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hustwei/comments/commentRss/36923.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hustwei/services/trackbacks/36923.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cnitblog.com/hustwei/archive/2007/11/27/36923.html'>阅读全文</a><img src ="http://www.cnitblog.com/hustwei/aggbug/36923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hustwei/" target="_blank">wei</a> 2007-11-27 16:16 <a href="http://www.cnitblog.com/hustwei/archive/2007/11/27/36923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]tcpdump小经验</title><link>http://www.cnitblog.com/hustwei/archive/2007/11/13/36239.html</link><dc:creator>wei</dc:creator><author>wei</author><pubDate>Tue, 13 Nov 2007 08:12:00 GMT</pubDate><guid>http://www.cnitblog.com/hustwei/archive/2007/11/13/36239.html</guid><wfw:comment>http://www.cnitblog.com/hustwei/comments/36239.html</wfw:comment><comments>http://www.cnitblog.com/hustwei/archive/2007/11/13/36239.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hustwei/comments/commentRss/36239.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hustwei/services/trackbacks/36239.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cnitblog.com/hustwei/archive/2007/11/13/36239.html'>阅读全文</a><img src ="http://www.cnitblog.com/hustwei/aggbug/36239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hustwei/" target="_blank">wei</a> 2007-11-13 16:12 <a href="http://www.cnitblog.com/hustwei/archive/2007/11/13/36239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计算程序运行时间</title><link>http://www.cnitblog.com/hustwei/archive/2007/09/16/33501.html</link><dc:creator>wei</dc:creator><author>wei</author><pubDate>Sun, 16 Sep 2007 08:40:00 GMT</pubDate><guid>http://www.cnitblog.com/hustwei/archive/2007/09/16/33501.html</guid><wfw:comment>http://www.cnitblog.com/hustwei/comments/33501.html</wfw:comment><comments>http://www.cnitblog.com/hustwei/archive/2007/09/16/33501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hustwei/comments/commentRss/33501.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hustwei/services/trackbacks/33501.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cnitblog.com/hustwei/archive/2007/09/16/33501.html'>阅读全文</a><img src ="http://www.cnitblog.com/hustwei/aggbug/33501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hustwei/" target="_blank">wei</a> 2007-09-16 16:40 <a href="http://www.cnitblog.com/hustwei/archive/2007/09/16/33501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则式时间匹配</title><link>http://www.cnitblog.com/hustwei/archive/2007/09/16/33495.html</link><dc:creator>wei</dc:creator><author>wei</author><pubDate>Sun, 16 Sep 2007 07:07:00 GMT</pubDate><guid>http://www.cnitblog.com/hustwei/archive/2007/09/16/33495.html</guid><wfw:comment>http://www.cnitblog.com/hustwei/comments/33495.html</wfw:comment><comments>http://www.cnitblog.com/hustwei/archive/2007/09/16/33495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hustwei/comments/commentRss/33495.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hustwei/services/trackbacks/33495.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cnitblog.com/hustwei/archive/2007/09/16/33495.html'>阅读全文</a><img src ="http://www.cnitblog.com/hustwei/aggbug/33495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hustwei/" target="_blank">wei</a> 2007-09-16 15:07 <a href="http://www.cnitblog.com/hustwei/archive/2007/09/16/33495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wget介绍</title><link>http://www.cnitblog.com/hustwei/archive/2007/09/16/33492.html</link><dc:creator>wei</dc:creator><author>wei</author><pubDate>Sun, 16 Sep 2007 04:28:00 GMT</pubDate><guid>http://www.cnitblog.com/hustwei/archive/2007/09/16/33492.html</guid><wfw:comment>http://www.cnitblog.com/hustwei/comments/33492.html</wfw:comment><comments>http://www.cnitblog.com/hustwei/archive/2007/09/16/33492.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hustwei/comments/commentRss/33492.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hustwei/services/trackbacks/33492.html</trackback:ping><description><![CDATA[<h1 id=top><a name=baidusnap0></a><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong></h1>
<!-- Page published by Emacs Wiki begins here -->
<p>
<p><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong>是一个命令行工具，用于批量下载文件，支持HTTP和FTP。究竟比其他的工具好在哪里？看看内容吧 :)<br><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong>基本上所有的Linux版本都自己带了，但是有多少人在用呢？呵呵，如果你没有用过，不妨试试。Windows下面的用户可以使用GNUwin32的项目，<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong>，基本功能完全一致。好吧，我们来以几个简单的例子看看<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong>的威力。<br><br>如果我们想下载ftp里面某个目录里面的所有文件，我们也可以不用ftp这个笨蛋，呵呵，可以享受cute ftp等图形化工具的拖一个目录的轻松了。如<br></p>
<div align=center><strong><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong> -r <a href="ftp://10.8.8.8/movie/"><u><font color=#0000ff>ftp://10.8.8.8/movie/</font></u></a></strong><br></div>
呵呵，等吧！下完了，发觉有些不对劲，怎么出来个10.8.8.8的目录，进去看看，又是一个movie，哦，<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong>将目录结构和网站标题都给记录下来了，不要？？没有问题！比如说还是这个例子<br>
<p>&nbsp;</p>
<p>
<div align=center><strong><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong> -r <font color=#0000ff>-nd</font> <a href="ftp://10.8.8.8/movie/"><u><font color=#0000ff>ftp://10.8.8.8/movie/</font></u></a></strong><br></div>
结果什么目录都没有了，faint！怎么会这样？呵呵，你如果想要这样就让它这样吧，否则使用<br>
<div align=center><strong><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong> -r <font color=#0000ff>-nH</font> <a href="ftp://10.8.8.8/movie/"><u><font color=#0000ff>ftp://10.8.8.8/movie/</font></u></a></strong><br></div>
恩？movie也不要？OK，那就这样<br>
<div align=center><strong><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong> -r -nH <font color=#0000ff>--cut-dirs=1</font> <a href="ftp://10.8.8.8/movie/"><u><font color=#0000ff>ftp://10.8.8.8/movie/</font></u></a></strong><br>
<p><u><font color=#0000ff></font></u></p>
<p><u><font color=#0000ff></font></u></p>
</div>
这有什么用啊？cuteftp比他好用多了，而且，你这断了线能连吗？呵呵，不好意思，可以连<br>
<div align=center><strong><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong> <font color=#0000ff>-c</font> -r -nH --cut-dirs=1 <a href="ftp://10.8.8.8/movie/"><u><font color=#0000ff>ftp://10.8.8.8/movie/</font></u></a></strong><br></div>
<br>但是cuteftp能做下面的事情吗？比如，现在很多网站使用Apache建站，并不提供ftp服务，但是Apache有一个indexing功能，可以提供一个类似于ftp的界面，好多文件我想下啊，怎么办？由于是HTTP协议，CuteFTP无能为力了，倒是flash get等有什么get all这种功能，不知道他们对于目录处理怎么样。但是<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong>一点问题都没有，不信？我们拿CTAN为例（例子并不恰当，CTAN有FTP服务），我们下载这里面所有的宏包，呵呵<br>
<div align=center><strong><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong> -r <font color=#0000ff>-k</font> <a href="http://www.ctan.org/tex-archive/macros/latex/"><u><font color=#0000ff>http://www.ctan.org/tex-archive/macros/latex/</font></u></a></strong><br>
<p><u><font color=#0000ff></font></u></p>
<p><u><font color=#0000ff></font></u></p>
</div>
-k表示将连接转换为本地连接。但是现在同样有上面的问题啊，那就把你需要的加上吧，另外也许你根本不需要向下走那么多层，比如，我们就要到第二层，那么<br>
<div align=center><strong><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong> -r <font color=#0000ff>-l2</font> -k <a href="http://www.ctan.org/tex-archive/macros/latex/"><u><font color=#0000ff>http://www.ctan.org/tex-archive/macros/latex/</font></u></a></strong><br></div>
现在新的问题是，由于网页有一个排序功能，很讨厌，因为下载的时候把网页重复了好多次，那么我们可使用-A和-R开关控制下载类型，并且可以使用通配符，呵呵，现在随心所欲了吧<br>
<div align=center><strong><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong> -r <font color=#0000ff>-R "<em>.htm</em>\?*"</font> -k <a href="http://www.ctan.org/tex-archive/macros/latex/"><u><font color=#0000ff>http://www.ctan.org/tex-archive/macros/latex/</font></u></a></strong><br></div>
<p><u><font color=#0000ff></font></u></p>
<p>这次没有那种网页了吧？<strong>-R</strong>的意义在于拒绝下载匹配类型的文件，<strong>-A</strong>表示仅仅接受的文件类型，如<strong>-A "*.gif"</strong>将仅下载gif图片，如果有多个允许或者不允许，可以使用<strong>,</strong>分开。<br><br>那么，我们现在在使用代理服务器，怎么办呢？呵呵，很高兴你选择了<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong>，你可以使用它的配置文件，环境变量来利用代理。这里推荐使用环境变量，如在 bash里面我们可以把天天用的proxy加到.bash_profile里面，这是Linux标准写法（很多软件都用的，什么apt-get，yum等等）<br>
<div align=center><strong>export http_proxy=<a href="http://10.20.30.40:8080/"><u><font color=#0000ff>http://10.20.30.40:8080</font></u></a></strong><br></div>
然后，proxy就默认打开了，如果需要暂时关闭，可以使用<br>
<p>&nbsp;</p>
<p>
<div align=center><strong><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong> <font color=#0000ff>--proxy=off</font> -r -k <a href="http://www.ctan.org/tex-archive/macros/latex/"><u><font color=#0000ff>http://www.ctan.org/tex-archive/macros/latex/</font></u></a></strong><br></div>
当然，写一个<strong>.wgetrc</strong>文件也可以，该文件可以从<strong>/usr/local/etc</strong>里面找到，里面有很详细的注释，我就不多说了。<br><br>下载网页的时候比较麻烦的事情是，有的网页被同时指向了很多遍，那么为了避免多次下载，我们使用<br>
<div align=center><strong><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong> <font color=#0000ff>-nc</font> -r -k <a href="http://www.ctan.org/tex-archive/macros/latex/"><u><font color=#0000ff>http://www.ctan.org/tex-archive/macros/latex/</font></u></a></strong><br>
<p><u><font color=#0000ff></font></u></p>
<p><u><font color=#0000ff></font></u></p>
</div>
可以避免这件事情。为了不被有的连接指向非<a href="http://www.ctan.org/tex-archive/macros/latex/%20%20%20%20%20%20%20%20%20%20%20%20"><u><font color=#0000ff>http://www.ctan.org/tex-archive/macros/latex/内层目录，我们还应该加上</font></u></a><br>
<div align=center><strong><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong> -nc <font color=#0000ff>-np</font> -r -k <a href="http://www.ctan.org/tex-archive/macros/latex/"><u><font color=#0000ff>http://www.ctan.org/tex-archive/macros/latex/</font></u></a></strong><br></div>
避免下载非该目录里面的文件，这也避免了到不同的host上面去。当然，如果你希望有这个功能，在多个host之间跳来跳去的下载，可以使用<br>
<div align=center><strong><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong> -nc -np <font color=#0000ff>-H</font> -r -k <a href="http://www.ctan.org/tex-archive/macros/latex/"><u><font color=#0000ff>http://www.ctan.org/tex-archive/macros/latex/</font></u></a></strong><br></div>
<p><u><font color=#0000ff></font></u></p>
<p>使得可以在多个host之间span，同时-I和-X可以使得我们仅仅跟踪某些目录或者不跟踪某些目录。如果某些HTML里面你需要的东西不是由<strong>&lt;a&gt;</strong>这种东西作出来的，你就得使用<strong>--follow-tags</strong>和<strong>--ignore-tags</strong>了。<br><br>嘿，我有个文件里面都是连接，怎么办？要是不是html你只需要<br>
<div align=center><strong><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong> <font color=#0000ff>-i</font> your.file</strong><br></div>
<p>&nbsp;</p>
<p>如果是，那也不繁<br><strong><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">wget</strong> <font color=#0000ff>-F</font> </strong><strong>-i </strong><strong>your.file</strong> </p>
<img src ="http://www.cnitblog.com/hustwei/aggbug/33492.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hustwei/" target="_blank">wei</a> 2007-09-16 12:28 <a href="http://www.cnitblog.com/hustwei/archive/2007/09/16/33492.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】Boost socket performance on Linux </title><link>http://www.cnitblog.com/hustwei/archive/2007/07/20/30335.html</link><dc:creator>wei</dc:creator><author>wei</author><pubDate>Fri, 20 Jul 2007 14:52:00 GMT</pubDate><guid>http://www.cnitblog.com/hustwei/archive/2007/07/20/30335.html</guid><wfw:comment>http://www.cnitblog.com/hustwei/comments/30335.html</wfw:comment><comments>http://www.cnitblog.com/hustwei/archive/2007/07/20/30335.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hustwei/comments/commentRss/30335.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hustwei/services/trackbacks/30335.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width="100%">
            <h1>Boost socket performance on Linux</h1>
            <p id=subtitle><em>Four ways to speed up your network applications</em></p>
            <img class=display-img height=6 alt="" src="mhtml:file://D:\linux\socket\Boost%20socket%20performance%20on%20Linux.mht!http://www.ibm.com/i/c.gif" width=1></td>
            <td class=no-print width=192><a href="http://www.ibm.com/developerworks/"></a></td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width=10><img height=1 alt="" src="mhtml:file://D:\linux\socket\Boost%20socket%20performance%20on%20Linux.mht!http://www.ibm.com/i/c.gif" width=10></td>
            <td width="100%">
            <p>Level: Intermediate</p>
            <p><a href="http://www.ibm.com/developerworks/linux/library/l-hisock.html?ca=dgr-lnxw16BoostSocket#author"><u><font color=#800080>M. Tim Jones</font></u></a> (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#109;&#116;&#106;&#64;&#109;&#116;&#106;&#111;&#110;&#101;&#115;&#46;&#99;&#111;&#109;&#63;&#115;&#117;&#98;&#106;&#101;&#99;&#116;&#61;&#66;&#111;&#111;&#115;&#116;&#32;&#115;&#111;&#99;&#107;&#101;&#116;&#32;&#112;&#101;&#114;&#102;&#111;&#114;&#109;&#97;&#110;&#99;&#101;&#32;&#111;&#110;&#32;&#76;&#105;&#110;&#117;&#120;&#38;&#97;&#109;&#112;&#59;&#97;&#109;&#112;&#59;&#97;&#109;&#112;&#59;&#97;&#109;&#112;&#59;&#97;&#109;&#112;&#59;&#97;&#109;&#112;&#59;&#99;&#99;&#61;&#116;&#111;&#109;&#121;&#111;&#117;&#110;&#103;&#64;&#117;&#115;&#46;&#105;&#98;&#109;&#46;&#99;&#111;&#109;"><u><font color=#0000ff>mailto:mtj@mtjones.com?subject=Boost socket performance on Linux&amp;cc=tomyoung@us.ibm.com</font></u></a>), Consultant Engineer, Emulex<br></p>
            <p>17 Jan 2006<br>Updated 03 Feb 2006</p>
            <blockquote>The Sockets API lets you develop client and server applications that can communicate across a local network or across the world via the Internet. Like any API, you can use the Sockets API in ways that promote high performance -- or inhibit it. This article explores four ways to use the Sockets API to squeeze the greatest performance out your application and to tune the GNU/Linux&#174; environment to achieve the best results. <em>Editor's note: we updated Tip 3 to correct an error in the calculation for Bandwidth Delay Product (BDP), spotted by an alert reader.</em></blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><script language=JavaScript type=text/javascript>
            <!--
            if (document.referrer&&document.referrer!="") {
            // document.write(document.referrer);
            var q = document.referrer;
            var engine = q;
            var isG = engine.search(/google\.com/i);
            var searchTerms;
            //var searchTermsForDisplay;
            if (isG != -1) {
            var i = q.search(/q=/);
            var q2 = q.substring(i+2);
            var j = q2.search(/&/);
            j = (j == -1)?q2.length:j;
            searchTerms = q.substring(i+2,i+2+j);
            if (searchTerms.length != 0) {
            searchQuery(searchTerms);
            document.write("
            <div id=\"contents\"></div>
            ");
            }
            }
            }
            //-->
            </script><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
            <p>When developing a sockets application, job number one is usually establishing reliability and meeting the necessary requirements. With the four tips in this article, you can design and develop your sockets application for best performance, right from the beginning. This article covers use of the Sockets API, a couple of socket options that provide enhanced performance, and GNU/Linux tuning.</p>
            <p>To develop applications with lively performance capabilities, follow these tips:</p>
            <ul>
                <li>Minimize packet transmit latency.
                <li>Minimize system call overhead.
                <li>Adjust TCP windows for the Bandwidth Delay Product.
                <li>Dynamically tune the GNU/Linux TCP/IP stack. </li>
            </ul>
            <p><a name=N10070><span class=atitle>Tip 1. Minimize packet transmit latency</span></a></p>
            <p>When you communicate through a TCP socket, the data are chopped into blocks so that they fit within the TCP payload for the given connection. The size of TCP payload depends on several factors (such as the maximum packet size along the path), but these factors are known at connection initiation time. To achieve the best performance, the goal is to fill each packet as much as possible with the available data. When insufficient data exist to fill a payload (otherwise known as the <em>maximum segment size</em>, or MSS), TCP employs the Nagle algorithm to automatically concatenate small buffers into a single segment. Doing so increases the efficiency of the application and reduces overall network congestion by minimizing the number of small packets that are sent.</p>
            <p>John Nagle's algorithm works well to minimize small packets by concatenating them into larger ones, but sometimes you simply want the ability to send small packets. A simple example is the telnet application, which allows a user to interact with a remote system, typically through a shell. If the user were required to fill a segment with typed characters before the packet was sent, the experience would be less than desirable.</p>
            <p>Another example is the HTTP protocol. Commonly, a client browser makes a small request (an HTTP request message), resulting in a much larger response by the Web server (the Web page).</p>
            <p><a name=N10083><span class=smalltitle>The solution</span></a></p>
            <p>The first thing you should consider is that the Nagle algorithm fulfills a need. Because the algorithm coalesces data to try to fill a complete TCP packet segment, it does introduce some latency. But it does this with the benefit of minimizing the number of packets sent on the wire, and so it minimizes congestion on the network.</p>
            <p>But in cases where you need to minimize that transmit latency, the Sockets API provides a solution. To disable the Nagle algorithm, you can set the <code>TCP_NODELAY</code> socket option, as shown in Listing 1.</p>
            <br><a name=N10098><strong>Listing 1. Disabling the Nagle algorithm for a TCP socket</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>int sock, flag, ret;
                        /* Create new stream socket */
                        sock = <span class=boldcode>socket</span>( AF_INET, SOCK_STREAM, 0 );
                        /* Disable the Nagle (TCP No Delay) algorithm */
                        flag = 1;
                        ret = <span class=boldcode>setsockopt</span>( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&amp;flag, sizeof(flag) );
                        if (ret == -1) {
                        printf("Couldn't setsockopt(TCP_NODELAY)\n");
                        exit( EXIT_FAILURE );
                        }
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p><strong>Bonus tip:</strong> Experimentation with Samba demonstrates that disabling the Nagle algorithm results in almost doubling the read performance when reading from a Samba drive on a Microsoft&#174; Windows&#174; server.</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="mhtml:file://D:\linux\socket\Boost%20socket%20performance%20on%20Linux.mht!http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td></td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N100AE><span class=atitle>Tip 2. Minimize system call overhead</span></a></p>
            <p>Whenever you read or write data to a socket, you're using a <em>system call</em>. This call (such as <code>read</code> or <code>write</code>) crosses the boundary of the user space application to the kernel. Additionally, prior to getting to the kernel, your call goes through the C library to a common function in the kernel (<code>system_call()</code>). From <code>system_call()</code>, your call gets to the filesystem layer, where the kernel determines what type of device you're dealing with. Eventually, your call gets to the sockets layer, where data are read or queued for transmission on the socket (involving a data copy).</p>
            <p>This process illustrates that the system call operates not just in the application and kernel domains but through many levels within each domain. The process is expensive, so the more calls you make, the more time you spend working through this call chain, and the less performance you get from your application.</p>
            <p>Because you can't avoid making these system calls, your only option is to minimize the number of times you do it. Fortunately, you have control over this process.</p>
            <p><a name=N100D1><span class=smalltitle>The solution</span></a></p>
            <p>When writing data to a socket, write all the data that you have available instead of performing multiple writes of the data. For reads, pass in the largest buffer that you can support since the kernel will try to fill the entire buffer if enough data exist (in addition to keeping TCP's advertised window open). In this way, you can minimize the number of calls you make and achieve better overall performance. The <code>sendfile</code> system call is also useful for large data transfers, but the <code>TCP_CORK</code> socket option should be set in this case. The <code>writev</code> system call can also be used for bulk transfer as well as the asynchronous IO API (<code>aio_read</code>, <code>aio_write</code>, etc.).</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="mhtml:file://D:\linux\socket\Boost%20socket%20performance%20on%20Linux.mht!http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"></td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N100EF><span class=atitle>Tip 3. Adjust TCP windows for the Bandwidth Delay Product</span></a></p>
            <p>TCP depends on several factors for performance. Two of the most important are the <em>link bandwidth</em> (the rate at which packets can be transmitted on the network) and the <em>round-trip time</em>, or RTT (the delay between a segment being sent and its acknowledgment from the peer). These two values determine what is called the <em>Bandwidth Delay Product</em> (BDP).</p>
            <p>Given the link bandwidth rate and the RTT, you can calculate the BDP, but what does this do for you? It turns out that the BDP gives you an easy way to calculate the theoretical optimal TCP socket buffer sizes (which hold both the queued data awaiting transmission and queued data awaiting receipt by the application). If the buffer is too small, the TCP window cannot fully open, and this limits performance. If it's too large, precious memory resources can be wasted. If you set the buffer just right, you can fully utilize the available bandwidth. Let's look at an example:</p>
            <p><code>BDP = link_bandwidth * RTT</code> </p>
            <p>If your application communicates over a 100Mbps local area network with a 50 ms RTT, the BDP is:</p>
            <p><code>100MBps * 0.050 sec / 8 = 0.625MB = 625KB</code> </p>
            <p><strong>Note:</strong> I divide by 8 to convert from bits to bytes communicated.</p>
            <p>So, set your TCP window to the BDP, or 625KB. But the default window for TCP on Linux 2.6 is 110KB, which limits your bandwidth for the connection to 2.2MBps, as I've calculated here:</p>
            <p><code>throughput = window_size / RTT<br><br>110KB / 0.050 = 2.2MBps</code> </p>
            <p>If instead you use the window size calculated above, you get a whopping 12.5MBps, as shown here:</p>
            <p><code>625KB / 0.050 = 12.5MBps</code> </p>
            <p>That's quite a difference and will provide greater throughput for your socket. So you now know how to calculate the optimal socket buffer size for your socket. But how do you make this change?</p>
            <p><a name=N10137><span class=smalltitle>The solution</span></a></p>
            <p>The Sockets API provides several socket options, two of which exist to change the socket send and receive buffer sizes. Listing 2 shows how to adjust the size of the socket send and receive buffers with the <code>SO_SNDBUF</code> and <code>SO_RCVBUF</code> options.</p>
            <p><strong>Note:</strong> Although the socket buffer size determines the size of the advertised TCP window, TCP also maintains a congestion window within the advertised window. Therefore, because of congestion, a given socket may never utilize the maximum advertised window.</p>
            <br><a name=N10152><strong>Listing 2. Manually setting the send and receive socket buffer sizes</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>int ret, sock, sock_buf_size;
                        sock = <span class=boldcode>socket</span>( AF_INET, SOCK_STREAM, 0 );
                        sock_buf_size = BDP;
                        ret = <span class=boldcode>setsockopt</span>( sock, SOL_SOCKET, SO_SNDBUF,
                        (char *)&amp;sock_buf_size, sizeof(sock_buf_size) );
                        ret = <span class=boldcode>setsockopt</span>( sock, SOL_SOCKET, SO_RCVBUF,
                        (char *)&amp;sock_buf_size, sizeof(sock_buf_size) );
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>Within the Linux 2.6 kernel, the window size for the send buffer is taken as defined by the user in the call, but the receive buffer is doubled automatically. You can verify the size of each buffer using the <code>getsockopt</code> call.</p>
            <table cellSpacing=0 cellPadding=0 width="40%" align=right border=0>
                <tbody>
                    <tr>
                        <td width=10><img height=1 alt="" src="mhtml:file://D:\linux\socket\Boost%20socket%20performance%20on%20Linux.mht!http://www.ibm.com/i/c.gif" width=10></td>
                        <td>
                        <table cellSpacing=0 cellPadding=5 width="100%" border=1>
                            <tbody>
                                <tr>
                                    <td bgColor=#eeeeee><a name=N1016B><strong>Jumbo frames</strong></a><br>
                                    <p>Also consider increasing the packet size from 1,500 to 9,000 bytes (known as a jumbo frame). This can be done in local network situations by setting the Maximum Transmit Unit (or MTU) and can really boost performance. While great for LANs, it can sometimes be problematic in WANs because intermediary equipment such as switches may not support it. The MTU can be modified using the <code>ifconfig</code> utility.</p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <p>As for window scaling, TCP originally supported a maximum 64KB window (16 bits were used to define the window size). With the inclusion of window scaling (per RFC 1323), you can use a 32-bit value to represent the size of the window. The TCP/IP stack provided in GNU/Linux supports this option (and many others).</p>
            <p><strong>Bonus tip:</strong> The Linux kernel also includes the ability to auto-tune these socket buffers (see <code>tcp_rmem</code> and <code>tcp_wmem</code> in <a href="http://www.ibm.com/developerworks/linux/library/l-hisock.html?ca=dgr-lnxw16BoostSocket#table1"><u><font color=#800080>Table 1</font></u></a> below), but these options affect the entire stack. If you need to adjust the window for only one connection or type of connection, this mechanism does what you need.</p>
            <p><a name=N1018D><span class=atitle>Tip 4. Dynamically tune the GNU/Linux TCP/IP stack</span></a></p>
            <p>A standard GNU/Linux distribution tries to optimize for a wide range of deployments. This means that the standard distribution might not be optimal for your environment.</p>
            <p><a name=N10197><span class=smalltitle>The solution</span></a></p>
            <p>GNU/Linux provides a wide range of tunable kernel parameters that you can use to dynamically tailor the operating system for your specific use. Let's look at some of the more important options that affect sockets performance.</p>
            <p>The tunable kernel parameters exist within the <code>/proc</code> virtual filesystem. Each file in this filesystem represents one or more parameters that can be read through the <code>cat</code> utility or modified with the <code>echo</code> command. Listing 3 shows how to query and enable a tunable parameter (in this case, enabling IP forwarding within the TCP/IP stack).</p>
            <br><a name=N101B4><strong>Listing 3. Tuning: Enable IP forwarding within the TCP/IP stack</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>[root@camus]# cat /proc/sys/net/ipv4/ip_forward
                        0
                        [root@camus]# echo "1" &gt; /proc/sys/net/ipv4/ip_forward
                        [root@camus]# cat /proc/sys/net/ipv4/ip_forward
                        1
                        [root@camus]#
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p><a name=table1>Table 1</a> is a list of several tunable parameters that can help you increase the performance of the Linux TCP/IP stack.</p>
            <table class=data-table-1 cellSpacing=0 cellPadding=0 width="100%" summary="Table 1. Kernel tunable parameters for TCP/IP stack performance" border=0>
                <caption><em>Table 1. Kernel tunable parameters for TCP/IP stack performance</em> </caption>
                <tbody>
                    <tr>
                        <th>Tunable parameter</th>
                        <th>Default value</th>
                        <th>Option description</th>
                    </tr>
                    <tr>
                        <td class=tb-row vAlign=top><code>/proc/sys/net/core/rmem_default</code></td>
                        <td vAlign=top>"110592"</td>
                        <td>Defines the default receive window size; for a large BDP, the size should be larger.</td>
                    </tr>
                    <tr>
                        <td class=tb-row vAlign=top><code>/proc/sys/net/core/rmem_max</code></td>
                        <td vAlign=top>"110592"</td>
                        <td>Defines the maximum receive window size; for a large BDP, the size should be larger.</td>
                    </tr>
                    <tr>
                        <td class=tb-row vAlign=top><code>/proc/sys/net/core/wmem_default</code></td>
                        <td vAlign=top>"110592"</td>
                        <td>Defines the default send window size; for a large BDP, the size should be larger.</td>
                    </tr>
                    <tr>
                        <td class=tb-row vAlign=top><code>/proc/sys/net/core/wmem_max</code></td>
                        <td vAlign=top>"110592"</td>
                        <td>Defines the maximum send window size; for a large BDP, the size should be larger.</td>
                    </tr>
                    <tr>
                        <td class=tb-row vAlign=top><code>/proc/sys/net/ipv4/tcp_window_scaling</code></td>
                        <td vAlign=top>"1"</td>
                        <td>Enables window scaling as defined by RFC 1323; must be enabled to support windows larger than 64KB.</td>
                    </tr>
                    <tr>
                        <td class=tb-row vAlign=top><code>/proc/sys/net/ipv4/tcp_sack</code></td>
                        <td vAlign=top>"1"</td>
                        <td>Enables selective acknowledgment, which improves performance by selectively acknowledging packets received out of order (causing the sender to retransmit only the missing segments); should be enabled (for wide area network communication), but it can increase CPU utilization.</td>
                    </tr>
                    <tr>
                        <td class=tb-row vAlign=top><code>/proc/sys/net/ipv4/tcp_fack</code></td>
                        <td vAlign=top>"1"</td>
                        <td>Enables Forward Acknowledgment, which operates with Selective Acknowledgment (SACK) to reduce congestion; should be enabled.</td>
                    </tr>
                    <tr>
                        <td class=tb-row vAlign=top><code>/proc/sys/net/ipv4/tcp_timestamps</code></td>
                        <td vAlign=top>"1"</td>
                        <td>Enables calculation of RTT in a more accurate way (see RFC 1323) than the retransmission timeout; should be enabled for performance.</td>
                    </tr>
                    <tr>
                        <td class=tb-row vAlign=top><code>/proc/sys/net/ipv4/tcp_mem</code></td>
                        <td vAlign=top>"24576 32768 49152"</td>
                        <td>Determines how the TCP stack should behave for memory usage; each count is in memory pages (typically 4KB). The first value is the low threshold for memory usage. The second value is the threshold for a memory pressure mode to begin to apply pressure to buffer usage. The third value is the maximum threshold. At this level, packets can be dropped to reduce memory usage. Increase the count for large BDP (but remember, it's memory pages, not bytes).</td>
                    </tr>
                    <tr>
                        <td class=tb-row vAlign=top><code>/proc/sys/net/ipv4/tcp_wmem</code></td>
                        <td vAlign=top>"4096 16384 131072"</td>
                        <td>Defines per-socket memory usage for auto-tuning. The first value is the minimum number of bytes allocated for the socket's send buffer. The second value is the default (overridden by <code>wmem_default</code>) to which the buffer can grow under non-heavy system loads. The third value is the maximum send buffer space (overridden by <code>wmem_max</code>).</td>
                    </tr>
                    <tr>
                        <td class=tb-row vAlign=top><code>/proc/sys/net/ipv4/tcp_rmem</code></td>
                        <td vAlign=top>"4096 87380 174760"</td>
                        <td>Same as <code>tcp_wmem</code> except that it refers to receive buffers for auto-tuning.</td>
                    </tr>
                    <tr>
                        <td class=tb-row vAlign=top><code>/proc/sys/net/ipv4/tcp_low_latency</code></td>
                        <td vAlign=top>"0"</td>
                        <td>Allows the TCP/IP stack to give deference to low latency over higher throughput; should be disabled.</td>
                    </tr>
                    <tr>
                        <td class=tb-row vAlign=top><code>/proc/sys/net/ipv4/tcp_westwood</code></td>
                        <td vAlign=top>"0"</td>
                        <td>Enables a sender-side congestion control algorithm that maintains estimates of throughput and tries to optimize the overall utilization of bandwidth; should be enabled for WAN communication. This option is also useful for wireless interfaces, as packet loss may not be caused by congestion.</td>
                    </tr>
                    <tr>
                        <td class=tb-row vAlign=top><code>/proc/sys/net/ipv4/tcp_bic</code></td>
                        <td vAlign=top>"1"</td>
                        <td>Enables Binary Increase Congestion for fast long-distance networks; permits better utilization of links operating at gigabit speeds; should be enabled for WAN communication.</td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>As with any tuning effort, the best approach is experimental in nature. Your application behavior, processor speed, and availability of memory all affect how these parameters will alter performance. In some cases, what you think should be beneficial can be detrimental (and vice versa). So, try an option and then check the result. In other words, trust but verify.</p>
            <p><strong>Bonus tip:</strong> A word about persistent configuration. Note that if you reboot a GNU/Linux system, any tunable kernel parameters that you changed revert to their default. To make yours the default parameter, use the file <code>/etc/sysctl.conf</code> to configure the parameters at boot-time for your configuration.</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="mhtml:file://D:\linux\socket\Boost%20socket%20performance%20on%20Linux.mht!http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td></td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N102E4><span class=atitle>GNU/Linux tools</span></a></p>
            <p>GNU/Linux is attractive to me because of the number of tools that are available. The vast majority are command-line tools, but they are amazingly useful and intuitive. GNU/Linux provides several tools -- either natively or available as open source -- to debug networking applications, measure bandwidth/throughput, and check link utilization.</p>
            <p>Table 2 lists some of the most useful GNU/Linux tools along with their intended use. Table 3 lists useful tools that are not typically part of GNU/Linux distributions. </p>
            <table class=data-table-1 cellSpacing=0 cellPadding=0 width="100%" summary="Table 2. Native tools commonly found in any GNU/Linux distribution" border=0>
                <caption><em>Table 2. Native tools commonly found in any GNU/Linux distribution</em> </caption>
                <tbody>
                    <tr>
                        <th>GNU/Linux utility</th>
                        <th>Purpose</th>
                    </tr>
                    <tr>
                        <td class=tb-row><code>ping</code></td>
                        <td>Most commonly used to check accessibility to a host but can also be used to identify the RTT for the bandwidth-delay-product calculation.</td>
                    </tr>
                    <tr>
                        <td class=tb-row><code>traceroute</code></td>
                        <td>Prints the path (route) for a connection to a network host through a series of routers and gateways, identifying the latency between each hop.</td>
                    </tr>
                    <tr>
                        <td class=tb-row><code>netstat</code></td>
                        <td>Identifies various statistics about the networking subsystem, protocols, and connections.</td>
                    </tr>
                    <tr>
                        <td class=tb-row><code>tcpdump</code></td>
                        <td>Shows the protocol-level packet trace for one or more connections; also includes timing information, which you can use to explore the packet timing of the various protocol services.</td>
                    </tr>
                </tbody>
            </table>
            <br>
            <table class=data-table-1 cellSpacing=0 cellPadding=0 width="100%" summary="Table 3. Useful performance tools not typically available in a GNU/Linux distribution" border=0>
                <caption><em>Table 3. Useful performance tools not typically available in a GNU/Linux distribution</em> </caption>
                <tbody>
                    <tr>
                        <th>GNU/Linux utility</th>
                        <th>Purpose</th>
                    </tr>
                    <tr>
                        <td class=tb-row><code>netlog</code></td>
                        <td>Provides application instrumentation for network performance.</td>
                    </tr>
                    <tr>
                        <td class=tb-row><code>nettimer</code></td>
                        <td>Generates a metric for bottleneck link bandwidth; can be used for protocol auto-tuning.</td>
                    </tr>
                    <tr>
                        <td class=tb-row><code>Ethereal</code></td>
                        <td>Provides the features of <code>tcpump</code> (packet trace) in an easy-to-use graphical interface.</td>
                    </tr>
                    <tr>
                        <td class=tb-row><code>iperf</code></td>
                        <td>Measures network performance for both TCP and UDP; measures maximum bandwidth, and also reports delay jitter and datagram loss.</td>
                    </tr>
                    <tr>
                        <td class=tb-row><code>trafshow</code></td>
                        <td>Provides full-screen visualization of network traffic.</td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="mhtml:file://D:\linux\socket\Boost%20socket%20performance%20on%20Linux.mht!http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td></td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N10399><span class=atitle>Conclusion</span></a></p>
            <p>Experiment with these tips and techniques to increase the performance of your sockets applications, including reducing transmit latency by disabling the Nagle algorithm, increasing bandwidth utilization of a socket through buffer sizing, reducing system call overhead by minimizing the number of system calls, and tuning the Linux TCP/IP stack with tunable kernel parameters.</p>
            <p>Always consider the nature of your application when tuning. For example, is your application LAN-based or will it communicate over the Internet? If your application operates only within a LAN, increasing socket-buffer sizes may not yield much benefit, but enabling jumbo frames certainly will!</p>
            <p>Finally, always check the results of your tuning with a tool like <code>tcpdump</code> or <code>Ethereal</code>. The changes you see at the packet level will help indicate the success of your tuning with these techniques.</p>
            <br><br><br>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cnitblog.com/hustwei/aggbug/30335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/hustwei/" target="_blank">wei</a> 2007-07-20 22:52 <a href="http://www.cnitblog.com/hustwei/archive/2007/07/20/30335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>