<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
    <channel>
        <title>斯巴达第二季</title>
        <link>http://donghao.org/</link>
        <description>                                  董昊</description>
        <language>en</language>
        <copyright>Copyright 2010</copyright>
        <lastBuildDate>Tue, 09 03 2010 17:10:38 +0800</lastBuildDate>
        <generator>http://www.sixapart.com/movabletype/</generator>
        <docs>http://www.rssboard.org/rss-specification</docs>
        
        <item>
            <title>[linux-kernel] 实现支持poll的驱动设备</title>
            <description><![CDATA[<p id="zw-12742149c23VdvvpE2dbd2a"><span id="zw-1274216612e1anvVM2dbd2a">作者：董昊 （要转载的同学帮忙把名字和博客链接<span id="zw-1274216ba03q9sYVS2dbd2a" class="smarterwiki-linkify"><a target="_blank" id="zw-1274216c6875L0hqh2dbd2a" title="http://donghao.org/uii/" href="http://donghao.org/uii/">http://donghao.org/uii/</a>带上，多谢了！</span>)</span></p>
<p id="zw-1274216e2b8im530L2dbd2a"><br id="zw-1274216e2b8C97xB12dbd2a" /></p>
<p id="zw-127422e3b2eRcrUWS2dbd2a"><a target="_blank" id="zw-127422e3b2fQv3BFG2dbd2a" title="ldd3" href="http://www.deansys.com/doc/ldd3/index.html">ldd3</a>上已经讲了如何开发linux下的驱动程序，怎么让该设备支持poll（和epoll），但是不够详细，这里给个例子。假设实现一个misc设备，为了实现poll，当然要有个wait_queue，注意，是dev带wait_queue，我一疏忽把wait_queue带到file上去了，调了半天才发现这个低级错误。</p>
<p id="zw-1274219a5910EaT3-2dbd2a"><br id="zw-1274219ab24KJUFOv2dbd2a" />
</p>
<p id="zw-1274219ab23FpQP2m2dbd2a">struct sample_dev</p>
<p id="zw-1274219ec71dWIPRG2dbd2a">{</p>
<p id="zw-1274219f00eY1w_vW2dbd2a">&nbsp;&nbsp;&nbsp; struct miscdevice &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;misc;</p>
<p id="zw-127421a090a2gA7kq2dbd2a">&nbsp;&nbsp;&nbsp; wait_queue_head_t&nbsp;&nbsp;&nbsp; wait;</p>
<p id="zw-127421a3ccdjUnq2dbd2a">};</p>
<p id="zw-127421a4269h_F4cf2dbd2a"><br id="zw-127421a43463zpNJA2dbd2a" />
</p>
<p id="zw-127421a4345bHaxT32dbd2a">static struct sample_dev&nbsp;&nbsp;&nbsp; s_dev;</p>
<p id="zw-127421a71acZ7A9wd2dbd2a"><br id="zw-127421a724dzQIFR2dbd2a" />
</p>
<p id="zw-127421a724dB2050V2dbd2a">s_dev这个设备现在既可以当miscdevice用，同时又有了wait_queue</p>
<p id="zw-127421db060cel6R22dbd2a"><br id="zw-127421db11fEltqu2dbd2a" />
</p>
<p id="zw-127421db11fJmcAx2dbd2a">struct file_operations sample_fops =</p>
<p id="zw-127421de2ackqiOI2dbd2a">{</p>
<p id="zw-127421de48fqjVWXW2dbd2a">&nbsp;&nbsp;&nbsp; .owner&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = THIS_MODULE,</p>
<p id="zw-127421f7360LfKXT2dbd2a">&nbsp;&nbsp;&nbsp; .read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = sample_read,</p><p id="zw-127421f7360M92VeB2dbd2a">&nbsp;&nbsp;&nbsp; .write&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = sample_write,</p>
<p id="zw-127421e05b8wceVKa2dbd2a">&nbsp;&nbsp;<span id="zw-1274220ca294ZNVUV2dbd2a" style="color: rgb(255, 0, 0);">&nbsp; .poll&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = sample_poll,</span></p>
<p id="zw-127421f689asCEOd92dbd2a">};</p>
<p id="zw-127421aee8coh29J22dbd2a"><br id="zw-127421aefb9Ku9bHm2dbd2a" />
</p>
<p id="zw-127421aefb9YS2GFW2dbd2a">static int __init init_sample(void)</p>
<p id="zw-127421b848dQic6-k2dbd2a">{</p>
<p id="zw-127421b91feoGx6s02dbd2a">&nbsp;&nbsp;&nbsp; s_dev.misc.minor = MISC_DYNAMIC_MINOR;</p>
<p id="zw-127421bdaccapjcR2dbd2a">&nbsp;&nbsp;&nbsp; s_dev.misc.name = "poll_device_sample";</p>
<p id="zw-127421c1c86u4JHO_2dbd2a">&nbsp;&nbsp;&nbsp; s_dev.misc.fops&nbsp; = &amp;sample_fops;</p>
<p id="zw-127421cb535d8UHG2dbd2a">&nbsp;&nbsp;&nbsp;<span id="zw-12742209d83TYvm7_2dbd2a" style="color: rgb(255, 0, 0);"> init_waitqueue_head(&amp;s_dev.wait);</span><br id="zw-127421cb535vkHknX2dbd2a" />
</p>
<p id="zw-127421c561d5hH_ML2dbd2a">&nbsp;&nbsp;&nbsp; return misc_register(&amp;s_dev.misc);<br id="zw-127421c561dZZDf_2dbd2a" />
</p>
<p id="zw-127421c4a74IkS_632dbd2a">}</p>
<p id="zw-127421ceeceSDmeFB2dbd2a"><br id="zw-127421cf069ZQJiR2dbd2a" />
</p>
<p id="zw-127421cf069h5OwOX2dbd2a">static void __exit exit_sample(void)<br id="zw-127421cf069lqIMlY2dbd2a" />
</p>
<p id="zw-127421779daxoW4wp2dbd2a">{</p>
<p id="zw-127421d37e19Ox9hl2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;misc_unregister(&amp;s_dev.misc);<br id="zw-127421d37e1IYBNv-2dbd2a" />
</p>
<p id="zw-12742177d975mjUFl2dbd2a">}</p>
<p id="zw-12742200b77Cm9u02dbd2a"><br id="zw-12742200cb1s4-NQ2dbd2a" />
</p>
<p id="zw-127422eaae38fVyPv2dbd2a">这是设备的注册和注销。下面看sample_poll的做法，<a id="zw-127422eaae3G_5fO82dbd2a" href="http://www.deansys.com/doc/ldd3/ch06s03.html">和ldd3上说的一样</a>:</p>
<p id="zw-12742213b2363zC2J2dbd2a"><br id="zw-127422170bembKE02dbd2a" />
</p>
<p id="zw-127422170beHEn2A12dbd2a">unsigned int sample_poll(struct file* file, poll_table* wait)</p>
<p id="zw-1274221ceafCTuma2dbd2a">{</p>
<p id="zw-1274221d0ff2rnoAi2dbd2a">&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp;&nbsp; mask = 0;</p>
<p id="zw-1274221e9147rgl-n2dbd2a"><br id="zw-1274221eb34d7wb5w2dbd2a" />
</p>
<p id="zw-1274221eb343ITW2dbd2a">&nbsp;&nbsp;&nbsp; poll_wait(file, &amp;s_dev.wait, wait);</p>
<p id="zw-12742222532iq4pOX2dbd2a"><br id="zw-127422226078axJ532dbd2a" />
</p>
<p id="zw-12742222607DPyuv2dbd2a">&nbsp;&nbsp;&nbsp; /*&nbsp;if have something to read （代码省略）*/</p>
<p id="zw-12742226bd7nnlmB92dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mask |= POLLIN;</p>
<p id="zw-12742228b793S_SKX2dbd2a">&nbsp;&nbsp;&nbsp; /*&nbsp;if have something to write (代码省略）*/</p>
<p id="zw-1274222b8f5tZk6dR2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mask |= POLLOUT;</p>
<p id="zw-1274222cfacxsZde-2dbd2a">&nbsp;&nbsp;&nbsp; /* if some error occur （代码省略）*/</p>
<p id="zw-12742232a04oFrQy62dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mask |= POLLERR;</p>
<p id="zw-12742233cfeczyPBr2dbd2a"><br id="zw-12742233d9edohl72dbd2a" />
</p>
<p id="zw-12742233d9ewnUHFa2dbd2a">&nbsp;&nbsp;&nbsp; return mask;</p>
<p id="zw-127422350deWMnlNf2dbd2a">}</p>
<p id="zw-1274223f187y9rfU2dbd2a"><br id="zw-1274223f29f-d0JX2dbd2a" />
</p>
<p id="zw-1274225690b1tApoq2dbd2a">poll_wait是linux内核提供的，标准做法，所以最好这么用。在poll_wait里，current进程挂在了s_dev的wait_queue里，只有两种情况让他醒来：一个是poll系统调用超时（poll_table负责），另一个是读写唤醒他（后面的代码）。</p>
<p id="zw-1274225fbafL79vG2dbd2a"><br id="zw-12742260035LXOu4e2dbd2a" />
</p>
<p id="zw-12742260035jb1uM2dbd2a">sszie_t&nbsp;&nbsp;&nbsp; sample_read(struct file* file, char __user* buff, loff_t* pos)</p>
<p id="zw-1274226e3c8V73N0A2dbd2a">{</p>
<p id="zw-1274226e5c83SAbdN2dbd2a">&nbsp;&nbsp;&nbsp; /* do what you want to read（代码省略）*/</p>
<p id="zw-12742272b1fE67Rq2dbd2a">&nbsp;&nbsp;&nbsp; <span id="zw-12742287824LU0vvm2dbd2a" style="color: rgb(255, 0, 0);">wake_up_interruptible(&amp;s_dev.wait);&nbsp;</span></p>
<p id="zw-1274227c900ixDi9o2dbd2a">}</p>
<p id="zw-12742288364pQBi2dbd2a"><br id="zw-127422887adT5pGz2dbd2a" />
</p>
<p id="zw-127422a32e8v__OrK2dbd2a">由于读走了一些数据，缓冲区（代码没有详细写）有位置了，可以往里面写了，上面标红的行便唤醒随眠的进程，他（进程）醒来后就到了poll_wait语句的后面，开始查看缓冲区并置mask，最后返回。sample_write也是同样的实现方式。<br id="zw-127422aaee8eiEPgh2dbd2a" />
</p>
<p id="zw-127422aaee8UuxIX2dbd2a"><br id="zw-127422aaee8ncOQ_2dbd2a" />
</p>
<p id="zw-127422d1186lcV1N2dbd2a">以上代码只是例子，并不完整，但原理已经充分。这样实现的设备已经可以支持poll和epoll调用，当然，epoll的原理更为复杂，和上面说的过程有一些差异，详情可以<a id="zw-127422d1187t7A0_Z2dbd2a" href="http://donghao.org/2009/08/linuxiapolliepollaueouaeaeeio.html">参考这里</a>。<br id="zw-127422d1187eZ819H2dbd2a" />
</p>
 ]]></description>
            <link>http://donghao.org/2010/03/kernel-eiooopollacyee.html</link>
            <guid>http://donghao.org/2010/03/kernel-eiooopollacyee.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">操作系统</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">kernel</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">linux</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">poll</category>
            
            <pubDate>Tue, 09 03 2010 17:10:38 +0800</pubDate>
        </item>
        
        <item>
            <title>[linux] 文件通知机制 (dnotify, inotify)</title>
            <description><![CDATA[<p id="zw-1271e385d488RVfWE2dbd2a">需要监控某个目录下有没有文件增加或删除，当然不能用循环检测来做，那样太耗CPU，所以改用2.6.9内核支持的dir <span language="en-GB" replaceword="notify机制，查了一下例子：" suggestions="No Suggestions," class="HA-spellcheck-error" id="HA-spellcheck-error">notify机制，查了一下例子：</span></p><p id="zw-1271e385d488RVfWE2dbd2a"><span language="en-GB" replaceword="notify机制，查了一下例子：" suggestions="No Suggestions," class="HA-spellcheck-error" id="HA-spellcheck-error"><br /></span></p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define _<span language="en-GB" replaceword="GNU_SOURCE" suggestions="OUTSOURCE,RESOURCEFUL,RESOURCE,SOURCE'S," class="HA-spellcheck-error" id="HA-spellcheck-error">GNU_SOURCE</span>&nbsp;&nbsp;&nbsp;&nbsp; /* needed to get the defines */<br id="zw-1271e39853ez2XHMq2dbd2a" /><p id="zw-1271e39853eWPaJPm2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;<span language="en-GB" replaceword="fcntl.h" suggestions="flintlock," class="HA-spellcheck-error" id="HA-spellcheck-error">fcntl.h</span>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* in <span language="en-GB" replaceword="glibc" suggestions="glib,glib c,glitch,glide,glitz,glint," class="HA-spellcheck-error" id="HA-spellcheck-error">glibc</span> 2.2 this has the needed<br id="zw-1271e39853emPl0vr2dbd2a" /></p><p id="zw-1271e39853f6N3JI2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; values defined */<br id="zw-1271e39853fXcqZ3F2dbd2a" /></p><p id="zw-1271e39853fSLLNzh2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;<span language="en-GB" replaceword="signal.h" suggestions="signal,signature,signatory,signorina," class="HA-spellcheck-error" id="HA-spellcheck-error">signal.h</span>&gt;<br id="zw-1271e39853fMideNc2dbd2a" /></p><p id="zw-1271e39853fdtJWkI2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;<span language="en-GB" replaceword="stdio.h" suggestions="studious,studio,Standish,stanchion," class="HA-spellcheck-error" id="HA-spellcheck-error">stdio.h</span>&gt;<br id="zw-1271e39853fFw-Ho42dbd2a" /></p><p id="zw-1271e398540FqSsy-2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;<span language="en-GB" replaceword="unistd.h" suggestions="unionist,Unisys,unisex,unison," class="HA-spellcheck-error" id="HA-spellcheck-error">unistd.h</span>&gt;<br id="zw-1271e39853faUhqC2dbd2a" /></p>
<p id="zw-1271e4e3697VsRRQP2dbd2a"><br id="zw-1271e4e3697BcLTMF2dbd2a" />
</p>
<p id="zw-1271e398540DsPlJ2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static volatile <span language="en-GB" replaceword="int" suggestions="nit,in,it,inst,tint,into,lint,dint,mint,pint,hint,tin,ins,ant,inn," class="HA-spellcheck-error" id="HA-spellcheck-error">int</span> <span language="en-GB" replaceword="event_fd" suggestions="eventful,eventide,eventuated,eventual," class="HA-spellcheck-error" id="HA-spellcheck-error">event_fd</span>;<br id="zw-1271e398540pv4HQI2dbd2a" /></p>
<p id="zw-1271e4e36e7UDeoIt2dbd2a"><br id="zw-1271e4e36e7HvWKB72dbd2a" />
</p>
<p id="zw-1271e398540GLxFlU2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void handler(<span language="en-GB" replaceword="int" suggestions="nit,in,it,inst,tint,into,lint,dint,mint,pint,hint,tin,ins,ant,inn," class="HA-spellcheck-error" id="HA-spellcheck-error">int</span> <span language="en-GB" replaceword="sig" suggestions="dig,sign,sing,sigh,swig,sis,sag,sin,sir,rig,sit,sic,gig,sip,pig," class="HA-spellcheck-error" id="HA-spellcheck-error">sig</span>, <span language="en-GB" replaceword="siginfo_t" suggestions="signpost,sinfonia,signatory,significant," class="HA-spellcheck-error" id="HA-spellcheck-error">siginfo_t</span> *<span language="en-GB" replaceword="si" suggestions="is,Si,so,s,sis,sin,sir,sit,soi,sic,sip,psi,ski,six,ii," class="HA-spellcheck-error" id="HA-spellcheck-error">si</span>, void *data)<br id="zw-1271e398540X1SsAL2dbd2a" /></p><p id="zw-1271e398540NarlD32dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br id="zw-1271e398540Mz6P_12dbd2a" /></p><p id="zw-1271e398540SjwxVx2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span language="en-GB" replaceword="event_fd" suggestions="eventful,eventide,eventuated,eventual," class="HA-spellcheck-error" id="HA-spellcheck-error">event_fd</span> = <span language="en-GB" replaceword="si" suggestions="is,Si,so,s,sis,sin,sir,sit,soi,sic,sip,psi,ski,six,ii," class="HA-spellcheck-error" id="HA-spellcheck-error">si</span>-&gt;<span language="en-GB" replaceword="si_fd" suggestions="sized,sited,sired,sided," class="HA-spellcheck-error" id="HA-spellcheck-error">si_fd</span>;<br id="zw-1271e398540KR2Sot2dbd2a" /></p><p id="zw-1271e398541SFJQyS2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br id="zw-1271e398540CL92z62dbd2a" /></p>
<p id="zw-1271e4e37afQs81DP2dbd2a"><br id="zw-1271e4e37b0fGoIjy2dbd2a" />
</p>
<p id="zw-1271e398541rQX4rH2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span language="en-GB" replaceword="int" suggestions="nit,in,it,inst,tint,into,lint,dint,mint,pint,hint,tin,ins,ant,inn," class="HA-spellcheck-error" id="HA-spellcheck-error">int</span> main(void)<br id="zw-1271e398541BuzR5p2dbd2a" /></p><p id="zw-1271e398541LL9sKL2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br id="zw-1271e398541yX4V72dbd2a" /></p><p id="zw-1271e398541x8RAzW2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span language="en-GB" replaceword="struct" suggestions="strict,strut,struck," class="HA-spellcheck-error" id="HA-spellcheck-error">struct</span> <span language="en-GB" replaceword="sigaction" suggestions="subtraction,satisfaction,impaction,stupefaction," class="HA-spellcheck-error" id="HA-spellcheck-error">sigaction</span> act;<br id="zw-1271e398541USBi_t2dbd2a" /></p><p id="zw-1271e398541rKD3n_2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span language="en-GB" replaceword="int" suggestions="nit,in,it,inst,tint,into,lint,dint,mint,pint,hint,tin,ins,ant,inn," class="HA-spellcheck-error" id="HA-spellcheck-error">int</span> <span language="en-GB" replaceword="fd" suggestions="ff,f,d,fed,fad,fwd,id,fa,ad,fr,ft,pd,yd,Nd,Rd," class="HA-spellcheck-error" id="HA-spellcheck-error">fd</span>;<br id="zw-1271e398541Dgh_LU2dbd2a" /></p>
<p id="zw-1271e4e3879VS9lSQ2dbd2a"><br id="zw-1271e4e3879O3h2dbd2a" />
</p>
<p id="zw-1271e398542HVzKIn2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span language="en-GB" replaceword="act.sa_sigaction" suggestions="self-satisfaction,abstractionist,abstractionism,satisfaction," class="HA-spellcheck-error" id="HA-spellcheck-error">act.sa_sigaction</span> = handler;<br id="zw-1271e39854185sZvr2dbd2a" /></p><p id="zw-1271e398542032Lcu2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span language="en-GB" replaceword="sigemptyset" suggestions="sempiternity,empty-headed,empty-handed,non-empty," class="HA-spellcheck-error" id="HA-spellcheck-error">sigemptyset</span>(&amp;<span language="en-GB" replaceword="act.sa_mask" suggestions="No Suggestions," class="HA-spellcheck-error" id="HA-spellcheck-error">act.sa_mask</span>);<br id="zw-1271e398542NmfQsR2dbd2a" /></p><p id="zw-1271e3985425uTMR2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span language="en-GB" replaceword="act.sa_flags" suggestions="flagstones,flagstaffs,flagstone,flagstaff," class="HA-spellcheck-error" id="HA-spellcheck-error">act.sa_flags</span> = <span language="en-GB" replaceword="SA_SIGINFO" suggestions="SINFONIA," class="HA-spellcheck-error" id="HA-spellcheck-error">SA_SIGINFO</span>;<br id="zw-1271e398542QOaR9w2dbd2a" /></p><p id="zw-1271e398542UXpnEd2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span language="en-GB" replaceword="sigaction" suggestions="subtraction,satisfaction,impaction,stupefaction," class="HA-spellcheck-error" id="HA-spellcheck-error">sigaction</span>(<span language="en-GB" replaceword="SIGRTMIN" suggestions="SIGHTING,SIGRID,SIGNORINA,SIGHT-LINE," class="HA-spellcheck-error" id="HA-spellcheck-error">SIGRTMIN</span> + 1, &amp;act, NULL);<br id="zw-1271e398542BTNKUS2dbd2a" /></p>
<p id="zw-1271e4e3941eHB4LZ2dbd2a"><br id="zw-1271e4e3942WJQtTn2dbd2a" />
</p>
<p id="zw-1271e398542K-PNPq2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span language="en-GB" replaceword="fd" suggestions="ff,f,d,fed,fad,fwd,id,fa,ad,fr,ft,pd,yd,Nd,Rd," class="HA-spellcheck-error" id="HA-spellcheck-error">fd</span> = open(".", <span language="en-GB" replaceword="O_RDONLY" suggestions="PARDONABLY,READ-ONLY,COMMONLY,PARDONABLE," class="HA-spellcheck-error" id="HA-spellcheck-error">O_RDONLY</span>);<br id="zw-1271e3985427OXayo2dbd2a" /></p><p id="zw-1271e398542Qe6OAZ2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span language="en-GB" replaceword="fcntl" suggestions="frontal,flint,fantail,flaunt," class="HA-spellcheck-error" id="HA-spellcheck-error">fcntl</span>(<span language="en-GB" replaceword="fd" suggestions="ff,f,d,fed,fad,fwd,id,fa,ad,fr,ft,pd,yd,Nd,Rd," class="HA-spellcheck-error" id="HA-spellcheck-error">fd</span>, <span language="en-GB" replaceword="F_SETSIG" suggestions="FORESIGHT,RETSINA,SIGHTSEE," class="HA-spellcheck-error" id="HA-spellcheck-error">F_SETSIG</span>, <span language="en-GB" replaceword="SIGRTMIN" suggestions="SIGHTING,SIGRID,SIGNORINA,SIGHT-LINE," class="HA-spellcheck-error" id="HA-spellcheck-error">SIGRTMIN</span> + 1);<br id="zw-1271e398542xhwty2dbd2a" /></p><p id="zw-1271e398543IXAbO92dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span language="en-GB" replaceword="fcntl" suggestions="frontal,flint,fantail,flaunt," class="HA-spellcheck-error" id="HA-spellcheck-error">fcntl</span>(<span language="en-GB" replaceword="fd" suggestions="ff,f,d,fed,fad,fwd,id,fa,ad,fr,ft,pd,yd,Nd,Rd," class="HA-spellcheck-error" id="HA-spellcheck-error">fd</span>, <span language="en-GB" replaceword="F_NOTIFY" suggestions="NOTIFY,FORTIFY,FRUCTIFY,SANCTIFY," class="HA-spellcheck-error" id="HA-spellcheck-error">F_NOTIFY</span>, <span language="en-GB" replaceword="DN_MODIFY|DN_CREATE|DN_MULTISHOT" suggestions="No Suggestions," class="HA-spellcheck-error" id="HA-spellcheck-error">DN_MODIFY|DN_CREATE|DN_MULTISHOT</span>);<br id="zw-1271e398542J80GaS2dbd2a" /></p><p id="zw-1271e398543EJhzCa2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* we will now be notified if any of the files<br id="zw-1271e398543raTgcj2dbd2a" /></p><p id="zw-1271e398543Capnfb2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in "." is modified or new files are created */<br id="zw-1271e398543GlVDa12dbd2a" /></p><p id="zw-1271e398543KsmOzu2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (1) {<br id="zw-1271e398543iy0P362dbd2a" /></p><p id="zw-1271e398543i7zV6R2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pause();<br id="zw-1271e398543nfHq4g2dbd2a" /></p><p id="zw-1271e398543h46BTu2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span language="en-GB" replaceword="printf" suggestions="print,prints,print f,prince,Pringle,principle,principal," class="HA-spellcheck-error" id="HA-spellcheck-error">printf</span>("Got event on <span language="en-GB" replaceword="fd=%d" suggestions="No Suggestions," class="HA-spellcheck-error" id="HA-spellcheck-error">fd=%d</span>\n", <span language="en-GB" replaceword="event_fd" suggestions="eventful,eventide,eventuated,eventual," class="HA-spellcheck-error" id="HA-spellcheck-error">event_fd</span>);<br id="zw-1271e3985431umMy22dbd2a" /></p><p id="zw-1271e398543xfCP802dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br id="zw-1271e398543E035Ff2dbd2a" /></p><p id="zw-1271e398544x9oW-E2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br id="zw-1271e3985440oc8o82dbd2a" /></p>
<p id="zw-1271e4e3afaHsG4G52dbd2a"><br id="zw-1271e4e3afbLEfqXx2dbd2a" />
</p>
<p id="zw-1271e39994fBFgzty2dbd2a">我试着在项目里用了一下，发现不行，有两个大毛病：</p><p id="zw-1271e3a1b09cV4ZzY2dbd2a">1. <span language="en-GB" replaceword="信号机制会打断程序运行，epoll调用也会被打断，虽然还能“续上”，但毕竟影响太大" suggestions="No Suggestions," class="HA-spellcheck-error" id="HA-spellcheck-error">信号机制会打断程序运行，epoll调用也会被打断，虽然还能“续上”，但毕竟影响太大</span></p><p id="zw-1271e3c4d20BDq0uY2dbd2a">2. <span language="en-GB" replaceword="dnotify机制通知很快，我的创建文件后初始数据还没写进去，监控程序就发现并打开了文件" suggestions="No Suggestions," class="HA-spellcheck-error" id="HA-spellcheck-error">dnotify机制通知很快，我的创建文件后初始数据还没写进去，监控程序就发现并打开了文件</span></p><p id="zw-1271e3e5370PfGmF2dbd2a"><br id="zw-1271e3e5427kZIAV2dbd2a" /></p><p id="zw-1271e3db1353qIUd2dbd2a"><a target="_blank" id="zw-1271e3efac67A3ksg2dbd2a" title="inotify" href="http://www.ibm.com/developerworks/cn/linux/l-inotifynew/">inotify</a>是2.6.12才开始引入内核，而我用的是rhel4，用不了；即使用得了，上诉第二个问题也是无法解决的。所以最后只能自己写驱动。</p>]]></description>
            <link>http://donghao.org/2010/03/linux-iaiouoae-dnotify-inotify.html</link>
            <guid>http://donghao.org/2010/03/linux-iaiouoae-dnotify-inotify.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">软件开发</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">dnotify</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">inotify</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">linux</category>
            
            <pubDate>Tue, 02 03 2010 17:57:26 +0800</pubDate>
        </item>
        
        <item>
            <title>“852号”的故事</title>
            <description><![CDATA[<a href="http://www.douban.com/subject/2364815/"><img src="http://t.douban.com/mpic/s3026817.jpg" style="float:right;padding:0 0 20px 20px;border:0"/></a>
<p id="zw-2" zid="20">                斯大林疑心很重。</p><p id="zw-1269d0c410bfu0yCD2dbd2a" zid="22">斯大林不相信任何人。<br id="zw-1269d0c0c6dMX-W1l2dbd2a" zid="1" />斯大林建起了劳改营。所有怀疑背叛斯大林的人，怀疑可能背叛斯大林的人，统统被关进了劳改营。</p><p id="zw-1269d12d051jBV1ab2dbd2a" zid="32"><br id="zw-1269d0c94a6qnNDf2dbd2a" zid="3" />无数劳改营悄悄的在西伯利亚建立起来。</p>
<p id="zw-12703e043d1xWURzW2dbd2a" zid="2"><br id="zw-12703e043d1N06LXm2dbd2a" zid="4" />每天都会有火车从各地运来“劳改犯”。他们有的是军人、有的是教师、有的是医生，都穿着破烂的大衣，提着随身的小箱子（有人连这个都没有），顶着西伯利亚零下二十度的寒风，下了火车。<br id="zw-12703e043d1G3YLld2dbd2a" zid="69" />他们挤住在一排排的临时木屋里，木屋里摆满了上下铺，一个木屋住着上百人。<br id="zw-12703e043d1PVnYW02dbd2a" zid="70" />天不亮，他们醒来，在枪口下点名，进入劳动区劳动，或是挖坑、或是修路、或是砌墙、或是检修机械。<br id="zw-12703e043d1bUK3up2dbd2a" zid="71" />天黑了，他们再在枪口下点名，离开劳动区，回到小木屋，盖上锯末面塞成的硬邦邦的大被子。<br id="zw-12703e043d2wJ9G2dbd2a" zid="72" />每天的饭是发霉的黑面包和稀粥。<br id="zw-12703e043d2u-QZp32dbd2a" zid="5" />很多人累倒了，很多人病倒了，很多人通过死亡解脱了，但还有更多的人继续着这无边无际的苦难。<br id="zw-12703e043d2FX3STE2dbd2a" zid="6" /><br id="zw-12703e043d2gY_MSM2dbd2a" zid="7" />这些劳改营里还有儿童。有的是父亲被捕（比如<a zid="5" id="zw-12703e043d2eyTt8q2dbd2a" href="http://baike.baidu.com/view/194395.htm">布哈林</a>的孩子），有的是母亲被捕，于是他们成为了孤儿，但孤儿是不被允许的，他们最终被送到那里，送到劳改营。<br id="zw-12703e043d2hsHlV2dbd2a" zid="8" /><br id="zw-12703e043d2WwqSCL2dbd2a" zid="9" />无数个劳改营里发生的事被完全封锁住了。不要说苏联以外的人不知道，即使苏联人，如果不是自己或熟人被捕，也不知道发生在那偏远角落的事。<br id="zw-12703e043d2dGjNm2dbd2a" zid="10" />劳改营成了一个个完全闭塞的孤岛，古拉格群岛。没有人出得去，也没人知道它在哪里......<br id="zw-12703e043d2iD87O2dbd2a" zid="11" /><br id="zw-12703e043d2u6gnm42dbd2a" zid="12" />世界发生着变化。<br id="zw-12703e043d2RYDOBK2dbd2a" zid="13" />苏联开始了新一轮工业革命，以十年的时间跻身世界第二工业强国，无数的人们为这一变化而赞叹，他们看见了一个新崛起的国家，一个欣欣向荣的民族，但他们却不可能看到这亮丽光环下黑暗的群岛，和群岛上无数正受到非人虐待的“犯人”。</p>
<p id="zw-1269d1367b0QBJDk22dbd2a" zid="42"><br id="zw-1269d1367b0_6Koxn2dbd2a" zid="43" /></p><p id="zw-1269d1482ecs0LkJ2dbd2a" zid="74">这些“伟大建设成就”背后的无数廉价、卑微的劳动力，依然不为人所知。<br id="zw-1269d1361b8x3D6Yd2dbd2a" zid="15" /><br id="zw-1269d1361b8uWGJ2X2dbd2a" zid="16" />终于，解放的日子到了——苏联的大文豪马克西姆.高尔基来到了劳改营。<br id="zw-1269d1361b8dtnNWb2dbd2a" zid="17" />那可是高尔基啊！是那个被老板毒打依然刻苦读书，勇敢揭露黑暗、勇敢揭露压迫的高尔基，那个写了《在人间》《海燕》的善良的高尔基！<br id="zw-1269d1361b8FrXn7r2dbd2a" zid="73" />劳改营里的犯人开始激动， 开始祈祷，开始期盼他们的救世主。<br id="zw-1269d1361b9xX0U9G2dbd2a" zid="83" />但高尔基要来的消息已经通知到各个“单位”，劳改营的守卫警告了所有的犯人——不准对高尔基说任何实情，否则就不是劳改那么简单了。<br id="zw-1269d1361b9Tp6KN2dbd2a" zid="18" />日子到了，高尔基在一群克格勃的“陪同”下来到了劳改营，营地四处清扫的干干净净，守卫和领导们领着高尔基参观了所有打扮漂亮的地方。整个劳改营看上去就像个疗养院。偶有犯人和高尔基打个照面，也只是脱帽致意，犯人们什么也不说，只是一脸的凄苦与无助。<br id="zw-1269d1361b9_EcZd52dbd2a" zid="19" />天色已晚。就在高尔基要离开时，一个劳改营里的孩子终于跑到高尔基面前，冒着生命危险，大胆向高尔基讲出了劳改营里发生的一切！<br id="zw-1269d1361b9Fw3yIr2dbd2a" zid="75" />孩子不停的讲，不停的揭露，几个守卫满脸通红，似乎马上就要冲过去将他撕成碎片，但守卫毕竟不敢放肆，因为高尔基正聚精会神的听着。<br id="zw-1269d1361baOTwl5i2dbd2a" zid="23" />听完后，高尔基吻了孩子，匆匆的离开了。<br id="zw-1269d1361baHRHCVN2dbd2a" zid="25" /><br id="zw-1269d1361baBTzzhS2dbd2a" zid="26" />我们不知道那孩子后来的命运，没有一本历史书讲述他的故事。<br id="zw-1269d1482ecwdVNFs2dbd2a" zid="27" />历史书是书写“伟大事件”的，草民不在此列，那个幼小、可怜的生命更不在此列。<br id="zw-1269d1482ecrNd5MH2dbd2a" zid="28" /><br id="zw-1269d1482edIMn4fF2dbd2a" zid="29" />但是后来，高尔基没有写出真相。他不敢。<br id="zw-1269d1482edy9H0b2dbd2a" zid="30" /><br id="zw-1269d1482edxSH3Ht2dbd2a" zid="31" />列宁曾说过，高尔基是“俄罗斯的良心”。<br id="zw-1269d1482edqoF8l-2dbd2a" zid="76" />在那个时代，俄罗斯已经没有了良心。<br id="zw-1269d1482eeKxew8N2dbd2a" zid="34" /><br id="zw-1269d1482eepMlOY02dbd2a" zid="35" />又过去了十多年。<br id="zw-1269d1482een8sNw32dbd2a" zid="36" /><br id="zw-1269d1482eeLEuln2dbd2a" zid="37" />卫国战争爆发了。<br id="zw-1269d1482eejRpc0w2dbd2a" zid="38" />一列列火车将物资和人员运往苏联东部。火车上不仅有难民和伤员，还有从敌人包围下突围而出的红军士兵，他们因为“可能叛国”而被勒令送往劳改营。<br id="zw-1269d1482efGQyh112dbd2a" zid="77" />在一列火车上， 还有一个小伙子，他没有被俘过，也没被包围过，他是因为在书信中“怀疑斯大林”而被捕。</p><p id="zw-1269d153126_hHBuP2dbd2a" zid="91"><br id="zw-1269d153126G9QQE2dbd2a" zid="78" />没有死在战场，却被自己人抓个正着。</p><p id="zw-1269d152c3df9l4BZ2dbd2a" zid="92"><br id="zw-1269d152c3ewx5puY2dbd2a" zid="93" /></p><p id="zw-1269d1523fcDPOLy2dbd2a" zid="94">小伙子来到劳改营，和所有人一样，开始了重复而高负荷的劳动。<br id="zw-1269d1523fc1hUhRO2dbd2a" zid="79" />他毕竟年轻，一天两碗稀粥不可能吃饱，于是他每天晚上都悄悄把发的250克黑面包缝在被褥里（如果不藏，会被每晚 例行搜查抓住，或是被别人偷走），等到第二天，劳动中途撑不住了，吃掉一半，午餐的时候，用剩下的一半黑面包檫干净喝完粥的碗。</p><p id="zw-1269d15f08eWphKe92dbd2a" zid="95"><br id="zw-1269d15f08eU89vX2dbd2a" zid="40" />那碗壁上沾的剩粥十分珍贵，它决定了小伙子能否活下去。</p><p id="zw-1269d15f3c3DuOKPy2dbd2a" zid="96"><br id="zw-1269d15f3c3g6v4qL2dbd2a" zid="41" />没有人知道这个小伙子的名字，也没人关心，这里是劳改营，人们只知道他的编号，852号。<br id="zw-1269d15f3c3Y9PlJc2dbd2a" zid="45" /><br id="zw-1269d15f3c3GMEaYV2dbd2a" zid="46" />“852号”在劳改营呆了7年。<br id="zw-1269d15f3c3J0hqzJ2dbd2a" zid="47" /><br id="zw-1269d15f3c4S9yk8V2dbd2a" zid="48" />“852号”从一个小伙子变成了一个衰弱的中年人，他皮肤紫黑，面容憔悴，成了半具骷髅。这一年，“852号”终于撑不住了，他患上了癌症。做为病人，他终于得到了治疗的许可，也获得了喘息的机会。<br id="zw-1269d15f3c4be5lJ2dbd2a" zid="49" />“852号”在医院里感受着这瞬间的解放，医院的草地、树木、喷泉都让他久久不能离开，他像个刚出生的孩童一样看着天空、白云，大口吸着青草的芳香。<br id="zw-1269d15f3c4ybteCt2dbd2a" zid="80" />他不害怕死亡，他已经享受过了这个世界，享受过了生命。<br id="zw-1269d15f3c4O3B2PU2dbd2a" zid="81" />他静待着死神来带走自己。<br id="zw-1269d15f3c4EsHBNb2dbd2a" zid="50" /><br id="zw-1269d15f3c5_WafvL2dbd2a" zid="51" />死神没有带走“852号”，他没有死，他奇迹般的恢复了健康。<br id="zw-1269d15f3c53wBJ-O2dbd2a" zid="52" /><br id="zw-1269d15f3c5d85TI62dbd2a" zid="53" />1953年，斯大林逝世。<br id="zw-1269d15f3c57FSsh2dbd2a" zid="54" /><br id="zw-1269d15f3c5czQEe2dbd2a" zid="55" />“852号”被释放了，转而流放到了哈萨克斯坦。<br id="zw-1269d15f3c6UfWQ_V2dbd2a" zid="56" />不久，他回到了家乡，操起了旧业——数学物理老师。<br id="zw-1269d15f3c6NRvWh_2dbd2a" zid="57" />但从释放那天起，“852号”就经常做噩梦，梦见自己还身在劳改营，在那一排排铁丝网的后面，冒着西伯利亚的严寒，拼命的干着重活。<br id="zw-1269d15f3c6lO-Fp-2dbd2a" zid="58" />“852号”开始失眠，也开始精神恍惚，他总觉得自己根本没有离开“古拉格群岛”。总觉得自己将永远被关押，即使死了，灵魂也不会离开劳改营......<br id="zw-1269d15f3c6GCicq32dbd2a" zid="59" /><br id="zw-1269d15f3c6Nrizl2dbd2a" zid="60" />在这可怕的想法中，“852号”挣扎着，痛哭着，祈祷着......<br id="zw-1269d15f3c7QlsSD22dbd2a" zid="61" /><br id="zw-1269d15f3c7krCThJ2dbd2a" zid="62" />1961年到了。<br id="zw-1269d15f3c7ASHqGL2dbd2a" zid="63" /><br id="zw-1269d15f3c7QfDZeD2dbd2a" zid="64" />“852号”把自己在劳改营发生的一切写成了一部小说，交给了出版社。<br id="zw-1269d15f3c7SKVFQB2dbd2a" zid="65" />虽然二十年前由于自己写的信而入狱，“852号”现在却无所畏惧，他不再惧怕死亡，他静待着死亡的到来，就像当年自己身患癌症时那样。<br id="zw-1269d15f3c70dmHGj2dbd2a" zid="66" />交稿后的那天晚上，“852号”做了个梦，这次不再是噩梦，而是自己真实的事：他在劳改营锯木头时，曾看到一颗原木，上面居然长出了新芽。<br id="zw-1269d15f3c80EO9Hi2dbd2a" zid="67" />那是伐倒后放了一年的原木，又摔成了几截，即使这样，它也发了新芽。</p><p id="zw-1269d16db29LrnQfh2dbd2a" zid="97"><br id="zw-1269d16db290LUJmt2dbd2a" zid="68" />即使遭遇了巨大的苦难，这小小的生命也渴望活下去啊。<br id="zw-1269d16db29iJ91mH2dbd2a" zid="84" /><br id="zw-1269d16db29l-Pt-h2dbd2a" zid="85" />“852号”觉得自己又活了过来，他像个疲惫的孩子般，眼角挂着幸福的泪水，在母亲的怀抱里沉沉的睡去了。<br id="zw-1269d16db29z-FwdI2dbd2a" zid="86" />他终于离开了古拉格群岛，终于自由了。<br id="zw-1269d16db2aHaWwyr2dbd2a" zid="87" />他不再是“852号”，他重获了他的名字——<br id="zw-1269d16db2aqtH82g2dbd2a" zid="88" /><br id="zw-1269d16db2ato1gc32dbd2a" zid="89" />索尔仁尼琴。</p><p id="zw-1269d16db29LrnQfh2dbd2a" zid="97"><br id="zw-1269d16db2a_sMiby2dbd2a" zid="82" /></p> ]]></description>
            <link>http://donghao.org/2010/02/852aaeea.html</link>
            <guid>http://donghao.org/2010/02/852aaeea.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">书即面包</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">索尔仁尼琴</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">古拉格群岛</category>
            
            <pubDate>Thu, 25 02 2010 16:45:23 +0800</pubDate>
        </item>
        
        <item>
            <title>穿梭</title>
            <description><![CDATA[<p zid="2" id="zw-126f5070988Wj0WCC2dbd2a">去年10月回家乡，从书柜上翻下来几本薄薄的英文小说，是97年读高二的时候在遵义买的。带回北京。昨晚看完了其中一本<a href="http://www.douban.com/subject/2332021/">《布朗神父》</a>，翻到最后一页时看到了一枚印章：</p><p style="text-align: center;" zid="4" id="zw-126f5089a8eWX9A532dbd2a"><img zid="7" alt="" id="zw-126f508f483kVh1Cg2dbd2a" src="http://writer.zoho.com/ImageDisplay.im?name=1195695000000025001/1266831388878.JPG&amp;accId=1195695000000002007" align="middle" border="0" hspace="0" vspace="0" /></p><p style="text-align: left;" zid="10" id="zw-126f50934cfoYxVjP2dbd2a">呵，当时是在<a href="http://ditu.google.cn/maps/place?hl=zh-CN&amp;sourceid=navclient-ff&amp;rlz=1B3GPCK_zh-CNCN367CN367&amp;um=1&amp;ie=UTF-8&amp;q=%E9%81%B5%E4%B9%89+%E8%A5%BF%E8%A5%BF%E5%BC%97&amp;fb=1&amp;gl=cn&amp;hq=%E8%A5%BF%E8%A5%BF%E5%BC%97&amp;hnear=%E9%81%B5%E4%B9%89&amp;cid=9825825047950717958">西西弗书社</a>买的，老书店都要盖章。我已经很久没有在盖章的书店里买书了，现在看着觉得好亲切。</p><p style="text-align: left;" zid="12" id="zw-126f50cee7cE27be2dbd2a"><br zid="13" id="zw-126f50cef62Xp5jY22dbd2a" /></p><p style="text-align: left;" zid="14" id="zw-126f50cef62YUPQOq2dbd2a">这经典的印章，带我瞬间穿梭回了13年前。</p><p style="text-align: left;" zid="15" id="zw-126f510413c-Oj-Bg2dbd2a">那
天是感觉不舒服，就请假去了趟医院，查了没啥事儿，回家的路上经过西西弗，当然是趁机进去转一转——我自己都不记得高中去了多少趟西西弗，实在是不想再买
习题集，也不想买“闲书”，看着几本薄薄的英文册子，觉得真便宜真不错，就买了几本。回家后试着看，毕竟是原文，觉得太难了，于是放之书柜上。<br zid="16" id="zw-126f513a4d3pGAG-2dbd2a" />
</p>
<p style="text-align: left;" zid="19" id="zw-126f513a57974wSUr2dbd2a">一晃13年，光阴似箭。总算是看完了其中一本。</p><p style="text-align: left;" zid="19" id="zw-126f513a57974wSUr2dbd2a"><br /></p>

<p zid="22" id="zw-126f51447ccyDBynv2dbd2a">后山还是那个后山，西西弗还是那个西西弗。真不错。</p>]]></description>
            <link>http://donghao.org/2010/02/eo.html</link>
            <guid>http://donghao.org/2010/02/eo.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">书即面包</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">西西弗</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">遵义</category>
            
            <pubDate>Mon, 22 02 2010 17:51:00 +0800</pubDate>
        </item>
        
        <item>
            <title>putty加强</title>
            <description><![CDATA[<p id="zw-126ead07772Ay_Q5p2dbd2a" zid="2">重装系统以后改用putty，挺好用，就是没有tab（标签）功能，切换登录界面很麻烦。不过后来发现了一个好东东 Putty Connection Manager，可以提供tab功能（要装.net框架，否则报错）。</p><p id="zw-126ead40014NOrns72dbd2a" zid="5"><br id="zw-126ead40014tpdCh72dbd2a" zid="6" /></p><p id="zw-126ead1e9a4vuCjz2dbd2a" zid="4"><img alt="" id="zw-126ead3dcdeqj54Jz2dbd2a" src="http://writer.zoho.com/ImageDisplay.im?name=1195695000000023001/1266660137895.png&amp;accId=1195695000000002007" zid="7" align="" border="0" hspace="0" vspace="0" /></p><p id="zw-126ead3e754QsWY4u2dbd2a" zid="8"><br id="zw-126ead4074f9gQ3e22dbd2a" zid="9" /></p><p id="zw-126ead4cc03KpWzUX2dbd2a" zid="10">还有几个问题：putty里的蓝色太刺眼，看不清，需要调，最好RGB是100，100，200；</p><p id="zw-126ead5065a_6LBU52dbd2a" zid="11">vim里查询时用的是黄色背景灰色字，根本看不清，</p><p id="zw-126ead77cfbZvyIgv2dbd2a" zid="20"><br id="zw-126ead783caB0t_k12dbd2a" zid="21" /></p><p id="zw-126ead783cal3zAJJ2dbd2a" zid="22"><img alt="" id="zw-126ead7a831FGCGq12dbd2a" src="http://writer.zoho.com/ImageDisplay.im?name=1195695000000023001/1266660386724.png&amp;accId=1195695000000002007" zid="27" align="" border="0" hspace="0" vspace="0" /><br id="zw-126ead783ca5iD8d32dbd2a" zid="23" /></p><p id="zw-126ead77812UP-2K22dbd2a" zid="24"><br id="zw-126ead77969jG8ZT02dbd2a" zid="25" /></p><p id="zw-126ead77969wMSRGT2dbd2a" zid="26">我在.vimrc里加了一行：</p><p id="zw-126ead64d5fjM6r572dbd2a" zid="14"><br id="zw-126ead64d5fa7i4wS2dbd2a" zid="15" /></p><p id="zw-126ead57d05PNou-2dbd2a" zid="13"><span id="zw-126ead65d8dUuRr2u2dbd2a" style="font-weight: bold;" zid="16">highlight Search term=standout ctermfg=0 ctermbg=3</span></p><p id="zw-126ead667d9zKEVSK2dbd2a" zid="17"><br id="zw-126ead66944e7Uxke2dbd2a" zid="18" /></p><p id="zw-126ead69aac3nVJKl2dbd2a" zid="19">改变高亮方式，一切ok了</p><p id="zw-126ead7bc85fUwc-32dbd2a" zid="28"><br id="zw-126ead7be193F23oV2dbd2a" zid="29" /></p><p id="zw-126ead7be190mCSq-2dbd2a" zid="30"><img alt="" id="zw-126ead85d6dgipPaq2dbd2a" src="http://writer.zoho.com/ImageDisplay.im?name=1195695000000023001/1266660433270.png&amp;accId=1195695000000002007" zid="31" align="" border="0" hspace="0" vspace="0" /></p><p id="zw-126ead7be190mCSq-2dbd2a" zid="30"><br /></p>=== tmux的分割线 ===<br /><br />感谢KrzyCube和passenger的建议，现在我已经是“putty tab”加“tmux”混合作战：<br />不同的服务器登录用不同的putty tab，相同的tab内再用tmux。<br />切换比较方便了，又不用担心tab打开的太多。<br /><br />btw:我把tmux的快捷键改成Ctrl-a，因为默认的Ctrl-n和vim的快捷键冲突了，<a href="http://niallohiggins.com/2009/06/04/tmux-a-bsd-alternative-to-gnu-screen/">参考</a><br /><br /> ]]></description>
            <link>http://donghao.org/2010/02/puttyoc.html</link>
            <guid>http://donghao.org/2010/02/puttyoc.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">软件开发</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">putty</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">tmux</category>
            
            <pubDate>Sun, 21 02 2010 09:40:32 +0800</pubDate>
        </item>
        
        <item>
            <title>大纵深战役</title>
            <description><![CDATA[<a href="http://www.douban.com/subject/1975991/"><img src="http://t.douban.com/mpic/s2131527.jpg" style="float:right;padding:0 0 20px 20px;border:0"/></a>
<p id="zw-126e486d152DhSJ1V2dbd2a" zid="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图哈切夫斯基是上个世纪30年代的苏联元帅，曾为苏联早期的国
内战争出过力，功勋卓著，后来还主导提出了“大纵深作战”理论，和同时代英国的富勒、德国的古德里安一样，都是从不同方面倡导机械化作战方式的军事将领，
颇有远见。但斯大林的“大清洗”开始了，1937年6月10日，年仅44岁的图哈切夫斯基在内务部地下室里被枪决。苏联就是这样对待自己的军事天才的，就
是这样自毁长城的。</p><p id="zw-126e486d152DhSJ1V2dbd2a" zid="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 之后，”大纵深作战”理论也被冷处
理。没有了优秀的指挥人才，苏联军队先是在苏芬战争中损失惨重，而后在德国的铁骑下一溃千里，亏得还有朱可夫在（如果图哈切夫斯基没死，估计也轮不到他出
场），总算靠堆人堆赢了。只可怜那上千万无辜战死的炮灰，如果不是指挥严重失误，他们应该还活着。</p><p id="zw-126e48c210d7lGqZ82dbd2a" zid="5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我借这本书来看，完全是仰慕老元帅的远见卓识，也回望一下那段令人扼腕的惨痛历史。</p><p id="zw-126e48e113dQ6wk2I2dbd2a" zid="9"><br /></p><p id="zw-126e48e113dQ6wk2I2dbd2a" zid="9">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大纵深战役，不是小小的刺一下敌人，而是在敌人防线的正面（注意，正面），以150公里的宽度（瞧瞧这宽度），用大炮，航空兵攻击敌人，再以坦克、步兵全宽度全深度的突击（所谓纵深，也是120公里以上），一边突击，还要一边继续炮轰和航空兵轰炸，持续的、纵深的、大规模的杀伤敌人。有没有觉得很像德国人的闪电战？其实差不多，那个时代的机械化作战都这个样儿。</p><p id="zw-126e4935ba1AgzCpx2dbd2a" zid="10">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图哈切夫斯基还反复强调，要攻击正面，而且是很宽的正面，不然达不到效果。拿重锤敲大砧板，他真是个典型的俄国熊。</p>
<p id="zw-126e4f5905aWb_I5X2dbd2a" zid="10">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中国人是怎么打仗的？翻翻中国古代史，背水一战、奇袭、偷袭、半夜劫寨、两翼包抄、声东击西，基本都是在运动中攻击敌人的软肋，不是侧翼就是后方，如果敌人没有软肋，那就跟他耗，耗到他现出软肋，然后再打（敌疲我打）。很少从正面打的。感觉凡是中国古代名将，如果不来点儿计谋，不来点兵法，不来点花活，那就太不上档次了——两军正面对砍，那有啥意思？！这是东西方思维方式的差异，孰优孰劣就不好说了。<br id="zw-126e4f5905aPuLpsf2dbd2a" zid="6" /></p>
 ]]></description>
            <link>http://donghao.org/2010/02/oyei.html</link>
            <guid>http://donghao.org/2010/02/oyei.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">钢铁力量</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">图哈切夫斯基</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">大纵深战役</category>
            
            <pubDate>Fri, 19 02 2010 14:44:06 +0800</pubDate>
        </item>
        
        <item>
            <title>食物造就了我们</title>
            <description><![CDATA[<a href="http://www.douban.com/subject/1038279/"><img src="http://img2.douban.com/mpic/s1068083.jpg" style="border: 0pt none ; padding: 0pt 0pt 20px 20px; float: right;" /></a>
<p zid="3" id="zw-126bab8b67e-oy0I32dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 过去，欧洲人以小麦为主食，而小麦产量有限，所以欧洲人口密度不高，稀疏的人口带来了宽松的政治环境，所以欧洲很早就有共和制。</p><p zid="4" id="zw-126bab9e2c9ZnMWuU2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 古代，中国人以稻米为主食，这种精耕细作的植物产量较高，所以中国人口密度高，稠密的人口带来了上千年的封建帝王制。</p><p zid="4" id="zw-126bab9e2c9ZnMWuU2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 过去，印加人（南美）以玉米为主食，玉米的产量高的惊人，所以印加人的人口超级稠密，相对应的，他们采用的是高度集中的神权制。</p>

<p zid="7" id="zw-126babae445dFcjCt2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上是布罗代尔的观点：食物改变了社会结构，食物创造了历史本身。</p>

<p zid="10" id="zw-126babb6a7dW7jRt-2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 西方人以肉食为主，所以西方人火气旺，大冬天也有穿着短裤的；身体强壮，女性生完孩子都不用坐月子（看那个<a zid="18" id="zw-126bac913ddHTNSh-2dbd2a" href="http://soc.sdnews.com.cn/2009/1/6/708753.html">德国女部长</a>）；精力充沛，整天开着船四处探险还把土著人的美洲占为己有，一副精力过剩、勇往直前、打了鸡血的状态。</p>
<p zid="11" id="zw-126bac0ec22tg_re2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 东方人以稻谷、青菜为主，所以东方人体质一般，要时刻防范“寒气如体”，性格也更静。我们中国人在这块地方一呆就是几千年，也没想着拓展殖民地、探索未知领域什么的。好不容易有个郑和，去了那么远，最后也就是传播了一下文化，交流了一下贸易??心善啊。</p>

<p zid="14" id="zw-126bac53749yoZuas2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上是我的观点：食物改变了我们，食物决定了人本身。</p>

<p zid="21" id="zw-126bacaf4f9SL-9aK2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所以，大家还是少吃肯德基麦当劳，少喝可乐雪碧咖啡，多吃东方人自己的食物（青菜豆腐白米饭），多喝适合东方人的饮料（豆浆蜂蜜酸梅汤）。</p>]]></description>
            <link>http://donghao.org/2010/02/eiioiiaeioac.html</link>
            <guid>http://donghao.org/2010/02/eiioiiaeioac.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">书即面包</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">食物</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">布罗代尔</category>
            
            <pubDate>Thu, 11 02 2010 10:11:57 +0800</pubDate>
        </item>
        
        <item>
            <title>《独辟蹊径品内核》</title>
            <description><![CDATA[<a href="http://www.douban.com/subject/3894413/"><img src="http://t.douban.com/mpic/s3910637.jpg" style="float:right;padding:0 0 20px 20px;border:0"/></a>
<p zid="1" id="zw-126a7c5ec90wqnam82dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 凡是讲解OS内核的书，我基本都是打90分，尤其是国内作者写的。毕竟国内做IT的大部分就是混口饭吃，有时间专研，有精力专研，而且肯专研底层技术的
人，本身就值得钦佩和鼓励。
<br zid="2" id="zw-126a7c5ec91F5Q5wz2dbd2a" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 书里前几章讲linux内核的一些常用小组件（比如锁），其
中讲“内存屏障“的部分相当不错，来龙去脉讲得很清晰，帮我理清了一些以前混淆的概念。后面的几章里，“slub”分配器和“cfs调度”是内核较新的东
东，我重点看了看。其余讲内存和进程的和《情景分析》有所重复，没再细看。</p>
<p zid="4" id="zw-126a7cd81c2VwhB6F2dbd2a">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 书偏贵，加上内容有些宽泛，所以，推荐借阅。购买就有点贵了。</p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 听<a zid="9" id="zw-126a7e185d2fgSXcz2dbd2a" href="http://www.dbanotes.net/review/publish_tech_crisis.html">冯大辉同学说</a>，
现在国内原创技术类图书的出版不景气，因为购买者太少，成本都难收回来。确实，现在原创的技术文章更多的出现在博客和论坛上，买技术类图书的必要就不是很
大了。表面上看来，写书的人没了动力，出版业倒霉了，图书市场萎缩了，但实际上这样更好，更多的优秀技术文章在网络上免费共享了。免费的经验共享（不是盗版共享）会让一个行业更繁荣。<br zid="8" id="zw-126a7d3fcf1q2RUiT2dbd2a" />

 ]]></description>
            <link>http://donghao.org/2010/02/auoeaeaue.html</link>
            <guid>http://donghao.org/2010/02/auoeaeaue.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">操作系统</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">linux内核</category>
            
            <pubDate>Sun, 07 02 2010 18:10:11 +0800</pubDate>
        </item>
        
        <item>
            <title>[web] http_load更适合性能测试</title>
            <description><![CDATA[<p zid="1" id="zw-1269c3a0fd04Are1r2dbd2a">写了个httpd服务，测试性能。</p>
<p zid="7" id="zw-1269ce98a34uau3zK2dbd2a">用curl发200k的请求，回复也是200k的消息，调用20次curl，花了30秒。</p>
<p zid="3" id="zw-1269c3cd670gCyTgK2dbd2a">这性能看上去很低，但我发现httpd的CPU消耗也很低，那是慢在哪里了？</p>
<p zid="8" id="zw-1269ce9c4a6DNQs732dbd2a"><br zid="9" id="zw-1269ce9c4a6ccdkcN2dbd2a" />
</p>
<p zid="4" id="zw-1269c3f54571WlovP2dbd2a">于是自己写了个client端，一次send 200k的消息，再收200k，重复1000遍，发现超快，几秒就完成了，server端httpd消耗的CPU也高起来了，占到70%，看来不是我写的httpd的问题，压根就是curl启动慢，白耗时间。</p>
<p zid="10" id="zw-1269ce9d81emp1GDy2dbd2a"><br zid="11" id="zw-1269ce9d81fhntty42dbd2a" />
</p>
<p zid="5" id="zw-1269cec2f31McKxoo2dbd2a">curl不适合用来做性能测试，<a zid="18" id="zw-1269cfdfd2afl0vJ22dbd2a" href="http://acme.com/software/http_load/">http_load</a>更适合，但它不带body，所以我改了改http_load.c，加了个参数 -body ，后面跟body的大小（单位是KB），比如：</p>
<p zid="12" id="zw-1269ceae158qPJU4P2dbd2a">./http_load -p 5 -s 600 -body 100 url.list</p>
<p zid="13" id="zw-1269cebaf1bkumhne2dbd2a">意思是5个并发，跑600秒，body为100k大，跑完后显示QPS几百，够了。</p>
<p zid="14" id="zw-1269cec8357kqZwbZ2dbd2a"><br zid="15" id="zw-1269cec840eub61o2dbd2a" />
</p>
<p zid="16" id="zw-1269ceef1212wjRMw2dbd2a">我改动后的http_load.c代码<a zid="17" id="zw-1269cf4e2c9MYhRWf2dbd2a" href="http://donghao.org/src/http_load.c">在这里</a>，diff<a zid="19" id="zw-1269cffc8b5RuYc8R2dbd2a" href="http://donghao.org/src/http_load_body.diff.c">在这里</a>。body的大小不能超过200k，因为我的测试足够了。另外还把SO_SNDBUF开到了最大（rhel4上是128k），因为想把200k一次send出去，这样改最方便。</p>]]></description>
            <link>http://donghao.org/2010/02/web-http-loadueeioauaeo.html</link>
            <guid>http://donghao.org/2010/02/web-http-loadueeioauaeo.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">软件开发</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">curl</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">http_load</category>
            
            <pubDate>Fri, 05 02 2010 15:27:44 +0800</pubDate>
        </item>
        
        <item>
            <title>重现</title>
            <description><![CDATA[周一晚餐吃了碗牛肉汤，开始胃胀。<br />于是按太太的意见，买了点健胃消食片和大山楂丸。<br /><br />今天中午吃饭。<br /><br />我：&nbsp; 昨天吃了消食片和山楂丸，胃好多了。<br />太太：&nbsp; 说明你胃没什么事儿，就是吃太快了，牛肉不易消化。<br />我：&nbsp; 但是何以肯定是牛肉呢？如果是bug，必须能重现才行，所以，我要再喝一碗牛肉汤。<br />太太：&nbsp; ....<br /> ]]></description>
            <link>http://donghao.org/2010/01/ooio.html</link>
            <guid>http://donghao.org/2010/01/ooio.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">对话收录</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">山楂丸</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">胃胀</category>
            
            <pubDate>Wed, 27 01 2010 17:47:36 +0800</pubDate>
        </item>
        
        <item>
            <title>[tcp] http_load报&quot;Cannot assign requested address&quot;</title>
            <description><![CDATA[<p id="zw-1266f1a1b9cjdTgKh2dbd2a" zid="2">使用<a href="http://acme.com/software/http_load/">http_load</a>的过程中遇到了一个报错：<b><span id="zw-1266f1a1b9cbGQXTj2dbd2a" zid="3">Cannot assign requested address</span></b></p>

<p id="zw-1266f1b64f19DKUiN2dbd2a" zid="5">网上找到了原因和解决方案 <a zid="8" id="zw-1266f1b64f25QEMWy2dbd2a" href="http://gcoder.blogbus.com/logs/41839731.html"><span zid="6" id="zw-1266f1aefdd-VwwR62dbd2a">http://gcoder.blogbus.com/logs/41839731.html</span></a></p>

<p id="zw-1266f1c192dh36yJA2dbd2a" zid="9">但是要注意，这是<span zid="17" id="zw-1266f1cdaa1Z5m9MW2dbd2a" style="font-weight: bold;">客户端</span>的问题，是客户端用光了端口号，所以要<span zid="18" id="zw-1266f1cfa88l2F3fw2dbd2a" style="font-weight: bold;">改客户端机器的配置和代码</span>，不是改服务端的！</p>

<p id="zw-1266f230e06FzqFW52dbd2a" zid="21">我在http_load.c里给socket加了一个SO_REUSEADDR，才能工作正常。为什么http_load不加上这个option呢？因为http_load测的是标准的http服务器，比如apache，这些服务端会关闭socket，而我测的是自己写的httpd，所以....看来细节很多啊。</p>]]></description>
            <link>http://donghao.org/2010/01/tcp-http-loadcannot-assign-req.html</link>
            <guid>http://donghao.org/2010/01/tcp-http-loadcannot-assign-req.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">软件开发</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">http_load</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">tcp</category>
            
            <pubDate>Wed, 27 01 2010 17:36:00 +0800</pubDate>
        </item>
        
        <item>
            <title>[pthread] pthread_join与pthread_detach</title>
            <description><![CDATA[<p id="zw-1266edb376azrNzxW2dbd2a" zid="3">pthread_t&nbsp;&nbsp;&nbsp; pthr;<br id="zw-1266eef367bu0g2Zh2dbd2a" zid="7" /></p><p id="zw-1266eef367bdtB_se2dbd2a" zid="8">pthread_create(&amp;pthr, NULL, thread_handler, NULL);</p><p id="zw-1266ef259473gv43_2dbd2a" zid="9">...</p><p id="zw-1266ef260d9gfGXkC2dbd2a" zid="10">void* thread_handler(void* arg)</p><p id="zw-1266ef28e1bAdYA52dbd2a" zid="11">{</p><p id="zw-1266ef2c1cdlH5BK22dbd2a" zid="15">&nbsp;&nbsp;&nbsp; /* do something */</p><p id="zw-1266ef29474dOuX4K2dbd2a" zid="14"><span zid="60" id="zw-1266f12c8e3tifchT2dbd2a" style="color: rgb(255, 0, 0);">&nbsp;&nbsp;&nbsp; pthread_join(pthr, NULL);</span><span zid="41" id="zw-1266f0fed84VX7dmi2dbd2a"></span></p>
<p id="zw-1266f0ff703YZnGh42dbd2a" zid="42">}</p>
<p id="zw-1266f1035acf-2MCb2dbd2a" zid="43"><br id="zw-1266f1035acuGHnUK2dbd2a" zid="4" /></p>
<p id="zw-1266f128524UcH3n2dbd2a" zid="5">上面的代码不好使，pthread_join不能放在pthread调用的handler内，虽然不报错，但是<span zid="59" id="zw-1266f1285246qLswR2dbd2a">thread无法正常回收，如果多次创建thread，内存会越来越大（另一种形式的内存泄露）。</span></p>
<p id="zw-1266f1230cbAfJbVP2dbd2a" zid="61"><span zid="62" id="zw-1266f1230cbqDR-cA2dbd2a">正确的做法是在</span>handler外面pthread_join:</p>
<p id="zw-1266f10b7ebtm1_k2dbd2a" zid="44"><br zid="45" id="zw-1266f10b7ebjXTBXp2dbd2a" />
</p>
<p id="zw-1266f10a9cbmR-K_F2dbd2a" zid="46">pthread_t&nbsp;&nbsp;&nbsp; pthr;<br id="zw-1266f10a9cbTlXlnG2dbd2a" zid="47" /></p><p id="zw-1266f10a9cc3xbAS2dbd2a" zid="48">pthread_create(&amp;pthr, NULL, thread_handler, NULL);</p><p zid="49" id="zw-1266f10d1ffpp1DXx2dbd2a"> <span zid="63" id="zw-1266f12ed29Vx3x512dbd2a" style="color: rgb(255, 0, 0);">pthread_join(pthr, NULL);</span><span id="zw-1266f10d1feib2gy2dbd2a" zid="50"></span></p><p id="zw-1266f10a9cckS1dd-2dbd2a" zid="51">...</p><p id="zw-1266f10a9cc1ftAdN2dbd2a" zid="52">void* thread_handler(void* arg)</p><p id="zw-1266f10a9ccbsqtCc2dbd2a" zid="53">{</p><p id="zw-1266f10a9cdxVT5Rv2dbd2a" zid="54">&nbsp;&nbsp;&nbsp; /* do something */</p><p id="zw-1266f10a9cd061pxh2dbd2a" zid="55">}</p><p id="zw-1266f10a9cdIIOlOJ2dbd2a" zid="56"><br zid="57" id="zw-1266f10a9cdG4aHoE2dbd2a" /></p><p id="zw-1266ef73a26Z6jrt12dbd2a" zid="31">如果不用pthread_join，改用pthread_detach呢？那最方便，但要注意：pthread_detach最好是放在handler里面第一句。</p>
<p id="zw-1266f1345d7cZ4pdn2dbd2a" zid="64"><br zid="65" id="zw-1266f1345d8OJ3agz2dbd2a" />
</p>
<p id="zw-1266ef7413dFUZr9f2dbd2a" zid="21">void* thread_handler(void* arg)</p><p id="zw-1266ef7413e2X5GJD2dbd2a" zid="22">{</p><p id="zw-1266ef7413eNYUx8N2dbd2a" zid="23">&nbsp;&nbsp;&nbsp; pthread_detach(pthr);<br id="zw-1266ef7413eGp6U4_2dbd2a" zid="24" /></p><p id="zw-1266ef7413fgG6R8-2dbd2a" zid="25">&nbsp;&nbsp;&nbsp; /* do something */</p><p id="zw-1266ef7413fLcrWj2dbd2a" zid="28">}</p>
<p id="zw-1266f134bc3cAeU7W2dbd2a" zid="66"><br zid="67" id="zw-1266f134bc3gVnhTN2dbd2a" />
</p>
<p id="zw-1266ef69ea9OPJue92dbd2a" zid="30">如果pthread_create后紧跟pthread_detach，有可能会出错。<br id="zw-1266ef69ea9eOKeoK2dbd2a" zid="6" /></p> ]]></description>
            <link>http://donghao.org/2010/01/pthread-pthread-joinoepthread.html</link>
            <guid>http://donghao.org/2010/01/pthread-pthread-joinoepthread.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">软件开发</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">pthread</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">pthread_detach</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">pthread_join</category>
            
            <pubDate>Wed, 27 01 2010 17:21:35 +0800</pubDate>
        </item>
        
        <item>
            <title>[shell] grep里的星号（*）和双引号（“）</title>
            <description><![CDATA[<p zid="2" id="zw-126649eff4aXh-Iiw2dbd2a">小心使用grep里的星号（*）</p>

<p zid="5" id="zw-126649f2321N0E1vv2dbd2a">grep "/home/.*test"</p>
<p zid="8" id="zw-12664a48b3akd6TTC2dbd2a">上面这句是找出所有/home目录下，以test结尾的文件</p>

<p zid="12" id="zw-12664a4c7ebCeZ9bS2dbd2a">grep "/home/*test"</p>
<p zid="13" id="zw-12664a5173bMqc5082dbd2a">这句可就不是了，这句grep只匹配以下的文件名：</p>
<p zid="14" id="zw-12664a538a4aDLdd2dbd2a">/hometest</p>
<p zid="15" id="zw-12664a5517fLj1Dg02dbd2a">/home/test</p>
<p zid="16" id="zw-12664a559344YW5852dbd2a">/home//test</p>
<p zid="19" id="zw-12664a560b8DwBnCF2dbd2a">/home///test</p>

<p zid="22" id="zw-12664a56eccH_Tcs02dbd2a">看明白了，星号（*）代表重复其前面的字符任意次（包括零），而“/*“当然就表示重复”/”任意次。</p>

<p zid="25" id="zw-12664a6a4d1vxGNuO2dbd2a">另外注意grep后面的正则表达式务必加上双引号，如果不加，在一些特殊场合会有完全不同的含义。</p>
<p zid="26" id="zw-12664a70d206iY4Qg2dbd2a">比如我当前目录下有六个文件:</p>

<p zid="27" id="zw-12664ade676Fu-Wfj2dbd2a">testa</p>
<p zid="28" id="zw-12664adec1fIrciur2dbd2a">testb<br zid="29" id="zw-12664adf64aEUJnl2dbd2a" />
</p>
<p zid="30" id="zw-12664adf649B8Ll1P2dbd2a">testc</p>
<p zid="31" id="zw-12664adfc4dXZU3hI2dbd2a">testd</p>
<p zid="32" id="zw-12664ae0356CUfTIi2dbd2a">tt</p>
<p zid="59" id="zw-12664b7b9b8CDKdhO2dbd2a">t<br zid="60" id="zw-12664b7b9b8npEdMY2dbd2a" />
</p>

<p zid="37" id="zw-12664ad8ef5qaD0m62dbd2a">运行：</p>

<p zid="42" id="zw-12664aedba9cKy092dbd2a">ls -l|grep t*t<br zid="47" id="zw-12664b14b8bjijAaE2dbd2a" />
</p>

<p zid="43" id="zw-12664b80877Awmp462dbd2a">它会把这五个文件都列出来吗？不，结果<span zid="61" id="zw-12664b80877s71JXH2dbd2a" style="font-weight: bold;">显示只找到了文件tt</span><span zid="44" id="zw-12664b80877u4ghT2dbd2a" style="font-weight: bold;"></span></p>
<p zid="50" id="zw-12664b6f5acnf-Kvq2dbd2a"><span zid="51" id="zw-12664b6f5adQN1P092dbd2a" style="font-weight: bold;"><span zid="53" style="font-weight: bold;"></span></span><span zid="54" id="zw-12664b6f5adcHX95M2dbd2a">因为上面的shell命令，grep</span><span zid="55" id="zw-12664b6f5adnqyzum2dbd2a" style="font-weight: bold;"><span zid="56" style="font-weight: bold;"></span>实际上是在找以t开头且以t结尾的文件(这一规则和ls的规则一样）</span></p>
<p zid="62" id="zw-12664b8a2cd0obnk2dbd2a">要想grep把后面的”t*t”当成正则表达式，需要加上双引号：</p>

<p zid="67" id="zw-12664b8ea31qjEeS2dbd2a">ls -l|grep "t*t"</p>

<p zid="70" id="zw-12664b9149fBYfDiR2dbd2a">这下结果ok了：所有六个文件都可以被找到。<br zid="63" id="zw-12664b914a0880bv-2dbd2a" />
<span zid="64" id="zw-12664b914a0p7fwT2dbd2a" style="font-weight: bold;"></span></p>
<p zid="57" id="zw-12664b59ce6JrHqMm2dbd2a"><span zid="58" id="zw-12664b59ce6yEypDU2dbd2a" style="font-weight: bold;"></span></p>]]></description>
            <link>http://donghao.org/2010/01/shell-grepaiacaieoya.html</link>
            <guid>http://donghao.org/2010/01/shell-grepaiacaieoya.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">软件开发</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">grep</category>
            
            <pubDate>Mon, 25 01 2010 16:02:17 +0800</pubDate>
        </item>
        
        <item>
            <title>[compiler] gcc下的errno冲突</title>
            <description><![CDATA[struct example<br zid="2" />
{<br zid="3" />
<span zid="4">&nbsp;&nbsp;&nbsp; ....<br zid="5" />
<span zid="6">&nbsp;&nbsp;&nbsp; int errno<br zid="7" />
};<br zid="8" />
<br zid="9" />
上面的example结构使用errno做成员变量名，按理说不会和&lt;errno.h&gt;里的errno宏冲突，因为它在struct里，何况我根本没有包含errno.h文件<br />在大部分机器上，这可以编译成功。但是，在有的环境确实无法编译通过，gcc不认errno前面的“-&gt;”指针符号。<br />看来&lt;errno.h&gt;里的errno宏漏进了文件，但是怎么漏进来的？不详。<br zid="10" />
这位老兄和我遇到的问题一样: <a zid="11" href="http://gcc.gnu.org/ml/gcc/2001-12/msg00766.html">http://gcc.gnu.org/ml/gcc/2001-12/msg00766.html</a><br zid="12" />
但那毕竟是老gcc下的问题了，现在应该没有了。<br zid="13" />
<br zid="14" />
在查到详细原因之前，还是把errno改了为妙，毕竟变量名和系统全局变量（或宏）弄成一样，是有风险的。<br zid="1" />
</span></span> ]]></description>
            <link>http://donghao.org/2010/01/compiler-gcciaaerrnoai.html</link>
            <guid>http://donghao.org/2010/01/compiler-gcciaaerrnoai.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">软件开发</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">errno</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">gcc</category>
            
            <pubDate>Thu, 21 01 2010 18:18:33 +0800</pubDate>
        </item>
        
        <item>
            <title>未了的传奇</title>
            <description><![CDATA[<a href="http://www.douban.com/subject/3094284/"><img src="http://t.douban.com/mpic/s3174022.jpg" style="border: 0pt none ; padding: 0pt 0pt 20px 20px; float: right;" /></a>
<span zid="35">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>上世纪60年代，泛美航空的老大和波音公司的老大碰了个头，泛美的老大说：<br zid="5" /><span zid="36">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>“俺们要一款特能装人的飞机，最好是分上下两层，使劲装，装得越多，俺们钱赚得越多哩”<br zid="6" /><span zid="37">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>波音的老大说：<br zid="7" /><span zid="38">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>“<span zid="39"></span>好办！我叫人做个超大的，像货轮那么大的！”<br zid="2" /><span zid="40">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>两个老大拍了板，下面的人就忙起来。<br zid="4" /><br zid="3" /><span zid="41">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>乔.萨特从小在西雅图长大，只比1916年建立的波音公司小5岁，他的童年是看着波音的一架架试飞飞机渡过的，每款他都很熟悉，于是干脆二战结束后就进了波音，当工程师。<br zid="8" /><span zid="42">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>听到航空公司的客户需求代表说要造大飞机，乔.萨特问：<br zid="9" /><span zid="43">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>“你要装200人？300人？还是400人？”<br zid="10" /><span zid="44">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>“450人！“<br zid="11" /><span zid="45">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>“扶住我......”，乔.萨特喘了口气，重新站稳：“没问题！俺们给你造！”<br zid="12" /><br zid="13" /><span zid="46">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>乔.萨特出任波音747项目的技术总监，为了在几年内造出这架人类史上最大的喷气式客机，整个747项目组都在加班，从9点到23点，从周一到周六，经常半夜上线....不好意思，说蹿了，是半夜交付设计图纸。<br zid="14" /><br zid="15" /><span zid="47">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>波音当时还有“超音速运输机”计划、“第二代737改型“计划，还派出工程师去帮NASA造火箭——总之，747项目的资源很少，顶尖的工程师和管理人员都在搞很前卫的“超音速运输机”项目。<br zid="16" /><span zid="48">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>乔.
萨特不仅要去抢资源，还要对付“外来的婆婆”——就是从其它项目调来的、一来就想代替萨特当主管的新管理人员，这些人很讨厌，由于中途做747项目，他们
啥也不清楚，但却想表现自己的“决断力”，于是，一通瞎指挥。此时，乔.萨特表现出了他工程师的斩钉截铁的个性，他直接对<span zid="49"></span>总部说：<br zid="17" /><span zid="50">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>“要么调他们离开，要么调我离开”<br zid="19" /><span zid="51">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>说完开车回家。<br zid="20" /><span zid="52">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>要不说波音牛呢，他们在关键时刻选择了“专家”，而不是“专管”。于是，那家伙走人了，乔.萨特复原职。<br zid="21" /><br zid="22" /><span zid="53">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>波音747用了4台普惠公司的JT9D发动机，其中一台的推力就是4万磅（波音737的发动机是一台1.5万磅，大家可以畅想一下），如此巨大而新型的发动机，当然是问题不断。747原型机在测试的时候，经常会有发动机损坏、起火、融化、爆炸等，俨然四个定时炸弹。<br zid="23" /><span zid="54">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>乔.萨特每遇问题，必狠踢普惠公司的屁股，直到惠普交付合格的发动机。<br zid="24" /><span zid="55">&nbsp;&nbsp;&nbsp; <br zid="56" />
</span><span zid="57">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>但是，普惠的JT9D发动机当时还有“喘振”的问题。所谓“喘振”，就是发动机会突然像患了哮喘一样，一会儿吸不进气，一会儿有大量吸进，有时甚至倒转往前喷气。没有哪个乘客想遭遇这样的发动机吧？<br zid="25" /><span zid="58">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>“喘振”问题是航空发动机最难克服的问题，很难重现，重现条件不明，原因也就难以定位，就像软件的内存泄露bug一样，难以对付。<br zid="26" /><span zid="59">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>更夸张的是，惠普根本不打算去fix这个bug，他们等着波音来fix。波音也算人才济济，居然有空气动力学的专家找出了原因，告诉了普惠，普惠这才有了今天优良的JT9D发动机。<br zid="27" /><span zid="60">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>所以，用别人的组件遇到问题时，别光等，找找原因，如果自己克服了，以后就能鄙视提供组件的人。<br zid="28" /><br zid="29" /><span zid="61">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>波音747于1969年首飞成功，缔造了航空业的传奇。成为美国航空技术的标志。即使到今天也只有美、俄、欧洲能造大型客机。其它的国家还有机会吗？先确立正确的科学观念、培养实用的技术人才再说吧。<br zid="33" /><br zid="30" /><span zid="62">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>今天大家只记得采用成熟技术的波音747飞机，而那个采用太空技术的高级货“超音速运输机”项目，早已没人记得了。<br zid="31" /><span zid="63">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>技术这种东西，重要的是好用，好赚钱，而不是为了好听，或听起来酷。<br zid="32" /><span zid="64">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>就像当年何等火热的COM技术、ATL、网格计算、SOA等等，现在应该是冷门了吧？那今天的云计算、框计算，是否也会一样呢？让我们拭目以待。<br zid="1" /> ]]></description>
            <link>http://donghao.org/2010/01/iaeaaeae.html</link>
            <guid>http://donghao.org/2010/01/iaeaaeae.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">钢铁力量</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">乔.萨特</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">JT9D</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">波音</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">波音747</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">航空</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">普惠</category>
            
            <pubDate>Thu, 21 01 2010 10:31:21 +0800</pubDate>
        </item>
        
    </channel>
</rss>
