﻿<?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</title><link>http://www.cnitblog.com/hustwei/</link><description>The dream starts</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 05:59:00 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 05:59:00 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>重要学术会议列表</title><link>http://www.cnitblog.com/hustwei/archive/2008/04/14/42362.html</link><dc:creator>wei</dc:creator><author>wei</author><pubDate>Mon, 14 Apr 2008 13:10:00 GMT</pubDate><guid>http://www.cnitblog.com/hustwei/archive/2008/04/14/42362.html</guid><wfw:comment>http://www.cnitblog.com/hustwei/comments/42362.html</wfw:comment><comments>http://www.cnitblog.com/hustwei/archive/2008/04/14/42362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hustwei/comments/commentRss/42362.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hustwei/services/trackbacks/42362.html</trackback:ping><description><![CDATA[&nbsp;
<p align=center><span>实验室资助学术会议列表（</span><span>TOP80</span><span>）</span></p>
<h1><span>Most Prestigious</span></h1>
<p><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>National Conference on Artificial Intelligence (AAAI)</span></p>
<p><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>International Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS)</span></p>
<p><span><span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM Conference on Computer and Communication Security (CCS)</span></p>
<p><span><span>4.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM Conference on Human Factors in Computing Systems (CHI)</span></p>
<p><span><span>5.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Annual International Cryptology Conference (CRYPTO)</span></p>
<p><span><span>6.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>International Conference on Dependable Systems and Networks (DSN)</span></p>
<p><span><span>7.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>USENIX Conference on File and Storage Techniques (FAST)</span></p>
<p><span><span>8.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>IEEE Symposium on Foundations of Computer Science (FOCS</span><span>)</span></p>
<p><span><span>9.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Workshop on Hot Topics in Networking</span><span> (HotNets)</span></p>
<p><span><span>10.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>Workshop on Hot Topics in Operating Systems (HotOS)</span></p>
<p><span><span>11.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Symposium on High Performance Computer Architecture (HPCA)<span>&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span><span>12.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>IEEE International Symposium on High Performance Distributed Computing (HPDC)</span></p>
<p><span><span>13.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Conference on Distributed Computing Systems (ICDCS)</span></p>
<p><span><span>14.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Conference on Data Engineering (ICDE)</span></p>
<p><span><span>15.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM International Conference on Supercomputing (ICS)</span></p>
<p><span><span>16.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Conference on Software Engineering (ICSE)</span></p>
<p><span><span>17.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Joint Conference on Artificial Intelligence (IJCAI)</span></p>
<p><span><span>18.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>IEEE Conference on Computer Communications (INFOCOM)</span></p>
<p><span><span>19.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Symposium on Computer Architecture (ISCA)</span></p>
<p><span><span>20.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD)</span></p>
<p><span><span>21.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>Annual IEEE/ACM International Symposium on Microarchitecture (MICRO)</span></p>
<p><span><span>22.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM/ IFIP/USENIX International Middleware Conference (Middleware)</span></p>
<p><span><span>23.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM International Conference on Multimedia (MM)</span></p>
<p><span><span>24.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM International Conference on <st1:place w:st="on">Mobile</st1:place> Systems, Applications, and Services (MobiSys)</span></p>
<p><span><span>25.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>USENIX Conference on Operating System and Design (OSDI)</span></p>
<p><span><span>26.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>Annual ACM Symposium on Principles of Distributed Computing (PODC)</span></p>
<p><span><span>27.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>IEEE Real-Time Systems Symposium (RTSS)</span></p>
<p><span><span>28.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>Supercomputing (SC'XY) Conference</span></p>
<p><span><span>29.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM SIGCOMM Conference (SIGCOMM)</span></p>
<p><span><span>30.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM Conference on Computer Graphics and Interactive Techniques (SIGGRAPH)</span></p>
<p><span><span>31.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM Annual International ACM SIGIR Conference on Research and Development in Information Retrieval (SIGIR)</span></p>
<p><span><span>32.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM Conference on Measurement and Modeling of Computer Systems (SIGMETRICS)</span></p>
<p><span><span>33.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Conference on Management of Data and Symposium on Principles of Database Systems (SIGMOD/PODS)</span></p>
<p><span><span>34.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM Symposium on Operating Systems Principles (SOSP)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span><span>35.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>IEEE Symposium on Security and Privacy (SP)</span></p>
<p><span><span>36.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>Annual ACM Symposium on Parallel Algorithms and Architectures (SPAA)</span></p>
<p><span><span>37.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>Annual ACM Symposium on Theory of Computing (STOC)</span></p>
<p><span><span>38.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>USENIX Annual Technical Conference (USENIX)</span></p>
<p><span><span>39.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Conference on Very Large Data Bases (VLDB)</span></p>
<p><span><span>40.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International World Wide Web Conference (WWW)</span></p>
<p>&nbsp;</p>
<h1><span>Most Important</span></h1>
<p><a name=OLE_LINK1><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>IEEE Symposium on Mass Storage Systems/NASA Goddard Conference on Mass Storage Systems and Technologies (MSS/MSST)</span></a></p>
<p><span><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>IEEE International Parallel and Distributed Processing Symposium (IPDPS)</span></span></p>
<p><span><span><span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>USENIX Symposium on Networked Systems Design and Implementation (NSDI)</span></span></p>
<p><span><span><span>4.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>USENIX Linux Kernel Developers <st1:place w:st="on"><st1:city w:st="on">Summit</st1:city></st1:place> (Linux Kernel)</span></span></p>
<p><span><span><span>5.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>USENIX Large Installation System Administration Conference (LISA)</span></span></p>
<p><span><span><span>6.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>USENIX Internet Measurement Conference (IMC)</span></span></p>
<p><span><span><span>7.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>USENIX Security Symposium (Security)</span></span></p>
<p><span><span><span>8.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>IEEE International Conference on Cluster Computing (CLUSTER)</span></span></p>
<p><span><span><span>9.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM Conference on Electronic Commerce (EC)</span></span></p>
<p><span><span><span>10.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM Symposium on the Foundations of Software Engineering (FSE)</span></span></p>
<p><span><span><span>11.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>IEEE/ACM International Workshop on Grid Computing (GRID)</span></span></p>
<p><span><span><span>12.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>IEEE International Conference on Communications (ICC)</span></span></p>
<p><span><span><span>13.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>IEEE International Conference on Data Mining (ICDM)</span></span></p>
<p><span><span><span>14.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Conference on Machine Learning (ICML)</span></span></p>
<p><span><span><span>15.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>IEEE International Conference on Network Protocols (ICNP)</span></span></p>
<p><span><span><span>16.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Conference on Parallel Processing (ICPP)<span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p>
<p><span><span><span>17.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Semantic Web Conference (ISWC)</span></span></p>
<p><span><span><span>18.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Symposium on Modeling, Analysis, and Simulation of Computer &amp; Telecommunication Systems (MASCOTS)</span></span></p>
<p><span><span><span>19.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>SPIE Conference on Multimedia Computing and Networking (MMCN)</span></span></p>
<p><span><span><span>20.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Conference on <st1:place w:st="on">Mobile</st1:place> Computing and Networking (MobiCom)</span></span></p>
<p><span><span><span>21.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Workshop on Network and Operating System Support for Digital Audio and Video (NOSSDAV)</span></span></p>
<p><span><span><span>22.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Conference on Parallel Architectures and Compilation Techniques (PACT)</span></span></p>
<p><span><span><span>23.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>IFIP International Symposium on Computer Performance Modeling, Measurement and Evaluation (Performance)</span></span></p>
<p><span><span><span>24.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM Conference on Programming Language Design and Implementation (PLDI)</span></span></p>
<p><span><span><span>25.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM Symposium on Principles of Programming Languages (POPL)</span></span></p>
<p><span><span><span>26.<span>&nbsp;&nbsp;&nbsp; </span></span></span><st1:place w:st="on"><st1:country-region w:st="on"><span>SIAM</span></st1:country-region></st1:place><span> Conference on Parallel Processing for Scientific Computing </span></span><span><span>(PP)</span></span></p>
<p><span><span><span>27.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming (PPoPP)</span></span></p>
<p><span><span><span>28.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Symposium on the Recent Advances in Intrusion Detection (RAID)</span></span></p>
<p><span><span><span>29.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>IEEE Real-Time and Embedded Technology and Applications Symposium (RTAS)</span></span></p>
<p><span><span><span>30.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM Symposium on Access Control Models and Technologies (SACMAT)</span></span></p>
<p><span><span><span>31.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM-SIAM Symposium on Discrete Algorithms (SODA)</span></span></p>
<p><span><span><span>32.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Symposium on Reliable Distributed Systems (SRDS)</span></span></p>
<p><span><span><span>33.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>USENIX Symposium on Internet Technologies and Systems (USITS)</span></span></p>
<p><span><span>34.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>ACM International Conference on Virtual Execution Environments (VEE)</span></p>
<p><span><span>35.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>USENIX Workshop on Real, Large Distributed Systems (WORLDS)</span></p>
<p><span><span>36.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>IEEE International Symposium on Circuits and Systems (ISCAS)</span></p>
<p><span><span>37.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>IEEE International Symposium on Information Theory&nbsp;(ISIT)</span></p>
<p><span><span>38.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>IEEE&nbsp;Wireless Communications &amp; Networking Conference&nbsp;(WCNC) </span></p>
<p><span><span>39.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>International Conference on Software Engineering (ICSE)</span></p>
<p><span><span>40.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>IEEE&nbsp;Wireless Communications &amp; Networking Conference (WCNC) </span></p>
<p>&nbsp;</p>
<img src ="http://www.cnitblog.com/hustwei/aggbug/42362.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-14 21:10 <a href="http://www.cnitblog.com/hustwei/archive/2008/04/14/42362.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>【原】远程核态调试技巧</title><link>http://www.cnitblog.com/hustwei/archive/2007/12/06/37407.html</link><dc:creator>wei</dc:creator><author>wei</author><pubDate>Thu, 06 Dec 2007 06:48:00 GMT</pubDate><guid>http://www.cnitblog.com/hustwei/archive/2007/12/06/37407.html</guid><wfw:comment>http://www.cnitblog.com/hustwei/comments/37407.html</wfw:comment><comments>http://www.cnitblog.com/hustwei/archive/2007/12/06/37407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/hustwei/comments/commentRss/37407.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/hustwei/services/trackbacks/37407.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cnitblog.com/hustwei/archive/2007/12/06/37407.html'>阅读全文</a><img src ="http://www.cnitblog.com/hustwei/aggbug/37407.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-06 14:48 <a href="http://www.cnitblog.com/hustwei/archive/2007/12/06/37407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>