﻿<?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博客-System Administration Center</title><link>http://www.cnitblog.com/sysop/</link><description>It's so hard to say 'just for fun'.</description><language>zh-cn</language><lastBuildDate>Thu, 12 Mar 2026 01:03:31 GMT</lastBuildDate><pubDate>Thu, 12 Mar 2026 01:03:31 GMT</pubDate><ttl>60</ttl><item><title>shell edit command</title><link>http://www.cnitblog.com/sysop/archive/2009/03/16/55460.html</link><dc:creator>SYSOP</dc:creator><author>SYSOP</author><pubDate>Mon, 16 Mar 2009 04:14:00 GMT</pubDate><guid>http://www.cnitblog.com/sysop/archive/2009/03/16/55460.html</guid><description><![CDATA[shell edit command，referrenced from the belowing articles:<div><span  style="font-family: helvetica; font-size: 20px; font-weight: bold; line-height: 24px; ">G<small>etting</small>&#160;S<small>tarted with</small>&#160;BASH&#160;</span><br></div><div><span  style="font-family: helvetica; font-size: 20px; font-weight: bold; line-height: 24px;"><a href="http://www.hypexr.org/bash_tutorial.php#vi">http://www.hypexr.org/bash_tutorial.php#vi</a><br></span></div><div><span  style="font-family: helvetica; font-size: 20px; font-weight: bold; line-height: 24px;"><span  style="color: rgb(0, 0, 128); font-family: 'times new roman'; font-size: 24px; line-height: normal; -webkit-border-horizontal-spacing: 8px; -webkit-border-vertical-spacing: 8px; ">Using history and command line editing</span><br></span></div><div><span  style="color: rgb(0, 0, 128); font-family: 'times new roman'; font-size: 24px; font-weight: bold; -webkit-border-horizontal-spacing: 8px; -webkit-border-vertical-spacing: 8px;"><a href="http://www.kingcomputerservices.com/unix_101/using_history_and_command_line_editing.htm">http://www.kingcomputerservices.com/unix_101/using_history_and_command_line_editing.htm</a><br></span></div><img src ="http://www.cnitblog.com/sysop/aggbug/55460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sysop/" target="_blank">SYSOP</a> 2009-03-16 12:14 <a href="http://www.cnitblog.com/sysop/archive/2009/03/16/55460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wget中文使用手册</title><link>http://www.cnitblog.com/sysop/archive/2009/03/09/55209.html</link><dc:creator>SYSOP</dc:creator><author>SYSOP</author><pubDate>Mon, 09 Mar 2009 07:36:00 GMT</pubDate><guid>http://www.cnitblog.com/sysop/archive/2009/03/09/55209.html</guid><description><![CDATA[<div>wget是一个从网络上自动下载文件的自由工具。它支持HTTP，HTTPS和FTP协议，可以使用HTTP代理。</div><div>所谓的自动下载是指，wget可以在用户退出系统的之后在后台执行。这意味这你可以登录系统，启动一个wget下载任务，然后退出系统，wget将在后台执行直到任务完成，相对于其它大部分浏览器在下载大量数据时需要用户一直的参与，这省去了极大的麻烦。</div><div>wget 可以跟踪HTML页面上的链接依次下载来创建远程服务器的本地版本，完全重建原始站点的目录结构。这又常被称作&#8221;递归下载&#8221;。在递归下载的时候，wget 遵循Robot Exclusion标准(/robots.txt). wget可以在下载的同时，将链接转换成指向本地文件，以方便离线浏览。</div><div>wget 非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性.如果是由于网络的原因下载失败，wget会不断的尝试，直到整个文件下载完毕。如果是服务 器打断下载过程，它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。</div><div>wget的常见用法</div><div>wget的使用格式</div><div>Usage: wget [OPTION]&#8230; [URL]&#8230;</div><div>* 用wget做站点镜像:</div><div>wget -r -p -np -k http://dsec.pku.edu.cn/~usr_name/</div><div># 或者</div><div>wget -m http://dsec.pku.edu.cn/~usr_name/</div><div>* 在不稳定的网络上下载一个部分下载的文件，以及在空闲时段下载</div><div>wget -t 0 -w 31 -c http://dsec.pku.edu.cn/BBC.avi -o down.log &amp;</div><div># 或者从filelist读入要下载的文件列表</div><div>wget -t 0 -w 31 -c -B ftp://dsec.pku.edu.cn/linuxsoft -i filelist.txt -o down.log &amp;</div><div>上面的代码还可以用来在网络比较空闲的时段进行下载。我的用法是:在mozilla中将不方便当时下载的URL链接拷贝到内存中然后粘贴到文件filelist.txt中，在晚上要出去系统前执行上面代码的第二条。</div><div>* 使用代理下载</div><div>wget -Y on -p -k https://sourceforge.net/projects/wvware/</div><div>代理可以在环境变量或wgetrc文件中设定</div><div># 在环境变量中设定代理</div><div>export PROXY=http://211.90.168.94:8080/</div><div># 在~/.wgetrc中设定代理</div><div>http_proxy = http://proxy.yoyodyne.com:18023/</div><div>ftp_proxy = http://proxy.yoyodyne.com:18023/</div><div>wget各种选项分类列表</div><div>* 启动</div><div>-V, &#8211;version 显示wget的版本后退出</div><div>-h, &#8211;help 打印语法帮助</div><div>-b, &#8211;background 启动后转入后台执行</div><div>-e, &#8211;execute=COMMAND 执行`.wgetrc&#8217;格式的命令，wgetrc格式参见/etc/wgetrc或~/.wgetrc</div><div>* 记录和输入文件</div><div>-o, &#8211;output-file=FILE 把记录写到FILE文件中</div><div>-a, &#8211;append-output=FILE 把记录追加到FILE文件中</div><div>-d, &#8211;debug 打印调试输出</div><div>-q, &#8211;quiet 安静模式(没有输出)</div><div>-v, &#8211;verbose 冗长模式(这是缺省设置)</div><div>-nv, &#8211;non-verbose 关掉冗长模式，但不是安静模式</div><div>-i, &#8211;input-file=FILE 下载在FILE文件中出现的URLs</div><div>-F, &#8211;force-html 把输入文件当作HTML格式文件对待</div><div>-B, &#8211;base=URL 将URL作为在-F -i参数指定的文件中出现的相对链接的前缀</div><div>&#8211;sslcertfile=FILE 可选客户端证书</div><div>&#8211;sslcertkey=KEYFILE 可选客户端证书的KEYFILE</div><div>&#8211;egd-file=FILE 指定EGD socket的文件名</div><div>* 下载</div><div>&#8211;bind-address=ADDRESS 指定本地使用地址(主机名或IP，当本地有多个IP或名字时使用)</div><div>-t, &#8211;tries=NUMBER 设定最大尝试链接次数(0 表示无限制).</div><div>-O &#8211;output-document=FILE 把文档写到FILE文件中</div><div>-nc, &#8211;no-clobber 不要覆盖存在的文件或使用.#前缀</div><div>-c, &#8211;continue 接着下载没下载完的文件</div><div>&#8211;progress=TYPE 设定进程条标记</div><div>-N, &#8211;timestamping 不要重新下载文件除非比本地文件新</div><div>-S, &#8211;server-response 打印服务器的回应</div><div>&#8211;spider 不下载任何东西</div><div>-T, &#8211;timeout=SECONDS 设定响应超时的秒数</div><div>-w, &#8211;wait=SECONDS 两次尝试之间间隔SECONDS秒</div><div>&#8211;waitretry=SECONDS 在重新链接之间等待1&#8230;SECONDS秒</div><div>&#8211;random-wait 在下载之间等待0&#8230;2*WAIT秒</div><div>-Y, &#8211;proxy=on/off 打开或关闭代理</div><div>-Q, &#8211;quota=NUMBER 设置下载的容量限制</div><div>&#8211;limit-rate=RATE 限定下载输率</div><div>* 目录</div><div>-nd &#8211;no-directories 不创建目录</div><div>-x, &#8211;force-directories 强制创建目录</div><div>-nH, &#8211;no-host-directories 不创建主机目录</div><div>-P, &#8211;directory-prefix=PREFIX 将文件保存到目录 PREFIX/&#8230;</div><div>&#8211;cut-dirs=NUMBER 忽略 NUMBER层远程目录</div><div>* HTTP 选项</div><div>&#8211;http-user=USER 设定HTTP用户名为 USER.</div><div>&#8211;http-passwd=PASS 设定http密码为 PASS.</div><div>-C, &#8211;cache=on/off 允许/不允许服务器端的数据缓存 (一般情况下允许).</div><div>-E, &#8211;html-extension 将所有text/html文档以.html扩展名保存</div><div>&#8211;ignore-length 忽略 `Content-Length&#8217;头域</div><div>&#8211;header=STRING 在headers中插入字符串 STRING</div><div>&#8211;proxy-user=USER 设定代理的用户名为 USER</div><div>&#8211;proxy-passwd=PASS 设定代理的密码为 PASS</div><div>&#8211;referer=URL 在HTTP请求中包含 `Referer: URL&#8217;头</div><div>-s, &#8211;save-headers 保存HTTP头到文件</div><div>-U, &#8211;user-agent=AGENT 设定代理的名称为 AGENT而不是 Wget/VERSION.</div><div>&#8211;no-http-keep-alive 关闭 HTTP活动链接 (永远链接).</div><div>&#8211;cookies=off 不使用 cookies.</div><div>&#8211;load-cookies=FILE 在开始会话前从文件 FILE中加载cookie</div><div>&#8211;save-cookies=FILE 在会话结束后将 cookies保存到 FILE文件中</div><div>* FTP 选项</div><div>-nr, &#8211;dont-remove-listing 不移走 `.listing&#8217;文件</div><div>-g, &#8211;glob=on/off 打开或关闭文件名的 globbing机制</div><div>&#8211;passive-ftp 使用被动传输模式 (缺省值).</div><div>&#8211;active-ftp 使用主动传输模式</div><div>&#8211;retr-symlinks 在递归的时候，将链接指向文件(而不是目录)</div><div>* 递归下载</div><div>-r, &#8211;recursive 递归下载－－慎用!</div><div>-l, &#8211;level=NUMBER 最大递归深度 (inf 或 0 代表无穷).</div><div>&#8211;delete-after 在现在完毕后局部删除文件</div><div>-k, &#8211;convert-links 转换非相对链接为相对链接</div><div>-K, &#8211;backup-converted 在转换文件X之前，将之备份为 X.orig</div><div>-m, &#8211;mirror 等价于 -r -N -l inf -nr.</div><div>-p, &#8211;page-requisites 下载显示HTML文件的所有图片</div><div>* 递归下载中的包含和不包含(accept/reject)</div><div>-A, &#8211;accept=LIST 分号分隔的被接受扩展名的列表</div><div>-R, &#8211;reject=LIST 分号分隔的不被接受的扩展名的列表</div><div>-D, &#8211;domains=LIST 分号分隔的被接受域的列表</div><div>&#8211;exclude-domains=LIST 分号分隔的不被接受的域的列表</div><div>&#8211;follow-ftp 跟踪HTML文档中的FTP链接</div><div>&#8211;follow-tags=LIST 分号分隔的被跟踪的HTML标签的列表</div><div>-G, &#8211;ignore-tags=LIST 分号分隔的被忽略的HTML标签的列表</div><div>-H, &#8211;span-hosts 当递归时转到外部主机</div><div>-L, &#8211;relative 仅仅跟踪相对链接</div><div>-I, &#8211;include-directories=LIST 允许目录的列表</div><div>-X, &#8211;exclude-directories=LIST 不被包含目录的列表</div><div>-np, &#8211;no-parent 不要追溯到父目录</div><div>问题</div><div>在递归下载的时候，遇到目录中有中文的时候，wget创建的本地目录名会用URL编码规则处理。如&#8221;天网防火墙&#8221;会被存为&#8221;%CC%EC%CD%F8%B7%C0%BB%F0%C7%BD&#8221;,这造成阅读上的极大不方便。</div><img src ="http://www.cnitblog.com/sysop/aggbug/55209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sysop/" target="_blank">SYSOP</a> 2009-03-09 15:36 <a href="http://www.cnitblog.com/sysop/archive/2009/03/09/55209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python上的图标工具</title><link>http://www.cnitblog.com/sysop/archive/2009/01/04/53427.html</link><dc:creator>SYSOP</dc:creator><author>SYSOP</author><pubDate>Sun, 04 Jan 2009 08:19:00 GMT</pubDate><guid>http://www.cnitblog.com/sysop/archive/2009/01/04/53427.html</guid><description><![CDATA[<span  style="font-family: Arial; font-size: 12px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><p style="line-height: normal; ">要动态生成图表？Python上的东东还真不少。<br style="line-height: normal; "><br style="line-height: normal; ">如果要显示结点关系图，可选择 历史最悠久的是<span class="link-external" style="line-height: normal; "><a href="http://www.graphviz.org/" style="text-decoration: none; color: rgb(123, 112, 92); font-size: 12px; line-height: 20px; font-family: Tahoma; ">Graphviz</a></span>, 通过<span class="link-external" style="line-height: normal; "><a href="http://dkbza.org/pydot.html" style="text-decoration: none; color: rgb(123, 112, 92); font-size: 12px; line-height: 20px; font-family: Tahoma; ">pyDot</a></span>生成DOT文件。<br style="line-height: normal; "><br style="line-height: normal; ">如果是需要生成统计图，则<span class="link-external" style="line-height: normal; "><a href="http://www.hpl.hp.com/personal/Yasushi_Saito/pychart/" style="text-decoration: none; color: rgb(123, 112, 92); font-size: 12px; line-height: 20px; font-family: Tahoma; ">pyChart</a></span>可能更加适合。<br style="line-height: normal; "><br style="line-height: normal; ">如果要做三维的图形，可考虑<span class="link-external" style="line-height: normal; "><a href="http://www.linmpi.mpg.de/dislin/" style="text-decoration: none; color: rgb(123, 112, 92); font-size: 12px; line-height: 20px; font-family: Tahoma; ">Dislin</a></span>.<br style="line-height: normal; "><br style="line-height: normal; ">如果要一个历史最悠久的，最受欢迎的，应该选择<span class="link-external" style="line-height: normal; "><a href="http://www.gnuplot.info/" style="text-decoration: none; color: rgb(123, 112, 92); font-size: 12px; line-height: 20px; font-family: Tahoma; ">Gnuplot</a></span>,可通过<span class="link-external" style="line-height: normal; "><a href="http://gnuplot-py.sourceforge.net/" style="text-decoration: none; color: rgb(123, 112, 92); font-size: 12px; line-height: 20px; font-family: Tahoma; ">Gnuplot.py</a></span>来访问.<br style="line-height: normal; "><br style="line-height: normal; ">如果需要一个最前卫的，操作类似matlab的，则应该选择<span style="line-height: normal; "><span class="link-external" style="line-height: normal; "><a href="http://matplotlib.sourceforge.net/" style="text-decoration: none; color: rgb(123, 112, 92); font-size: 12px; line-height: 20px; font-family: Tahoma; ">matplotlib</a></span>。</span><br style="line-height: normal; "><br style="line-height: normal; ">哦，如果你来自Zope，希望简单、再简单一点，那么可考虑<span class="link-external" style="line-height: normal; "><a href="http://www.gocept.com/angebot/opensource/SVGrafZ/index_html" style="text-decoration: none; color: rgb(123, 112, 92); font-size: 12px; line-height: 20px; font-family: Tahoma; ">SVGraphZ</a></span>。</p><p style="line-height: normal; ">如果你想从最底层来，而且喜欢<span class="link-external" style="line-height: normal; "><a href="http://www.w3.org/Graphics/SVG" style="text-decoration: none; color: rgb(123, 112, 92); font-size: 12px; line-height: 20px; font-family: Tahoma; ">SVG</a></span>格式，则可看看<span class="link-external" style="line-height: normal; "><a href="http://www2.sfk.nl/svg" style="text-decoration: none; color: rgb(123, 112, 92); font-size: 12px; line-height: 20px; font-family: Tahoma; ">SVGDraw</a></span>吧。</p></span>
<img src ="http://www.cnitblog.com/sysop/aggbug/53427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sysop/" target="_blank">SYSOP</a> 2009-01-04 16:19 <a href="http://www.cnitblog.com/sysop/archive/2009/01/04/53427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>弄清php原理</title><link>http://www.cnitblog.com/sysop/archive/2008/12/17/52720.html</link><dc:creator>SYSOP</dc:creator><author>SYSOP</author><pubDate>Wed, 17 Dec 2008 08:26:00 GMT</pubDate><guid>http://www.cnitblog.com/sysop/archive/2008/12/17/52720.html</guid><description><![CDATA[<span  style="color: rgb(51, 51, 51); font-family: Georgia; font-size: 14px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><p class="docText" style="line-height: normal; "><font size="4" style="line-height: normal; ">PHP is a programming language that's used mostly for building web sites. Instead of a PHP program running on a desktop computer for the use of one person, it typically runs on a web server and is accessed by lots of people using web browsers on their own computers. This section explains how PHP fits into the interaction between a web browser and a web server.</font></p><p class="docText" style="line-height: normal; "><font size="4" style="line-height: normal; ">When you sit down at your computer and pull up a web page using a browser such as Internet Explorer or Mozilla, you cause a little conversation to happen over the Internet between your computer and another computer. This conversation and how it makes a web page appear on your screen is illustrated in&#160;<a href="http://hi.baidu.com/coofucoo/blog/item/a4d6b01c5204b78e87d6b669.html#learnphp5-CHP-1-FIG-1" class="docLink" style="line-height: normal; ">Figure 1-1</a>.</font></p><font size="4" style="line-height: normal; "><br style="line-height: normal; "></font><p style="line-height: normal; "></p><center style="max-width: none !important; text-transform: none !important; direction: inherit !important; vertical-align: baseline !important; word-spacing: normal !important; font-variant: normal !important; text-decoration: none !important; border-top-style: none !important; border-right-style: none !important; border-bottom-style: none !important; border-left-style: none !important; border-width: initial !important; border-color: initial !important; background-repeat: initial !important; background-attachment: initial !important; -webkit-background-clip: initial !important; -webkit-background-origin: initial !important; background-color: initial !important; background-image: none !important; overflow-x: visible !important; overflow-y: visible !important; width: auto !important; clear: both !important; float: none !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; position: static !important; visibility: visible !important; letter-spacing: normal !important; font-size: 12px !important; font-family: Arial !important; filter: none !important; display: block !important; line-height: normal; background-position: initial initial !important; "><h5 class="docFigureTitle" style="line-height: normal; "><font size="4" style="line-height: normal; ">Figure 1-1. Client and server communication without PHP</font></h5><font size="4" style="line-height: normal; "><br style="line-height: normal; "></font></center><div align="center" forimg="1" style="word-wrap: break-word; word-break: break-all; visibility: visible !important; filter: none; line-height: normal; font-family: Georgia; font-size: 14px; "><font size="4" style="line-height: normal; "><img border="0" src="http://hiphotos.baidu.com/coofucoo/pic/item/bbecf31f1dab6ae7e0fe0bf2.jpg" small="0" class="blogimg" style="line-height: normal; "></font></div><font size="4" style="line-height: normal; "><br style="line-height: normal; "></font><p class="docText" style="line-height: normal; "><font size="4" style="line-height: normal; ">Here's what's happening in the numbered steps of the diagram:</font></p><font size="4" style="line-height: normal; "><span style="font-weight: bold; line-height: normal; "><ol type="1" class="docList" style="line-height: normal; "><li style="line-height: normal; "><span style="font-weight: normal; line-height: normal; "><p class="docList" style="line-height: normal; ">You type&#160;<span class="docEmphasis" style="line-height: normal; ">www.example.com/catalog.html</span>&#160;into the location bar of Internet Explorer.</p></span></li><li style="line-height: normal; "><span style="font-weight: normal; line-height: normal; "><p class="docList" style="line-height: normal; ">Internet Explorer sends a message over the Internet to the computer named&#160;<tt style="line-height: normal; ">www.example.com</tt>&#160;asking for the<span class="docEmphasis" style="line-height: normal; ">/catalog.html</span>&#160;page.</p></span></li><li style="line-height: normal; "><span style="font-weight: normal; line-height: normal; "><p class="docList" style="line-height: normal; ">Apache, a program running on the&#160;<tt style="line-height: normal; ">www.example.com</tt>&#160;computer, gets the message and reads the&#160;<span class="docEmphasis" style="line-height: normal; ">catalog.html</span>&#160;file from the disk drive.</p></span></li><li style="line-height: normal; "><span style="font-weight: normal; line-height: normal; "><p class="docList" style="line-height: normal; ">Apache sends the contents of the file back to your computer over the Internet as a response to Internet Explorer's request.</p></span></li><li style="line-height: normal; "><span style="font-weight: normal; line-height: normal; "><p class="docList" style="line-height: normal; ">Internet Explorer displays the page on the screen, following the instructions of the HTML tags in the page.</p></span></li></ol></span></font><p class="docText" style="line-height: normal; "><font size="4" style="line-height: normal; ">Every time a browser asks for&#160;<span class="docEmphasis" style="line-height: normal; ">http://www.example.com/catalog.html</span>, the web server sends back the contents of the same&#160;<span class="docEmphasis" style="line-height: normal; ">catalog.html</span>&#160;file. The only time the response from the web server changes is if someone edits the file on the server.</font></p><p class="docText" style="line-height: normal; "><font size="4" style="line-height: normal; ">When PHP is involved, however, the server does more work for its half of the conversation.&#160;<a href="http://hi.baidu.com/coofucoo/blog/item/a4d6b01c5204b78e87d6b669.html#learnphp5-CHP-1-FIG-2" class="docLink" style="line-height: normal; ">Figure 1-2</a>&#160;shows what happens when a web browser asks for a page that is generated by PHP.</font></p><font size="4" style="line-height: normal; "><br style="line-height: normal; "></font><p style="line-height: normal; "></p><center style="max-width: none !important; text-transform: none !important; direction: inherit !important; vertical-align: baseline !important; word-spacing: normal !important; font-variant: normal !important; text-decoration: none !important; border-top-style: none !important; border-right-style: none !important; border-bottom-style: none !important; border-left-style: none !important; border-width: initial !important; border-color: initial !important; background-repeat: initial !important; background-attachment: initial !important; -webkit-background-clip: initial !important; -webkit-background-origin: initial !important; background-color: initial !important; background-image: none !important; overflow-x: visible !important; overflow-y: visible !important; width: auto !important; clear: both !important; float: none !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; position: static !important; visibility: visible !important; letter-spacing: normal !important; font-size: 12px !important; font-family: Arial !important; filter: none !important; display: block !important; line-height: normal; background-position: initial initial !important; "><h5 class="docFigureTitle" style="line-height: normal; "><font size="4" style="line-height: normal; ">Figure 1-2. Client and server communication with PHP</font></h5><div align="center" forimg="1" style="word-wrap: break-word; word-break: break-all; visibility: visible !important; filter: none; line-height: normal; font-family: Georgia; font-size: 14px; "><font size="4" style="line-height: normal; "><img border="0" src="http://hiphotos.baidu.com/coofucoo/pic/item/c652362a37df572a5343c1fc.jpg" small="0" class="blogimg" style="line-height: normal; "></font></div><font size="4" style="line-height: normal; "><br style="line-height: normal; "></font></center><font size="4" style="line-height: normal; "><br style="line-height: normal; "></font><p class="docText" style="line-height: normal; "><font size="4" style="line-height: normal; ">Here's what's happening in the numbered steps of the PHP-enabled conversation:</font></p><font size="4" style="line-height: normal; "><span style="font-weight: bold; line-height: normal; "><ol type="1" class="docList" style="line-height: normal; "><li style="line-height: normal; "><span style="font-weight: normal; line-height: normal; "><p class="docList" style="line-height: normal; ">You type&#160;<span class="docEmphasis" style="line-height: normal; ">www.example.com/catalog/yak.php</span>&#160;into the location bar of Internet Explorer.</p></span></li><li style="line-height: normal; "><span style="font-weight: normal; line-height: normal; "><p class="docList" style="line-height: normal; ">Internet Explorer sends a message over the Internet to the computer named&#160;<tt style="line-height: normal; ">www.example.com</tt>&#160;asking for the<span class="docEmphasis" style="line-height: normal; ">/catalog/yak.php</span>&#160;page.</p></span></li><li style="line-height: normal; "><span style="font-weight: normal; line-height: normal; "><p class="docList" style="line-height: normal; ">Apache, a program running on the&#160;<tt style="line-height: normal; ">www.example.com</tt>&#160;computer, gets the message and asks the PHP interpreter, another program running on the&#160;<tt style="line-height: normal; ">www.example.com</tt>&#160;computer, "What does&#160;<span class="docEmphasis" style="line-height: normal; ">/catalog/yak.php</span>&#160;look like?"</p></span></li><li style="line-height: normal; "><span style="font-weight: normal; line-height: normal; "><p class="docList" style="line-height: normal; ">The PHP interpreter reads the file&#160;<span class="docEmphasis" style="line-height: normal; ">/usr/local/www/catalog/yak.php</span>&#160;from the disk drive.</p></span></li><li style="line-height: normal; "><span style="font-weight: normal; line-height: normal; "><p class="docList" style="line-height: normal; ">The PHP interpreter runs the commands in&#160;<span class="docEmphasis" style="line-height: normal; ">yak.php</span>, possibly exchanging data with a database program such as MySQL.</p></span></li><li style="line-height: normal; "><span style="font-weight: normal; line-height: normal; "><p class="docList" style="line-height: normal; ">The PHP interpreter takes the&#160;<span class="docEmphasis" style="line-height: normal; ">yak.php</span>&#160;program output and sends it back to Apache as an answer to "What does<span class="docEmphasis" style="line-height: normal; ">/catalog/yak.php</span>&#160;look like?"</p></span></li><li style="line-height: normal; "><span style="font-weight: normal; line-height: normal; "><p class="docList" style="line-height: normal; ">Apache sends the page contents it got from the PHP interpreter back to your computer over the Internet in response to Internet Explorer's request.</p></span></li><li style="line-height: normal; "><span style="font-weight: normal; line-height: normal; "><p class="docList" style="line-height: normal; ">Internet Explorer displays the page on the screen, following the instructions of the HTML tags in the page.</p></span></li></ol></span></font><p class="docText" style="line-height: normal; "><font size="4" style="line-height: normal; ">"PHP" is a programming language. Something in the web server reads your PHP programs, which are instructions written in this programming language, and figures out what to do. The "PHP interpreter" follows your instructions. Programmers often say "PHP" when they mean either the programming language or the interpreter. In this book, I mean the language when I say "PHP." When I say "PHP interpreter," I mean the thing that follows the commands in the PHP programs you write and that generates web pages.</font></p><p class="docText" style="line-height: normal; "><font size="4" style="line-height: normal; ">If PHP (the programming language) is like English (the human language), then the PHP interpreter is like an English-speaking person. The English language defines various words and combinations that, when read or heard by an English-speaking person, translate into various meanings that cause the person to do things such as feel embarrassed, go to the store to buy some milk, or put on pants. The programs you write in PHP (the programming language) cause the PHP interpreter to do things such as talk to a database, generate a personalized web page, or display an image.</font></p></span>
<img src ="http://www.cnitblog.com/sysop/aggbug/52720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sysop/" target="_blank">SYSOP</a> 2008-12-17 16:26 <a href="http://www.cnitblog.com/sysop/archive/2008/12/17/52720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 技巧：让进程在后台可靠运行的几种方法</title><link>http://www.cnitblog.com/sysop/archive/2008/12/09/52379.html</link><dc:creator>SYSOP</dc:creator><author>SYSOP</author><pubDate>Tue, 09 Dec 2008 06:22:00 GMT</pubDate><guid>http://www.cnitblog.com/sysop/archive/2008/12/09/52379.html</guid><description><![CDATA[<p>参见</p>
<p><a href="http://www.ibm.com/developerworks/cn/linux/l-cn-nohup/index.html">http://www.ibm.com/developerworks/cn/linux/l-cn-nohup/index.html</a></p>
<img src ="http://www.cnitblog.com/sysop/aggbug/52379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sysop/" target="_blank">SYSOP</a> 2008-12-09 14:22 <a href="http://www.cnitblog.com/sysop/archive/2008/12/09/52379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小知识点: Zend Optimizer是什么?</title><link>http://www.cnitblog.com/sysop/archive/2008/11/26/51906.html</link><dc:creator>SYSOP</dc:creator><author>SYSOP</author><pubDate>Wed, 26 Nov 2008 09:38:00 GMT</pubDate><guid>http://www.cnitblog.com/sysop/archive/2008/11/26/51906.html</guid><description><![CDATA[<strong><font color=#8b0000 size=5>小知识点: Zend Optimizer是什么??<br><br><br></font></strong>&nbsp;&nbsp;Zend Optimizer(以下简称ZO)用优化代码的方法来提高php应用程序的执行速度。实现的原理是对那些在被最终执行之前由运行编译器(Run-Time Compiler)产生的代码进行优化。 优化能提高你的盈利能力 <br><br>&nbsp;&nbsp;一般情况下，执行使用ZO的php程序比不使用的要快40%到100%。这意味着网站的访问者可以更快的浏览网页，从而完成更多的事务，创造更好的客户满意度。更快的反应同时也意味着可以节省硬件投资，并增强网站所提供的服务。所以，使用ZO，就等于提高了电子商务的盈利能力。 <br><br>&nbsp;&nbsp;ZO能给php用户带来很多益处，特别是那些运营网站的人。快速运行php程序可以显著降低服务器的CpU负载，并可以减少一半的反应时间，也就是从访问者点击链接到服务器开始读取页面之间的时间。<br><br><br>　为什么要用ZO，难道PHP还不够快吗？ <br>　　的确，用于PHP的标准运行编译器已经够快了--相同情况下比PHP早期版本要快2-10倍。但使用了ZO的PHP程序的执行速度还会加快40%到100%。 <br><br>　ZO在PHP软件安装的什么位置？ <br>　　ZO位于PHP的ZEND引擎中，介于运行编译器和最终执行器之间。 <br><br>　ZO的最终发布版本要付费吗？ <br>　　不要。ZO的最终版本将继续作为免费软件来发布。ZEND技术公司不打算对任何ZO版本收费。 
<img src ="http://www.cnitblog.com/sysop/aggbug/51906.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sysop/" target="_blank">SYSOP</a> 2008-11-26 17:38 <a href="http://www.cnitblog.com/sysop/archive/2008/11/26/51906.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>推荐的 PHP 读物列表</title><link>http://www.cnitblog.com/sysop/archive/2008/11/24/51844.html</link><dc:creator>SYSOP</dc:creator><author>SYSOP</author><pubDate>Mon, 24 Nov 2008 07:21:00 GMT</pubDate><guid>http://www.cnitblog.com/sysop/archive/2008/11/24/51844.html</guid><description><![CDATA[<blockquote>
<p>这是一份 IBM 的 Web 应用程序开发人员编写的 PHP 读物列表，适合程序员和管理员学习 PHP（超文本预处理器）。</p>
<p><a href="http://www.ibm.com/developerworks/cn/opensource/os-php-read/#overview">http://www.ibm.com/developerworks/cn/opensource/os-php-read/#overview</a></p>
</blockquote>
<img src ="http://www.cnitblog.com/sysop/aggbug/51844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sysop/" target="_blank">SYSOP</a> 2008-11-24 15:21 <a href="http://www.cnitblog.com/sysop/archive/2008/11/24/51844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LAMP 系统性能调优，第 1 部分: 理解 LAMP 架构</title><link>http://www.cnitblog.com/sysop/archive/2008/11/18/51657.html</link><dc:creator>SYSOP</dc:creator><author>SYSOP</author><pubDate>Tue, 18 Nov 2008 09:48:00 GMT</pubDate><guid>http://www.cnitblog.com/sysop/archive/2008/11/18/51657.html</guid><description><![CDATA[<p>请参考以下文章：</p>
<p><a href="http://www.ibm.com/developerworks/cn/linux/l-tune-lamp-1/index.html">http://www.ibm.com/developerworks/cn/linux/l-tune-lamp-1/index.html</a></p>
<img src ="http://www.cnitblog.com/sysop/aggbug/51657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sysop/" target="_blank">SYSOP</a> 2008-11-18 17:48 <a href="http://www.cnitblog.com/sysop/archive/2008/11/18/51657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>技巧：提示行魔术</title><link>http://www.cnitblog.com/sysop/archive/2008/11/18/51656.html</link><dc:creator>SYSOP</dc:creator><author>SYSOP</author><pubDate>Tue, 18 Nov 2008 09:46:00 GMT</pubDate><guid>http://www.cnitblog.com/sysop/archive/2008/11/18/51656.html</guid><description><![CDATA[<p>请参考 <a href="http://www.ibm.com/developerworks/cn/linux/l-tip-prompt/tip01/">http://www.ibm.com/developerworks/cn/linux/l-tip-prompt/tip01/</a></p>
<img src ="http://www.cnitblog.com/sysop/aggbug/51656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sysop/" target="_blank">SYSOP</a> 2008-11-18 17:46 <a href="http://www.cnitblog.com/sysop/archive/2008/11/18/51656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux I/O重定向的一些小技巧</title><link>http://www.cnitblog.com/sysop/archive/2008/11/06/51144.html</link><dc:creator>SYSOP</dc:creator><author>SYSOP</author><pubDate>Thu, 06 Nov 2008 09:53:00 GMT</pubDate><guid>http://www.cnitblog.com/sysop/archive/2008/11/06/51144.html</guid><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width="100%">
            <h1>技巧：Linux I/O重定向的一些小技巧</h1>
            <img class=display-img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=1></td>
            <td class=no-print width=192></td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width=10><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></td>
            <td width="100%">
            <p>级别： 初级</p>
            <p><a href="http://www.ibm.com/developerworks/cn/linux/l-iotips/index.html#author" cmImpressionSent="1"><font color=#5c81a7>樊奇</font></a> (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#102;&#97;&#110;&#113;&#105;&#64;&#99;&#110;&#46;&#105;&#98;&#109;&#46;&#99;&#111;&#109;&#63;&#115;&#117;&#98;&#106;&#101;&#99;&#116;&#61;&#25216;&#24039;&#65306;&#76;&#105;&#110;&#117;&#120;&#32;&#73;&#47;&#79;&#37325;&#23450;&#21521;&#30340;&#19968;&#20123;&#23567;&#25216;&#24039;" cmImpressionSent="1"><font color=#5c81a7>fanqi@cn.ibm.com</font></a>), Xseries eServer 工程师, IBM TSS China Beijing<br></p>
            <p>2004 年 11 月 01 日</p>
            <blockquote>Linux I/O 重定向虽然很简单，但在脚本编写、系统管理时却要常常打交道，搞清其中使用技巧非常有用。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
            <p>首先说一下什么是I/O重定向，所谓I/O重定向简单来说就是一个过程，这个过程捕捉一个文件，或者命令，程序，脚本，甚至脚本中的代码块（code block）的输出，然后把捕捉到的输出，作为输入发送给另外一个文件，命令，程序，或者脚本。</p>
            <p>如果谈到I/O重定向，就涉及到文件标识符(File Descriptor)的概念, 在Linux系统中，系统为每一个打开的文件指定一个文件标识符以便系统对文件进行跟踪，这里有些和C语言编程里的文件句柄相似，文件标识符是一个数字，不同数字代表不同的含义，默认情况下，系统占用了3个，分别是0标准输入（stdin）,1标准输出(stdout), 2标准错误(stderr), 另外3-9是保留的标识符，可以把这些标识符指定成标准输入，输出或者错误作为临时连接。通常这样可以解决很多复杂的重定向请求。</p>
            <p>标准输入通常指键盘的输入 <br>标准输出通常指显示器的输出 <br>标准错误通常也是定向到显示器 </p>
            <p>请看以下例子，来描述一下他们的关系</p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>#ls /dev
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>这个命令列出/dev目录下的所有文件，在屏幕上输出结果。</p>
            <p>这里 /dev 就是作为命令ls的标准输入（从键盘输入），而打印在屏幕的结果就是标准输出（/dev目录中的内容）</p>
            <p>还是回到标题，重定向就是把标准的输入或者输出更改成其他的方式，请参看如下例子 <br>或者等同于 </p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>#ls /dev 1&gt;filename                                  #注意："1"和"&gt;"中间没有空格
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>以上命令会把命令的标准输出重新定向到一个文件filename,而不是显示到屏幕上，如果不指明文件标识符，系统默认的就是1, 因此1可以省略</p>
            <p>如果把上面例子重的"&gt;"改成"&gt;&gt;"则表示把输出追加到filename文件的末尾，如果文件不存在则创建它。如下</p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>#ls /dev &gt;&gt;filename
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>也可以把标准错误重新定向到文件</p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>#ls -qw  /dev  2&gt;filename
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>显然 -qw是一个错误参数，通常会在显示器上报告一个错误信息，但由于把2标准错误（stderr）重新定向到了文件filename，因此显示器没有错误信息，而信息写到了文件里面</p>
            <p>以下命令是把标准输出和错误都定向到文件</p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>#ls /dev &amp;&gt;filename
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>"&amp;"在这里代表标准输出和标准错误，这里无论是正常输出还是错误信息都写到filename中了。</p>
            <p>重新定义标准输入，输出，和错误的文件标识符</p>
            <p>重新定义文件标识符可以用i&gt;&amp;j命令，表示把文件标识符i重新定向到j，你可以把"&amp;"理解为"取地址"</p>
            <p>请看以下例子</p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>#exec 5&gt;&amp;1
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>表示把文件标识符5定向到标准输出，这个命令通常用来临时保存标准输入。</p>
            <p>同样标准输入也是可以重新定向的，请参考下面例子</p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode># grep search-word &lt;filename或者grep search-word 0&lt;filename
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>一般来说grep命令在给定文件中搜索字符串，以上命令把文件filename作为grep命令的标准输入，而不是从键盘输入。</p>
            <p>前面曾经提到，系统为每一个打开的文件指定一个文件标识符以便系统对文件进行跟踪，那么默认的文件标识符是什么呢？答案是0，也就是标准输入，或者可以说从键盘输入。当然这个文件标识符也可以自己指定，请参考下面例子</p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>#echo 123456789 &gt;filename   把字符串写到文件filename中
                        #exec 3&lt;&gt;filename           把文件filename打开，并指定文件标识符为3
                        #read -n 4 &lt;&amp;3              从文件中读4个字符，句柄已经指到第四个字符末尾
                        #echo -n . &gt;&amp;3              在第5个字符处写一个点，覆盖第5个字符，-n表示不换行
                        #exec 3&gt;&amp;-	          关闭文件标识符3
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>现在cat filename文件的结果就成了1234.6789</p>
            <p>命令j&lt;&gt;filename表示把文件打开，并指明文件标识符为j <br>"&amp;-"表示关闭文件标识符 </p>
            <p>有关关闭文件标识符的操作请参考下面</p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>n&lt;&amp;- 关闭输入文件标识符n
                        0&lt;&amp;-或&lt;&amp;- 关闭标准输入stdin
                        n&gt;&amp;- 关闭输出文件标识符n
                        1&gt;&amp;-或&gt;&amp;-关闭标准输出stdout
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>另外还有一些其他命令，如下参考</p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>2.	：&gt; filename 或者 &gt; filename
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>表示把文件filename设置成空，也就是清空文件内容，如果文件不存在，则创建一个空文件，（等同于touch命令） ：表示一个空输出，两个命令的唯一区别就是&gt;filename不是在所有shell都可以正常工作的。</p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cnitblog.com/sysop/aggbug/51144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sysop/" target="_blank">SYSOP</a> 2008-11-06 17:53 <a href="http://www.cnitblog.com/sysop/archive/2008/11/06/51144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>bash实现“多进程”</title><link>http://www.cnitblog.com/sysop/archive/2008/11/03/50974.html</link><dc:creator>SYSOP</dc:creator><author>SYSOP</author><pubDate>Sun, 02 Nov 2008 16:58:00 GMT</pubDate><guid>http://www.cnitblog.com/sysop/archive/2008/11/03/50974.html</guid><description><![CDATA[<p>在bash中，使用后台任务来实现任务的&#8220;多进程化&#8221;。在不加控制的模式下，不管有多少任务，全部都后台执行。也就是说，在这种情况下，有多少任务就有多少&#8220;进程&#8221;在同时执行。我们就先实现第一种情况：</p>
<p>实例一：正常情况脚本</p>
<p>&nbsp;</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: #008000">#</span><span style="COLOR: #008000">!/bin/bash</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;((i</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #800000">5</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">));</span><span style="COLOR: #0000ff">do</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;{<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">sleep</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">3</span><span style="COLOR: #000000">;echo&nbsp;</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">aa&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;echo&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000">done!</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</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;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">wait</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>cat&nbsp;aa</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">wc&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">l<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>rm&nbsp;aa</span></div>
<p>&nbsp;</p>
<p>这种情况下，程序顺序执行，每个循环3s，共需15s左右。</p>
<p>&nbsp;</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;</span><span style="COLOR: #0000ff">time</span><span style="COLOR: #000000">&nbsp;bash&nbsp;test</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">sh&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800000">5</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>real&nbsp;&nbsp;&nbsp;&nbsp;0m15</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">030s<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>user&nbsp;&nbsp;&nbsp;&nbsp;0m0</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">002s<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0m0</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">003s</span></div>
<p>&nbsp;</p>
<p>实例二：&#8220;多进程&#8221;实现</p>
<p>&nbsp;</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: #008000">#</span><span style="COLOR: #008000">!/bin/bash</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;((i</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #800000">5</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">));</span><span style="COLOR: #0000ff">do</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;{<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">sleep</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">3</span><span style="COLOR: #000000">;echo&nbsp;</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">aa&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;echo&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000">done!</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</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;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">wait</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>cat&nbsp;aa</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">wc&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">l<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>rm&nbsp;aa</span></div>
<p>&nbsp;</p>
<p>这个实例实际上就在上面基础上多加了一个后台执行&amp;符号，此时应该是5个循环任务并发执行，最后需要3s左右时间。</p>
<p>&nbsp;</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;</span><span style="COLOR: #0000ff">time</span><span style="COLOR: #000000">&nbsp;bash&nbsp;test</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">sh&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800000">5</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>real&nbsp;&nbsp;&nbsp;&nbsp;0m3</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">011s<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>user&nbsp;&nbsp;&nbsp;&nbsp;0m0</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">002s<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0m0</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">004s</span></div>
<p>&nbsp;</p>
<p>效果非常明显。</p>
<p>这里需要说明一下wait的左右。wait是等待前面的后台任务全部完成才往下执行，否则程序本身是不会等待的，这样对后面依赖前面任务结果的命令来说就可能出错。例如上面wc -l的命令就报错：不存在aa这个文件。</p>
<p>wait命令的官方解释如下：</p>
<p>&nbsp;</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wait&nbsp;[n]<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>Wait&nbsp;for&nbsp;the&nbsp;specified&nbsp;process&nbsp;and&nbsp;return&nbsp;its&nbsp;termination&nbsp;status.&nbsp;&nbsp;n&nbsp;may&nbsp;be&nbsp;a&nbsp;process&nbsp;ID&nbsp;or&nbsp;&nbsp;a&nbsp;&nbsp;job&nbsp;&nbsp;specification;&nbsp;if&nbsp;a&nbsp;job&nbsp;spec&nbsp;is&nbsp;given,&nbsp;all&nbsp;processes&nbsp;in&nbsp;that&nbsp;job's&nbsp;pipeline&nbsp;are&nbsp;waited&nbsp;for.&nbsp;&nbsp;If&nbsp;n&nbsp;is&nbsp;not&nbsp;given,&nbsp;all&nbsp;currently&nbsp;active&nbsp;child&nbsp;processes&nbsp;are&nbsp;waited&nbsp;for,&nbsp;and&nbsp;the&nbsp;return&nbsp;status&nbsp;is&nbsp;zero.&nbsp;&nbsp;If&nbsp;&nbsp;n&nbsp;&nbsp;specifies&nbsp;&nbsp;a&nbsp;&nbsp;non-existent process&nbsp;&nbsp;or&nbsp;job,&nbsp;the&nbsp;return&nbsp;status&nbsp;is&nbsp;127.&nbsp;&nbsp;Otherwise,&nbsp;the&nbsp;return&nbsp;status&nbsp;is&nbsp;the&nbsp;exit&nbsp;status&nbsp;of&nbsp;the&nbsp;last&nbsp;processor&nbsp;job&nbsp;waited&nbsp;for.</span></div>
<p>&nbsp;</p>
<p>以上所讲的实例都是进程数目不可控制的情况，下面描述如何准确控制并发的进程数目。</p>
<p>&nbsp;</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: #008000">#</span><span style="COLOR: #008000">!/bin/bash<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;2006-7-12,&nbsp;by&nbsp;wwy<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>#-----------------------------------------------------------------------------------<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;此例子说明了一种用wait、read命令模拟多线程的一种技巧<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;此技巧往往用于多主机检查，比如ssh登录、ping等等这种单进程比较慢而不耗费cpu的情况<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;还说明了多线程的控制<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>#-----------------------------------------------------------------------------------</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>function&nbsp;a_sub&nbsp;{&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;此处定义一个函数，作为一个线程(子进程)</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">sleep</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">3</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;线程的作用是sleep&nbsp;3s</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">}<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>tmp_fifofile</span><span style="COLOR: #000000">=</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000">/tmp/$$.fifo</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>mkfifo&nbsp;</span><span style="COLOR: #800080">$tmp_fifofile</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;新建一个fifo类型的文件</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">exec</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">6</span><span style="COLOR: #000000">&lt;&gt;</span><span style="COLOR: #800080">$tmp_fifofile</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;将fd6指向fifo类型</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">rm&nbsp;</span><span style="COLOR: #800080">$tmp_fifofile</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>thread</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">15</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;此处定义线程数</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;((i</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #800080">$thread</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">));</span><span style="COLOR: #0000ff">do</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>echo<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done&nbsp;</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #800000">6</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;事实上就是在fd6中放置了$thread个回车符</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;((i</span><span style="COLOR: #000000">=</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #800000">50</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">));</span><span style="COLOR: #0000ff">do</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;50次循环，可以理解为50个主机，或其他</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">read</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">u6&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;一个read&nbsp;-u6命令执行一次，就从fd6中减去一个回车符，然后向下执行，<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>#&nbsp;fd6中没有回车符的时候，就停在这了，从而实现了线程数量控制</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>{&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;此处子进程开始执行，被放到后台</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;a_sub&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;{&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;此处可以用来判断子进程的逻辑</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;echo&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000">a_sub&nbsp;is&nbsp;finished</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</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;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;{<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="FONT-WEIGHT: bold; COLOR: #000000">sub&nbsp;error</span><span style="FONT-WEIGHT: bold; COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #800000">6</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;当进程结束以后，再向fd6中加上一个回车符，即补上了read&nbsp;-u6减去的那个</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">}&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>done<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">wait</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;等待所有的后台子进程结束</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">exec</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">6</span><span style="COLOR: #000000">&gt;&amp;-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;关闭df6</span><span style="COLOR: #008000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">exit</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">0</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p>&nbsp;</p>
<p>sleep 3s，线程数为15，一共循环50次，所以，此脚本一共的执行时间大约为12秒</p>
<p>即：<br>15x3=45, 所以 3 x 3s = 9s<br>(50-45=5)&lt;15, 所以 1 x 3s = 3s <br>所以 9s + 3s = 12s</p>
<p>$ time ./multithread.sh &gt;/dev/null </p>
<p>real&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0m12.025s<br>user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0m0.020s<br>sys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0m0.064s</p>
<p><br>而当不使用多线程技巧的时候，执行时间为：50 x 3s = 150s。</p>
<p>此程序中的命令</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">mkfifo&nbsp;tmpfile</span></div>
<p>和linux中的命令</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">mknod&nbsp;tmpfile&nbsp;p</span></div>
<p>效果相同。区别是mkfifo为POSIX标准，因此推荐使用它。该命令创建了一个先入先出的管道文件，并为其分配文件标志符6。管道文件是进程之间通信的一种方式，注意这一句很重要</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: #0000ff">exec</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">6</span><span style="COLOR: #000000">&lt;&gt;</span><span style="COLOR: #800080">$tmp_fifofile</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;将fd6指向fifo类型</span></div>
<p>如果没有这句，在向文件<span style="COLOR: #800080">$tmp_fifofile<span style="COLOR: #000000">或者</span>&amp;6<span style="COLOR: #000000">写入数据时，程序会被阻塞，直到有read读出了管道文件中的数据为止。而执行了上面这一句后就可以在<span style="COLOR: #7c1775"><strong>程序运行期间</strong></span>不断向fifo类型的文件写入数据而不会阻塞，并且数据会被保存下来以供read程序读出。</span></span><br></p>
<img src ="http://www.cnitblog.com/sysop/aggbug/50974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sysop/" target="_blank">SYSOP</a> 2008-11-03 00:58 <a href="http://www.cnitblog.com/sysop/archive/2008/11/03/50974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从windows传脚本到linux的格式问题</title><link>http://www.cnitblog.com/sysop/archive/2008/11/03/50972.html</link><dc:creator>SYSOP</dc:creator><author>SYSOP</author><pubDate>Sun, 02 Nov 2008 16:00:00 GMT</pubDate><guid>http://www.cnitblog.com/sysop/archive/2008/11/03/50972.html</guid><description><![CDATA[<p>从windows上传一个shell脚本到linux（通过linux下rz二进制方式传送），执行该脚本时出错：</p>
<p>&nbsp;</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">+</span><span style="COLOR: #000000">&nbsp;$</span><span style="FONT-WEIGHT: bold; COLOR: #000000">'</span><span style="FONT-WEIGHT: bold; COLOR: #000000">\r</span><span style="FONT-WEIGHT: bold; COLOR: #000000">'</span><span style="COLOR: #000000"><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">&nbsp;command&nbsp;not&nbsp;foundline&nbsp;</span><span style="COLOR: #800000">2</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>multithread</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">sh</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">&nbsp;line&nbsp;</span><span style="COLOR: #800000">48</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">&nbsp;syntax&nbsp;error</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">&nbsp;unexpected&nbsp;end&nbsp;of&nbsp;file<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p>&nbsp;</p>
<p>查看文件发现，脚本总共才47行，根本没有48行。</p>
<p>怀疑是从windows传送文件时文件格式有问题，在windows下换行符为两个字符/r（回车）/n（换行），而在linux下换行符只需要一个字符/n，所以多出一个/r控制符。</p>
<p>在vim下set list，没有发现可以的控制字符，不知道怎么回事。</p>
<p>使用dos2unix对文件格式进行了调整：</p>
<p>&nbsp;</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;dos2unix&nbsp;multithread</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">sh<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>dos2unix</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">&nbsp;converting&nbsp;file&nbsp;multithread</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">sh&nbsp;to&nbsp;UNIX&nbsp;</span><span style="COLOR: #0000ff">format</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000"><img src="http://www.cnitblog.com/Images/dot.gif"></span></div>
<p>&nbsp;</p>
<p>格式化完毕后发现文件果然变了，</p>
<p>&nbsp;</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">-</span><span style="COLOR: #000000">rw</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">r</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">r</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000">&nbsp;wangkun&nbsp;wangkun&nbsp;</span><span style="COLOR: #800000">1232</span><span style="COLOR: #000000">&nbsp;Nov&nbsp;&nbsp;</span><span style="COLOR: #800000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">23</span><span style="COLOR: #000000">:</span><span style="COLOR: #800000">51</span><span style="COLOR: #000000">&nbsp;multithread</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">sh<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">rw</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">r</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">r</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #800000">1</span><span style="COLOR: #000000">&nbsp;wangkun&nbsp;wangkun&nbsp;</span><span style="COLOR: #800000">1281</span><span style="COLOR: #000000">&nbsp;Nov&nbsp;&nbsp;</span><span style="COLOR: #800000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">23</span><span style="COLOR: #000000">:</span><span style="COLOR: #800000">45</span><span style="COLOR: #000000">&nbsp;multithread</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">sh</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">bk</span></div>
<p>&nbsp;</p>
<p>连大小都变了。又vim进去看了一下，还是没发现有什么不同。但diff了一下内容，发现内容全都显示出来，表明全都不同。</p>
<p>突发奇想，使用rz命令以ASIIC格式重新传了一下文件，竟然直接就可以执行了，<span>看来在windows和linux下传输脚本时选择<span style="COLOR: #ff0000">ASIIC格式传输</span>是比较保险的一种方式。</span></p>
<p><span></span>&nbsp;</p>
<img src ="http://www.cnitblog.com/sysop/aggbug/50972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sysop/" target="_blank">SYSOP</a> 2008-11-03 00:00 <a href="http://www.cnitblog.com/sysop/archive/2008/11/03/50972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标准、规范和概念</title><link>http://www.cnitblog.com/sysop/archive/2008/11/02/50960.html</link><dc:creator>SYSOP</dc:creator><author>SYSOP</author><pubDate>Sun, 02 Nov 2008 09:01:00 GMT</pubDate><guid>http://www.cnitblog.com/sysop/archive/2008/11/02/50960.html</guid><description><![CDATA[<p>XML 语言</p>
<p><a href="http://baike.baidu.com/view/63.htm">http://baike.baidu.com/view/63.htm</a></p>
<img src ="http://www.cnitblog.com/sysop/aggbug/50960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sysop/" target="_blank">SYSOP</a> 2008-11-02 17:01 <a href="http://www.cnitblog.com/sysop/archive/2008/11/02/50960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IT博客网需要改进的地方</title><link>http://www.cnitblog.com/sysop/archive/2007/11/16/36381.html</link><dc:creator>SYSOP</dc:creator><author>SYSOP</author><pubDate>Fri, 16 Nov 2007 11:56:00 GMT</pubDate><guid>http://www.cnitblog.com/sysop/archive/2007/11/16/36381.html</guid><description><![CDATA[<p>使用IT博客网也有一段时间了，发现有一些问题需要改进。<br></p>
<ul>
    <li>文章分类和随笔分类不支持多级菜单
    <li>分类不可以随便移动顺序
    <li>没有个人log显示
    <li>编辑菜单反应速度太慢 </li>
</ul>
<p>希望这些问题能够早日得到解决，祝IT博客网越办越好！<br></p>
<p><img height=490 alt="" src="http://www.cnitblog.com/images/cnitblog_com/sysop/22.jpg" width=515 border=0></p>
<img src ="http://www.cnitblog.com/sysop/aggbug/36381.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/sysop/" target="_blank">SYSOP</a> 2007-11-16 19:56 <a href="http://www.cnitblog.com/sysop/archive/2007/11/16/36381.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>