??xml version="1.0" encoding="utf-8" standalone="yes"?>久久青青草原综合伊人,一级做a爱片久久毛片,999久久久国产精品http://m.shnenglu.com/mysileng/zh-cnThu, 03 Jul 2025 23:07:38 GMTThu, 03 Jul 2025 23:07:38 GMT60C/C++ Volatile关键词深度剖?/title><link>http://m.shnenglu.com/mysileng/archive/2015/01/13/209505.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Tue, 13 Jan 2015 12:35:00 GMT</pubDate><guid>http://m.shnenglu.com/mysileng/archive/2015/01/13/209505.html</guid><wfw:comment>http://m.shnenglu.com/mysileng/comments/209505.html</wfw:comment><comments>http://m.shnenglu.com/mysileng/archive/2015/01/13/209505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/mysileng/comments/commentRss/209505.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/mysileng/services/trackbacks/209505.html</trackback:ping><description><![CDATA[     摘要: 1    背景    12    VolatileQ易变的    12.1    结    23    Volatil...  <a href='http://m.shnenglu.com/mysileng/archive/2015/01/13/209505.html'>阅读全文</a><img src ="http://m.shnenglu.com/mysileng/aggbug/209505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/mysileng/" target="_blank">鑫龙</a> 2015-01-13 20:35 <a href="http://m.shnenglu.com/mysileng/archive/2015/01/13/209505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>__builtin_expect 解惑http://m.shnenglu.com/mysileng/archive/2014/09/29/208454.html鑫龙鑫龙Mon, 29 Sep 2014 13:31:00 GMThttp://m.shnenglu.com/mysileng/archive/2014/09/29/208454.htmlhttp://m.shnenglu.com/mysileng/comments/208454.htmlhttp://m.shnenglu.com/mysileng/archive/2014/09/29/208454.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/208454.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/208454.html阅读全文

鑫龙 2014-09-29 21:31 发表评论
]]>
cmake与boost (muduo的准备工?http://m.shnenglu.com/mysileng/archive/2014/09/23/208383.html鑫龙鑫龙Tue, 23 Sep 2014 01:29:00 GMThttp://m.shnenglu.com/mysileng/archive/2014/09/23/208383.htmlhttp://m.shnenglu.com/mysileng/comments/208383.htmlhttp://m.shnenglu.com/mysileng/archive/2014/09/23/208383.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/208383.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/208383.html一?/span>linux下安装cmake

首先下蝲源码?br />        http://www.cmake.org/cmake/resources/software.html

        q里下蝲的是cmake-2.8.9.tar.gz

随便找个目录解压~?/p>

1         tar -xzvf cmake-2.8.9.tar.gz
2         cd cmake-cmake-2.8.9

        依次执行Q?/p>

1         ./bootstrap
2          make
3         make install

        cmake ?x)默认安装?/usr/local/bin 下面

要改变安装\径,在bootstrap命o(h)中加?--prefix=PATH'选项?


二?/span>linux下安装boost
linuxq_下要~译安装除gcc和gcc-c++之外Q还需要两个开发库Qbzip2-devel 和python-develQ因此在安装前应该先保证q两个库已经安装Q?br />

#yum install gcc gcc-c++ bzip2 bzip2-devel bzip2-libs python-devel -y

然后是去官网下蝲源码包,地址
下蝲Q解压,按照如下步骤Q?br />

#tar xvzf boost_1_50_0.tar.gz

q入boost_1_50_0目录Q?br />

#cd boost_1_50_0

然后是编译安装,boost源码包中有配|脚本,直接用就可以Q?/p>

#sh ./bootstrap.sh

Building Boost.Build engine with toolset gcc... tools/build/v2/engine/bin.linuxx86_64/b2
Detecting Python version... 2.6
Detecting Python root... /usr
Unicode/ICU support for Boost.Regex?... not found.
Generating Boost.Build configuration in project-config.jam...

Bootstrapping is done. To build, run:

./b2

To adjust configuration, edit 'project-config.jam'.
Further information:

- Command line help:
./b2 --help

- Getting started guide:
http://www.boost.org/more/getting_started/unix-variants.html

- Boost.Build documentation:
http://www.boost.org/boost-build2/doc/html/index.html

接下来就是编译,重点x是否~译成功Q?br />

#./b2

然后是漫长的等待,如果最后出玎ͼ(x)

The Boost C++ Libraries were successfully built!

The following directory should be added to compiler include paths:

/home/gang/BAK/boost_1_50_0

The following directory should be added to linker library paths:

/home/gang/BAK/boost_1_50_0/stage/lib

表示~译成功Q如果没有成功,需要回查看哪里出现errorQ再安装相应的库Q?br />最后就是安装:(x)

#./b2 install --prefix=/usr/local

安装后的头文件在/usr/local/include/boost里面Q而相应的库在/usr/local/lib/libboost_*


鑫龙 2014-09-23 09:29 发表评论
]]>
jQuery之防止冒泡事?http://m.shnenglu.com/mysileng/archive/2014/09/17/208340.html鑫龙鑫龙Wed, 17 Sep 2014 06:22:00 GMThttp://m.shnenglu.com/mysileng/archive/2014/09/17/208340.htmlhttp://m.shnenglu.com/mysileng/comments/208340.htmlhttp://m.shnenglu.com/mysileng/archive/2014/09/17/208340.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/208340.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/208340.html转自Q?a >http://www.cnblogs.com/jiqing9006/archive/2012/09/11/2679831.html

冒事g是点击子节点,?x)向上触发父节点Q祖先节点的点击事g?/p>

下面是html代码部分Q?/p>

<body>
<div id="content">
    外层div元素
    <span>内层span元素</span>
    外层div元素
</div>

<div id="msg"></div>
</body>

对应的jQuery代码如下Q?/p>

<script type="text/javascript">
$(function(){
    // 为span元素l定click事g
    $('span').bind("click",function(){
        var txt = $('#msg').html() + "<p>内层span元素被点?<p/>";//获取html信息
        $('#msg').html(txt);// 讄html信息
    });
    // 为div元素l定click事g
    $('#content').bind("click",function(){
        var txt = $('#msg').html() + "<p>外层div元素被点?<p/>";
        $('#msg').html(txt);
    });
    // 为body元素l定click事g
    $("body").bind("click",function(){
        var txt = $('#msg').html() + "<p>body元素被点?<p/>";
        $('#msg').html(txt);
    });
})
</script>

当点击spanӞ?x)触发div与body 的点M件。点击div时会(x)触发body的点M件?/p>

如何防止q种冒事g发生呢?

修改如下Q?/p>

<script type="text/javascript">
$(function(){
       // 为span元素l定click事g
    $('span').bind("click",function(event){
        var txt = $('#msg').html() + "<p>内层span元素被点?<p/>";
        $('#msg').html(txt);
        event.stopPropagation();    //  L事g冒
    });
    // 为div元素l定click事g
    $('#content').bind("click",function(event){
        var txt = $('#msg').html() + "<p>外层div元素被点?<p/>";
        $('#msg').html(txt);
        event.stopPropagation();    //  L事g冒
    });
    // 为body元素l定click事g
    $("body").bind("click",function(){
        var txt = $('#msg').html() + "<p>body元素被点?<p/>";
        $('#msg').html(txt);
    });
})
</script>

event.stopPropagation(); // L事g冒

 

有时候点?yn)L交按钮会(x)有一些默认事件。比如蟩转到别的界面。但是如果没有通过验证的话Q就不应该蟩转。这时候可以通过讄event.preventDefault(); //L默认行ؓ(f) ( 表单提交 )?/p>

下面是案例:(x)

<script type="text/javascript">
$(function(){
   $("#sub").bind("click",function(event){
         var username = $("#username").val();  //获取元素的|val() Ҏ(gu)q回或设|被选元素的倹{?/span>
         if(username==""){     //判断值是否ؓ(f)I?/span>
             $("#msg").html("<p>文本框的g能ؓ(f)I?</p>");  //提示信息
             event.preventDefault();  //L默认行ؓ(f) ( 表单提交 )
         }
   })
})
</script>

html部分Q?/p>

<body>
<form action="test.html">
用户名:(x)<input type="text" id="username" />
<br/>
<input type="submit" value="提交" id="sub"/>
</form>

<div id="msg"></div>
</body>

q有一U防止默认行为的Ҏ(gu)是return false。效果一栗?/p>

代码如下Q?/p>

<script type="text/javascript">
$(function(){
   $("#sub").bind("click",function(event){
         var username = $("#username").val();  //获取元素的?/span>
         if(username==""){     //判断值是否ؓ(f)I?/span>
             $("#msg").html("<p>文本框的g能ؓ(f)I?</p>");  //提示信息
             return false;
         }
   })
})
</script>

同理Q上面的冒事g也可以通过return false来处理?/p>

<script type="text/javascript">
$(function(){
       // 为span元素l定click事g
    $('span').bind("click",function(event){
        var txt = $('#msg').html() + "<p>内层span元素被点?<p/>";
        $('#msg').html(txt);
        return false;
    });
    // 为div元素l定click事g
    $('#content').bind("click",function(event){
        var txt = $('#msg').html() + "<p>外层div元素被点?<p/>";
        $('#msg').html(txt);
        return false;
    });
    // 为body元素l定click事g
    $("body").bind("click",function(){
        var txt = $('#msg').html() + "<p>body元素被点?<p/>";
        $('#msg').html(txt);
    });
})
</script>


鑫龙 2014-09-17 14:22 发表评论
]]>
q行~程——ƈ发?http://m.shnenglu.com/mysileng/archive/2014/09/12/208282.html鑫龙鑫龙Fri, 12 Sep 2014 05:05:00 GMThttp://m.shnenglu.com/mysileng/archive/2014/09/12/208282.htmlhttp://m.shnenglu.com/mysileng/comments/208282.htmlhttp://m.shnenglu.com/mysileng/archive/2014/09/12/208282.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/208282.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/208282.html转自Q?a >http://www.cnblogs.com/jiayy/p/3246167.html

在看多核~程相关论文Ӟ往往一个ƈ发算法会(x)说自己是wait-free的或者lock-free的,或者是 non-blocking 的,q些专有词汇其实表示的是q发的程度,或者说q发的别。ƈ发别的理解是阅dUƈ发算法设计论文以及ƈ发数据结构实现的必备基础?/p>

1.1  Wait-freedom 无等待ƈ?/p>

Wait-freedom 指的是每一个线E都一直运行下去而无ȝ待外部条Ӟ整个程中Q何操作都能在一个有限的步骤内完成,q是最高的q发U别Q没有Q何阻塞?/p>

 l合之前原子操作部分的知识,可以单认够直接调用一个原子操作实现的法或程序就属于Wait-freeQ比如下面的 increment_reference_counter 函数是wait-free的,它封装了atomic_incrementq个原子自增原语Q多个线E可以同时调用这个函数对同一个内存变量进行自增,而无MQ何阻塞(其实也是有阻塞的Q是ȝ锁别)

 与此做对比,CAScȝ调用׃是wait-free的,注意wait-free的原语都不能包含内部循环QCAS原语使用旉常包含?#8220;循环直到成功”的@环内部?/p>

 void increment_reference_counter(rc_base* obj)

{

    atomic_increment(obj->rc);

}

1.2  Lock-freedom 无锁q发

Lock-freedom 指的是整个系l作Z个整体一直运行下去,pȝ内部单个U程某段旉内可能会(x)饥饿Q这是比wait-freedomqq发U别Q但pȝ整体上看依然是没有阻塞的。所有wait-free的算法显焉满lock-free的要求?/p>

 Lock-free法通常可以通过同步原语 CAS实现?/p>

 void stack_push(stack* s, node* n)

{

    node* head;

    do

    {

        head = s->head;

        n->next = head;

    }

    while ( ! atomic_compare_exchange(s->head, head, n));

}

多个U程同时调用上述函数Q理Z某个U程可以一直困在@环内部,但一旦有一个线E原子操作失败而返回@环,意味着有其他线E成功执行了原子操作而退出@环,从而保证系l整体是没有d的?/p>

 其实前面的原子自增函C可以用下面的原语实现Q在q种实现里,不再是所有线E都无阻塞了Q某些线E可能会(x)因ؓ(f)CASp|而回l若q次循环?/p>

void increment_reference_counter(rc_base* obj)

{

       Int rc;

       Do {

       rc = obj->rc;

} while(!atomic_compare_exchange(obj->rc,rc,rc+1));

}

1.3  Obstruction-freedom 无阻塞ƈ?/p>

Obstruction-free 是指在Q何时间点Q一个孤立运行线E的每一个操作可以在有限步之内结束。只要没有竞争,U程可以持l运行,一旦共享数据被修改QObstruction-free 要求中止已经完成的部分操作,q进行回滚,obstruction-free 是ƈ发别更低的非阻塞ƈ发,该算法在不出现冲H性操作的情况下提供单U程式的执行q度保证Q所?Lock-Free 的算法都?Obstruction-free 的?/p>

1.4  Blocking algoithms dq发

dcȝ法是ƈ发别最低的同步法Q它一般需要生阻塞。可以简单认为基于锁的实现是blocking的算法。详l参考第五章

上述几种q发U别可以使用下图描述Q?br />蓝色是阻塞的法Q绿色是非阻塞算法,金字塔越上方Qƈ发别越高,性能好Q右边的金字塔是实现工具Q原子操作、锁、互斥体{)



鑫龙 2014-09-12 13:05 发表评论
]]>
lock free的理?/title><link>http://m.shnenglu.com/mysileng/archive/2014/09/03/208222.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Wed, 03 Sep 2014 13:11:00 GMT</pubDate><guid>http://m.shnenglu.com/mysileng/archive/2014/09/03/208222.html</guid><wfw:comment>http://m.shnenglu.com/mysileng/comments/208222.html</wfw:comment><comments>http://m.shnenglu.com/mysileng/archive/2014/09/03/208222.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/mysileng/comments/commentRss/208222.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/mysileng/services/trackbacks/208222.html</trackback:ping><description><![CDATA[<div>转自Q?a >http://www.isnowfy.com/understand-to-lock-free/</a><br /><br /> <p>以前一直不明白lock free是什么,后来发现原来是完全理解错了概念,lock free看到大家有的译为无锁,有的译为锁无关Q其实用不用锁和lock free是不相关的,用了锁也可能是lock freeQ而不用锁有可能不是lock free?br /><span id="more-962"></span></p> <p>一个lock free的解释是</p> <blockquote> <p>一?#8220;锁无?#8221;的程序能够确保执行它的所有线E中臛_有一个能够l往下执行?</p></blockquote> <p>其实看我们那副图是说你的各个线E不?x)互盔R塞,那么你的E序才能成ؓ(f)lock free的。像我们q_用的互斥锁,当有U程获得锁,其他U程pd掉了Q这里的问题是如果获得锁的U程挂掉了,而且锁也没有释放Q那么整个程序其实就被block在那了,而如果程序是lock free的那么即使有U程挂掉Q也不媄响整个程序l向下进行,也就是系l在整体上而言是一直前q的?/p> <p>那么Q不用锁是lock free的吗Q一开始就提到了,不用锁也可能不是lock free的,举个例子</p> <div id="b7nfjpd" class="geshi no c"> <ol><li id="jztfbh7" class="li1"> <div id="7r7d9rr" class="de1"><span id="zd9zb7l" class="kw1">while</span> <span id="7z9jb9l" class="br0">(</span>x <span id="9f9rf7h" class="sy0">==</span> <span id="jdf7ffd" class="nu0">0</span><span id="jdp999b" class="br0">)</span> <span id="9zln99f" class="br0">{</span></div></li><li id="df977bv" class="li1"> <div id="jx9tnlr" class="de1">    x <span id="vxhb7nn" class="sy0">=</span> <span id="pbdnfdj" class="nu0">1</span><span id="7zlnrx9" class="sy0">-</span>x;</div></li><li id="nj9l7tr" class="li1"> <div id="v7ztnlh" class="de1"><span id="xr79jh9" class="br0">}</span></div></li></ol></div> <p>在这里如果两个线E同时执行,可能同时q入while循环Q然后x两次改变g后,依然?Q那么两个线E就?x)一直互相在q里d掉了Q所以这里虽然没有锁Q依然不是lock free的?/p> <p>现在大家写lock free的时候一般都?x)用CASQcompare and setQ操作来写,因ؓ(f)现在很多的cpu都是支持CAS操作q作为原子操作来处理的,CAS操作一般是q样?/p> <div id="nhj7jjh" class="geshi no c"> <ol><li id="9rbnzn9" class="li1"> <div id="tfhjdr7" class="de1">bool compare_and_swap <span id="77v9nd9" class="br0">(</span><span id="fjlvz9b" class="kw4">int</span> <span id="t77d9zz" class="sy0">*</span>oldval, <span id="x7x7trp" class="kw4">int</span> <span id="7jln997" class="sy0">*</span>dest, <span id="v7n9zzv" class="kw4">int</span> newval<span id="7pjdf77" class="br0">)</span> <span id="j9bvhx7" class="br0">{</span></div></li><li id="rzrvv7r" class="li1"> <div id="9n79999" class="de1">  <span id="z97bddz" class="kw1">if</span> <span id="vdvzljr" class="br0">(</span><span id="7799pjr" class="sy0">*</span>oldval <span id="77p9v9p" class="sy0">==</span> <span id="ft99vt7" class="sy0">*</span>dest<span id="z797pfd" class="br0">)</span> <span id="jh79999" class="br0">{</span></div></li><li id="b7fhtp9" class="li1"> <div id="9t7pzfn" class="de1">      <span id="97r9trh" class="sy0">*</span>dest <span id="97bdvbj" class="sy0">=</span> newval;</div></li><li id="t9z7tz9" class="li1"> <div id="9tprrpp" class="de1">      <span id="779jp7r" class="kw1">return</span> <span id="17v9zxx" class="kw2">true</span>;</div></li><li id="9d9n7rp" class="li1"> <div id="frldzhd" class="de1">  <span id="jdx7ltj" class="br0">}</span></div></li><li id="xx9dvl9" class="li1"> <div id="bbn9j9l" class="de1">  <span id="dzjtv9t" class="kw1">return</span> <span id="h7trd9f" class="kw2">false</span>;</div></li><li id="lhhldt9" class="li1"> <div id="dv7dx7x" class="de1"><span id="jx9z7nt" class="br0">}</span></div></li></ol></div> <p>其实q样一个操作和乐观锁很像,q且操作单,相应的比互斥锁的代h(hun)要小。所以现在大安是喜Ƣ用lock free的技术来提高pȝ的performance?/p> <p>最后如果大家对于如何编写lock free的数据结构感兴趣的话Q可以参考我后面l出的链接?/p> <p><a >一U高效无锁内存队列的实现</a><br /><a >无锁队列的实?/a><br /><a >锁无关的(Lock-Free)数据l构</a><br /><a >An Introduction to Lock-Free Programming</a></p></div><img src ="http://m.shnenglu.com/mysileng/aggbug/208222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/mysileng/" target="_blank">鑫龙</a> 2014-09-03 21:11 <a href="http://m.shnenglu.com/mysileng/archive/2014/09/03/208222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>客户端connect()函数d问题解决http://m.shnenglu.com/mysileng/archive/2014/08/23/208106.html鑫龙鑫龙Sat, 23 Aug 2014 09:01:00 GMThttp://m.shnenglu.com/mysileng/archive/2014/08/23/208106.htmlhttp://m.shnenglu.com/mysileng/comments/208106.htmlhttp://m.shnenglu.com/mysileng/archive/2014/08/23/208106.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/208106.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/208106.html转自Q?a >http://zhucuicui.96986.blog.163.com/blog/static/5833370220136219016445/

建立socket后默认connect()函数为阻塞连接状态,在大多数实现中,connect的超时时间在75s臛_分钟之间Q想要羃短超时时_(d)可解决问题的两种Ҏ(gu)Q方法一、将socket句柄讄为非d状态,Ҏ(gu)二、采用信号处理函数设|阻塞超时控制?/strong>

在一个TCP套接口被讄为非d之后调用connect,connect?x)立卌回EINPROGRESS错误,表示q接操作正在q行?但是仍未完成;同时TCP的三路握手操作l进?在这之后,我们可以调用select来检查这个链接是否徏立成?非阻塞connect有三U用?
1.我们可以在三路握手的同时做一些其它的处理.connect操作要花一个往q时间完?而且可以是在M地方,从几个毫U的局域网到几百毫U或几秒的广域网.在这D|间内我们可能有一些其他的处理惌执行;
2.可以用这U技术同时徏立多个连?在Web览器中很普?
3.׃我们使用select来等待连接的完成,因此我们可以lselect讄一个时间限?从而羃短connect的超时时?在大多数实现?connect的超时时间在75U到几分钟之?有时候应用程序想要一个更短的时旉,使用非阻塞connect是一U方?
非阻塞connect听v来虽然简?但是仍然有一些细节问题要处理:
1.即套接口是非阻塞的,如果q接的服务器在同一CZ,那么在调用connect建立q接?q接通常?x)立卛_立成?我们必须处理q种情况;
2.源自Berkeley的实?和Posix.1g)有两条与select和非dIO相关的规?
A:当连接徏立成功时,套接口描q符变成可写;
B:当连接出错时,套接口描q符变成既可d可写;
注意:当一个套接口出错?它会(x)被select调用标记为既可读又可?

非阻塞connect有这么多好处,但是处理非阻塞connect时会(x)遇到很多可移植性问?

处理非阻塞connect的步?
W一?创徏socket,q回套接口描q符;
W二?调用fcntl把套接口描述W设|成非阻?
W三?调用connect开始徏立连?
W四?判断q接是否成功建立;
A:如果connectq回0,表示q接U成?服务器可客户端在同一台机器上时就有可能发生这U情?;
B:调用select来等待连接徏立成功完?
如果selectq回0,则表C徏立连接超?我们q回时错误l用?同时关闭q接,以防止三路握手操作l进行下?
如果selectq回大于0的?则需要检查套接口描述W是否可L可写;如果套接口描q符可读或可?则我们可以通过调用getsockopt来得到套接口上待处理的错?SO_ERROR),如果q接建立成功,q个错误值将?,如果建立q接旉到错?则这个值是q接错误所对应的errno?比如:ECONNREFUSED,ETIMEDOUT{?.
"d套接口上的错?是遇到的W一个可UL性问?如果出现问题,getsockopt源自Berkeley的实现是q回0,{待处理的错误在变量errno中返?但是Solaris?x)让getsockoptq回-1,errno|ؓ(f)待处理的错误;我们对这两种情况都要处理;

q样,在处理非dconnect?在不同的套接口实现的q_中存在的UL性问?首先,有可能在调用select之前,q接已l徏立成?而且Ҏ(gu)的数据已l到?在这U情况下,q接成功时套接口既可读又可?q和q接p|时是一L(fng).q个时候我们还得通过getsockopt来读取错误?q是W二个可UL性问?
UL性问题ȝ:
1.对于出错的套接口描述W?getsockopt的返回值源自Berkeley的实现是q回0,待处理的错误值存储在errno?而源自Solaris的实现是q回0,待处理的错误存储在errno?(套接口描q符出错时调用getsockopt的返回g可移?
2.有可能在调用select之前,q接已l徏立成?而且Ҏ(gu)的数据已l到?在这U情况下,套接口描q符是既可读又可?q与套接口描q符出错时是一L(fng);(怎样判断q接是否建立成功的条件不可移?

q样的话,在我们判断连接是否徏立成功的条g不唯一?我们可以有以下的Ҏ(gu)来解册个问?/font>:
1.调用getpeername代替getsockopt.如果调用getpeernamep|,getpeernameq回ENOTCONN,表示q接建立p|,我们必须以SO_ERROR调用getsockopt得到套接口描q符上的待处理错?
2.调用read,d长度?字节的数?如果read调用p|,则表C接徏立失?而且readq回的errno指明了连接失败的原因.如果q接建立成功,read应该q回0;
3.再调用一ơconnect.它应该失?如果错误errno是EISCONN,pC套接口已经建立,而且W一ơ连接是成功?否则,q接是p|?

被中断的connect:
如果在一个阻塞式套接口上调用connect,在TCP的三路握手操作完成之前被中断?比如?被捕L(fng)信号中断,会(x)发生什么呢?假定connect不会(x)自动重启,它将q回EINTR.那么,q个时?我们׃能再调用connect{待q接建立完成?如果再次调用connect来等待连接徏立完成的?connect会(x)q回错误值EADDRINUSE.在这U情况下,应该做的是调用select,像在非d式connect中所做的一?然后,select在连接徏立成?使套接口描述W可?或连接徏立失?使套接口描述W既可读又可?时返?

Ҏ(gu)二、定义信号处理函敎ͼ(x)

 

  1. sigset(SIGALRM, u_alarm_handler);
  2. alarm(2);
  3. code = connect(socket_fd, (struct sockaddr*)&socket_st, sizeof(struct sockaddr_in));
  4. alarm(0);
  5. sigrelse(SIGALRM);

首先定义一个中断信号处理函数u_alarm_handlerQ用于超时后的报警处理,然后定义一?U的定时器,执行connectQ当pȝconnect成功Q则pȝ正常执行下去Q如果connect不成功阻塞在q里Q则过定义?U后Q系l会(x)产生一个信P触发执行u_alarm_handler函数Q?当执行完u_alarm_handler后,E序l从connect的下面一行执行下厅R?br />其中Q处理函数可以如下定义,也可以加入更多的错误处理?br />

  1. void u_alarm_handler()
  2. {
  3. }


鑫龙 2014-08-23 17:01 发表评论
]]>
惊群现象http://m.shnenglu.com/mysileng/archive/2014/08/07/207932.html鑫龙鑫龙Thu, 07 Aug 2014 06:21:00 GMThttp://m.shnenglu.com/mysileng/archive/2014/08/07/207932.htmlhttp://m.shnenglu.com/mysileng/comments/207932.htmlhttp://m.shnenglu.com/mysileng/archive/2014/08/07/207932.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/207932.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/207932.html-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
“据说”惊群问题已经是一个很古老的问题了,q且在大多数pȝ?a rel="nofollow">已经得到有效解决Q但Ҏ(gu)来说Q仍旧是一个比较新的概念,因此有必要记录一下?br />
什么是惊群

        举一个很单的例子Q当你往一鸽子中间扔一块食物,虽然最l只有一个鸽子抢到食物,但所有鸽子都?x)被惊动来争夺,没有抢到食物的鸽子只好回ȝl睡觉, {待下一块食物到来。这P每扔一块食物,都会(x)惊动所有的鸽子Q即为惊。对于操作系l来_(d)多个q程/U程在等待同一资源是,也会(x)产生cM的效果,其结 果就是每当资源可用,所有的q程/U程都来竞争资源Q造成的后果:(x)
1Q系l对用户q程/U程频繁的做无效的调度、上下文切换Q系l系能大打折扣?br />2Qؓ(f)了确保只有一个线E得到资源,用户必须对资源操作进行加锁保护,q一步加大了pȝ开销?br />
        最常见的例子就是对于socket描述W的accept操作Q当多个用户q程/U程监听在同一个端口上Ӟ׃实际只可能accept一ơ,因此׃(x)产生惊群现象Q当然前面已l说q了Q这个问题是一个古老的问题Q新的操作系l内核已l解决了q一问题?br />
linux内核解决惊群问题的方?/strong>

        对于一些已知的惊群问题Q内核开发者增加了一?#8220;互斥{待”选项。一个互斥等待的行ؓ(f)与睡眠基本类|主要的不同点在于Q?br />        1Q当一个等待队列入口有 WQ_FLAG_EXCLUSEVE 标志|位, 它被d到等待队列的N. 没有q个标志的入口项, 相反, d到开?
        2Q当 wake_up 被在一个等待队列上调用? 它在唤醒W一个有 WQ_FLAG_EXCLUSIVE 标志的进E后停止?br />        也就是说Q对于互斥等待的行ؓ(f)Q比如如对一个listen后的socket描述W,多线E阻塞acceptӞpȝ内核只会(x)唤醒所有正在等待此旉的队?的第一个,队列中的其他人则l箋{待下一ơ事件的发生Q这样就避免的多个线E同时监听同一个socket描述W时的惊问题?br />
Ҏ(gu)以上背景信息Q我们来比较一下常见的Server端设计方案?br />
Ҏ(gu)1Qlisten后,启动多个U程(q程)Q对此socketq行监听Q仅daccept方式不惊)?br />Ҏ(gu)2Q主U程负责监听Q通过U程池方式处理连接。(通常的方法)
Ҏ(gu)3Q主U程负责监听Q客L(fng)q接上来后由ȝE分配实际的端口Q客L(fng)Ҏ(gu)此端口重新连接,然后处理数据?br />
先考虑客户端单q接的情?/strong>Q?br />Ҏ(gu)1Q每当有新的q接到来Ӟpȝ内核?x)从队列中以FIFO的方式选择一个监听线E来服务此连接,因此可以充分发挥pȝ的系能ƈ且多U程负蝲均衡。对于单q接的场景,q种Ҏ(gu)无疑是非怼的。遗憄是,对于select、epollQ内核目前无法解x问题?a rel="nofollow">(nginx对于惊群问题的解x?
Ҏ(gu)2Q由于只有一个线E在监听Q其瞬时的ƈ发处理连接请求的能力必然不如多线E。同Ӟ需要对U程池做调度理Q必然涉及资源共享访问,相对于方案一来说理成本要增加不,代码复杂度提高,性能也有所下降?br />Ҏ(gu)3Q与Ҏ(gu)2有不类似的地方Q其优势是不需要做U程调度。缺Ҏ(gu)增加了主U程的负担,除了接收q接外还需要发送数据,而且需要两ơ连接,C孰劣Q有待测试?br />
再考虑客户端多q接的情况:(x)
对于数据传输cȝ应用Qؓ(f)了充分利用带宽,往往?x)开启多个连接来传输数据Q连接之间的数据有相互依赖性,因此Server端要惛_好的l护q种依赖性,把同一个客L(fng)的所有连接放在一个线E中处理是非常有必要的?br />A、同一客户端在一个线E中处理
Ҏ(gu)1Q如果没有更底层的解x案的话,Server则需要维护一个全局列表Q来记录当前q接h该由哪个U程处理。多U程需要同时竞争一个全局资源Q似乎有些不妙?br />Ҏ(gu)2Q主U程负责监听q分发,因此与单q接相比没有带来额外的性能开销。仅仅会(x)造成ȝE忙于更多的q接h?br />Ҏ(gu)3Q较单线E来_(d)ȝE工作量没有M增加Q由于多q接而造成的额外开销由实际工作线E分担,因此对于q种场景Q方?g是最佳选择?br />
B、同一客户端在不同U程中处?/strong>
Ҏ(gu)1Q同样需要竞争资源?br />Ҏ(gu)2Q没理由?br />Ҏ(gu)3Q不可能?br />
另外Q?br />
(《UNIX|络~程》第三版是在W?0?
诅RUNIX|络~程》第二版的第一hQ发C者在W?7?#8220;客户-服务器程序其它设计方?#8221;中的27.6?#8220;TCP预先z子进E服务器E序Qaccept无上锁保?#8221;中提C一U由子进E去竞争客户端连接的设计Ҏ(gu)Q用伪码描述如下:

服务器主q程:

listen_fd = socket(...);
bind(listen_fd, ...);
listen(listen_fd, ...);
pre_fork_children(...);
close(listen_fd);
wait_children_die(...);


服务器服务子q程:

while (1) {
conn_fd = accept(listen_fd, ...);
do_service(conn_fd, ...);
}


初识上述代码Q真有眼前一亮的感觉Q也正如作者所_(d)以上代码实很少见(反正我读此书之前是确实没见过Q。作者真是构思精巧,巧妙地绕q了常见的预先创?子进E的多进E服务器当主服务q程接收到新的连接必L办法这个连接传递给服务子进E的“陷阱”Q上qC码通过׃n的們֐套接字,由子q程d地去向内 ?#8220;索要”q接套接字,从而避免了用UNIX域套接字传递文件描q符?#8220;淫技”?br />
不过Q当接着往下读的时候,作者谈C“惊群” QThundering herd)问题。所谓的“惊群”是Q当很多q程都阻塞在acceptpȝ调用的时候,即只有一个新的连接达刎ͼ内核也会(x)唤醒所有阻塞在accept?的进E,q将l系l带来非常大?#8220;震颤”Q降低系l性能?br />
除了q个问题Qacceptq必L原子操作。ؓ(f)此,作者在接下来的27.7节讲qC加了互斥锁的版本Q?br />

while (1) {
lock(...);
conn_fd = accept(listen_fd, ...);
unlock(...);
do_service(conn_fd, ...);
}


原子操作的问题算是解决了Q那?#8220;惊群”呢?文中只是提到在Solarispȝ上当子进E数?5变成90后,CPU旉显著增加Qƈ且作者认是因 E过多,D内存互换。对“惊群”问题回答地十分含p。通过比较书中?7.2的第4列和W?列的内容Q我们可以肯?#8220;真凶”l对不是“内存Ҏ(gu)”?br />
“元凶”到底是谁Q?br />
仔细分析一下,加锁真的有助?#8220;惊群”问题么?不错Q确实在同一旉只有一个子q程在调用acceptQ其它子q程都阻塞在了lock语句Q但是,?acceptq回qunlock之后呢?unlock肯定是要唤醒d在这个锁上的q程的,不过谁都没有规定是唤醒一个还是唤醒多个。所以,潜在?#8220;??#8221;问题q是存在Q只不过换了个地方,换了个Ş式。而造成Solaris性能骤降?#8220;|魁R”很有可能是“惊群”问题?br />
崩溃了!q么说所有的锁都有可能生惊问题了Q?br />
g真的是这P所?span style="font-weight: bold">减少锁的使用很重要。特别是在竞争比较激烈的地方?br />
作者在27.9节所实现?#8220;传递文件描q符”版本的服务器有效地克服?#8220;惊群”问题Q在现实的服务器实现中,最常用的也是此节所提到的基?#8220;分配”形式?br />
?#8220;竞争”换成“分配”是避?#8220;惊群”问题的有效方法,但是也不要忽?#8220;分配”?#8220;均衡”问题Q不然后果可能更加严重哦Q?/div>


鑫龙 2014-08-07 14:21 发表评论
]]>linux后台开发必看书c?http://m.shnenglu.com/mysileng/archive/2014/07/25/207807.html鑫龙鑫龙Fri, 25 Jul 2014 12:29:00 GMThttp://m.shnenglu.com/mysileng/archive/2014/07/25/207807.htmlhttp://m.shnenglu.com/mysileng/comments/207807.htmlhttp://m.shnenglu.com/mysileng/archive/2014/07/25/207807.html#Feedback0http://m.shnenglu.com/mysileng/comments/commentRss/207807.htmlhttp://m.shnenglu.com/mysileng/services/trackbacks/207807.htmlE序设计c?/span>
《C++ PRIMER?br />《STL源码解析?/span>


pȝ~程c?/span>
《UNIX环境高~程》W.Richard StevensQ非常经典的书。虽然初学者就可以看,但是事实上它是《Unix Network Programing》的一本辅助资料。国内的译的《UNIX环境高~程》的水^不怎么P现在有媄印版Q直接读英文比读中文来得Ҏ(gu)?br />《Unix|络~程卷二》Unix|络~程L(fng)二卷没有涉及|络的东西,主要讲进E间通讯和PosixU程?/p>



|络~程c?/span>
《Unix|络~程》第一卯BSD Socket|络~程接口和另外一U网l编E接口的Q不q现在一般都用BSD SocketQ所以这本书只要看大U一半多可以了?br />《TCP/IP详解》一׃P卷一讲协议,卷二讲实玎ͼ卷三讲编E应用,也很l典的?br />《用TCP/IPq行|际互连》一׃P内容讲解十分_ֽ。卷一讲原理,卷二讲实玎ͼ卷三讲高U协议。感觉上q一套要比Stevens的那一套要好,pStevens也不得不承认它的W一卷非常经典。事实上Q第一卷即使你没有一点网l的知识Q看完以后也?x)对|络的来龙去脉了如指掌。第一卷中q有很多?fn)题也设计得l典和实用,因ؓ(f)作者本w就是一位教师,q且卷一是国外研I生的教材。习(fn)题ƈ没有{案Q留l读者思考,因ؓ(f)问题得答案可以让你成Z个中U的HackerQ这些问题的{案可以象Douglus索取Q不q只有他只给教师卷二我没有怎么看,卷三可以作ؓ(f)参考手册,其中C子也很经典?br />?!--StartFragment -->Linux 多线E服务端~程Q?muduo C++ |络库?


Linuxpȝ理c?/span>
《linuxpȝ理手册?br />《LINUX与UNIX SHELL~程指南?br />《Advanced Bash Scripting Guide?/p>


pȝ内核c?/span>
《Linux内核代码情景分析?br />《深入Linux内核源码?/p>


面向对象设计c?/span>
《设计模式?br />《敏捯Y件开发:(x)原则、模式与实践?br />《敏捷项目管理?/p>


内功修炼c?/strong>
《操作系l:(x)设计与实玎ͼW二版)?br />《操作系l概c?br />《数据结构与法-面向对象的C++设计模式?br />《编译原理》国防陈火旺
《离散数学及其应用?br />《计机l织与体pȝ?性能分析?br />《深入理解计机pȝ》【美】Randal E. Bryant David O'Hallaron著v



鑫龙 2014-07-25 20:29 发表评论
]]>
在java中用Runtime.exec()时要注意的问?/title><link>http://m.shnenglu.com/mysileng/archive/2014/04/08/206500.html</link><dc:creator>鑫龙</dc:creator><author>鑫龙</author><pubDate>Tue, 08 Apr 2014 07:20:00 GMT</pubDate><guid>http://m.shnenglu.com/mysileng/archive/2014/04/08/206500.html</guid><wfw:comment>http://m.shnenglu.com/mysileng/comments/206500.html</wfw:comment><comments>http://m.shnenglu.com/mysileng/archive/2014/04/08/206500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/mysileng/comments/commentRss/206500.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/mysileng/services/trackbacks/206500.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">E序如下Q?/p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">import java.util.*;</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">import java.io.*;</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">public class BadExecJavac</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">{</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">    public static void main(String args[])</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">    {</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">        try</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">        {           </p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">            Runtime rt = Runtime.getRuntime();</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">            Process proc = rt.exec("javac");</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">            int exitVal = proc.exitValue();</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">            System.out.println("Process exitValue: " + exitVal);</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">        } catch (Throwable t)</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">          {</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">            t.printStackTrace();</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">          }</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">    }</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">q行l果如下</p><span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">E:\classes\com\javaworld\jpitfalls\article2>java BadExecJavac<br />java.lang.IllegalThreadStateException: process has not exited        <br />at java.lang.Win32Process.exitValue(Native Method)        <br />at BadExecJavac.main(BadExecJavac.java:13)</span><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">q是因ؓ(f)当进E还没有l束的情况下Q调用exitValueҎ(gu)?x)抛出IllegalThreadStateException.当然了我们会(x)问ؓ(f)什吗这个方法不?x)等到进E结束在q回一个合理的|</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">在检查Processcȝ所有可用方法以后我们发现WairFor()是一个更合适的Ҏ(gu)。事实上waitFor也会(x)q回exit value。这意味着你不可以同时用exitvalue和waitforQ而是只能选择一个?/p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">当然了也有情况你要在waitfor之前用exitvalueҎ(gu)Q就是你不想因ؓ(f)外部E序永远无法完成而一直等待下厅R?/p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">因此Z避免q个陷阱Q我们要么捕获IllegalThreadStateException异常Q要么等待进E完成。我们相当然的以为可以用waitfor来等待程序的l束。代码如下:(x)</p><span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">import java.util.*;<br />import java.io.*;<br />public class BadExecJavac2{   <br /></span>   <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">public static void main(String args[])    {       <br /></span>      <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">try        {                        <br /></span>         <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">Runtime rt = Runtime.getRuntime();            <br /></span>         <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">Process proc = rt.exec("javac");           <br /></span>        <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;"> int exitVal = proc.waitFor();            <br /></span>         <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">System.out.println("Process exitValue: " + exitVal);        <br /></span>      <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">} catch (Throwable t)          {            <br /></span>         <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">t.printStackTrace();          <br /></span>      <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">}    <br /></span>   <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">}<br />}</span><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">q次在linux下面q回的结果是2,而在windows下面据说E序?x)挂P关于其原因我们可以在jdk文档中找到部分解释:(x)因ؓ(f)一些操作系lؓ(f)标准的输入输Z仅提供有限的~冲区,当不能正的信息写q输入流或者从输出中获取信息Ӟ׃(x)D子进E的dQ甚x锁。现在我们就Ҏ(gu)jdk文档来处理javacq程的输出,当你不带M参数q行javacӞ它会(x)打印Zpd的有用的提示信息。而这些会(x)被传送到stderr中。我们可以写E序在其q回前获取这些信息。下面的代码提供了一个^庸的解决Ҏ(gu)?/p><span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">import java.util.*;import java.io.*;<br />public class MediocreExecJavac{    <br /></span>   <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">public static void main(String args[])    {       <br /></span>      <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;"> try        {                        <br /></span>         <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">Runtime rt = Runtime.getRuntime();            <br /></span>         <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">Process proc = rt.exec("javac");           <br /></span>        <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;"> InputStream stderr = proc.getErrorStream();           <br /></span>        <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;"> InputStreamReader isr = new InputStreamReader(stderr);            <br /></span>         <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">BufferedReader br = new BufferedReader(isr);            <br /></span>         <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">String line = null;            <br /></span>         <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">System.out.println("<ERROR>");            <br /></span>         <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">while ( (line = br.readLine()) != null)                <br /></span>            <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">System.out.println(line);            <br /></span>         <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">System.out.println("</ERROR>");           <br /></span>         <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">int exitVal = proc.waitFor();            <br /></span>         <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">System.out.println("Process exitValue: " + exitVal);        <br /></span>      <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">} catch (Throwable t)          {           <br /></span>         <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;"> t.printStackTrace();          <br /></span>      <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">}    <br /></span>   <span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">}<br />}</span><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">q次E序可以正确的输Z提示信息Q但是我们应该注意到其返回代码是2Q我们知道Q何非0的返回代码都表示E序不正常。所以我们需要进一步的查找原因。对于win32而言是file not foundQ很明显javac期望我们提供~译的文件。所以对于永q挂L(fng)问题Q如果你q行的程序会(x)有输出或者要求输出入Ӟ你需要处理输出和输入。我在linux下面q行的结果是正确的。前面说了在win32下面2代表是文件没有找刎ͼ而在q种情况下表明是dir.exe没有扑ֈQ(因ؓ(f)Ҏ(gu)没有这个文Ӟ他们都被装到common.com Qwin95Q或者cmd.exe中了?/p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">下面我们列出一个正的处理Process的输入输出流的方法。需要用一个线E类?/p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">import java.util.*;<br />import java.io.*;<br />class StreamGobbler extends Thread{    <br />   InputStream is;    <br />   String type;        <br />   StreamGobbler(InputStream is, String type)    {       <br />       this.is = is;       <br />       this.type = type;    <br />   }        <br /><br />   public void run()    {        <br />      try        {           <br />          InputStreamReader isr = new InputStreamReader(is);            <br />          BufferedReader br = new BufferedReader(isr);           <br />          String line=null;            <br />   <span id="nhdv9hd" class="Apple-tab-span" style="white-space:pre"> </span>  while ( (line = br.readLine()) != null)                <br />   <span id="lr79x9f" class="Apple-tab-span" style="white-space:pre"> </span>  System.out.println(type + ">" + line);                <br />      } catch (IOException ioe)             {                <br />   <span id="nv9zbzz" class="Apple-tab-span" style="white-space:pre"> </span>   ioe.printStackTrace();               <br />      }    <br />   }<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">用于专门的处理输入输出?/p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">public class GoodWindowsExec{    <br />   <span id="t9btpfn" class="Apple-tab-span" style="white-space:pre"> </span>public static void main(String args[])    {        <br />   <span id="vn7p7db" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="9vh7lbj" class="Apple-tab-span" style="white-space:pre"> </span>if (args.length < 1)        {            <br />   <span id="v979jrn" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="bzbfjjf" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="dlnr9zz" class="Apple-tab-span" style="white-space:pre"> </span>System.out.println("USAGE: java GoodWindowsExec <cmd>");            <br />   <span id="b77r7fl" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="7frlftr" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="7799zxv" class="Apple-tab-span" style="white-space:pre"> </span>System.exit(1);        <br />   <span id="99bt9px" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="p9xp7dj" class="Apple-tab-span" style="white-space:pre"> </span>}                <br />   <span id="rjlf9tb" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="9h7999h" class="Apple-tab-span" style="white-space:pre"> </span>try        {                        <br />   <span id="7v7hllj" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="hz7tnl7" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="d79r9vt" class="Apple-tab-span" style="white-space:pre"> </span>String osName = System.getProperty("os.name" );            <br />   <span id="77bthl9" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="vx799fb" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="7lp9hhv" class="Apple-tab-span" style="white-space:pre"> </span>String[] cmd = new String[3];           <br />   <span id="p7b7v9r" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="b99jlh9" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="nd7h999" class="Apple-tab-span" style="white-space:pre"> </span>if( osName.equals( "Windows NT" ) )            {                <br />   <span id="xbp9l9f" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="hxrn7t7" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="ddfhh9v" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="brv979z" class="Apple-tab-span" style="white-space:pre"> </span>cmd[0] = "cmd.exe" ;                <br />   <span id="ffx799r" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="7j9x9lj" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="pfhzdr7" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="7lzd7jh" class="Apple-tab-span" style="white-space:pre"> </span>cmd[1] = "/C" ;                <br />   <span id="7lvpr7d" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="z9hzdbb" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="7zblxnj" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="7fzr7rr" class="Apple-tab-span" style="white-space:pre"> </span>cmd[2] = args[0];            <br />   <span id="9nxbdzp" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="fnx99p9" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="9htnr79" class="Apple-tab-span" style="white-space:pre"> </span>}            else if( osName.equals( "Windows 95" ) )            {                <br />   <span id="fdx9bjh" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="7x9r9x9" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="nl7ztb9" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="9ldp7dd" class="Apple-tab-span" style="white-space:pre"> </span>cmd[0] = "command.com" ;                <br />   <span id="971t9pf" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="vvnhb9p" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="zhzd17v" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="x9xp9ff" class="Apple-tab-span" style="white-space:pre"> </span>cmd[1] = "/C" ;                <br />   <span id="r79fhz9" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="99xzbrt" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="7799trd" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="jzv77d9" class="Apple-tab-span" style="white-space:pre"> </span>cmd[2] = args[0];            }                        <br />   <span id="xf9v79b" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="l99fh9b" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="trvfn7z" class="Apple-tab-span" style="white-space:pre"> </span>Runtime rt = Runtime.getRuntime();            <br />   <span id="7d7f99n" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="ppjlvvt" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="rl7t7xn" class="Apple-tab-span" style="white-space:pre"> </span>System.out.println("Execing " + cmd[0] + " " + cmd[1] + " " + cmd[2]);            <br />   <span id="9pzb9rn" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="9zr79xv" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="7nx7zhp" class="Apple-tab-span" style="white-space:pre"> </span>Process proc = rt.exec(cmd);            // any error message?            <br />   <span id="7d99p9z" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="t99zp9z" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="ppz9f79" class="Apple-tab-span" style="white-space:pre"> </span>StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR");  // any output?            <br />   <span id="d77ddbz" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="lj77vb7" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="lbnp79r" class="Apple-tab-span" style="white-space:pre"> </span>StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT");                            // kick them off            <br />   <span id="dd7xhnl" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="77nh9f9" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="xv97979" class="Apple-tab-span" style="white-space:pre"> </span>errorGobbler.start();            <br />   <span id="9hbv79l" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="9n999hn" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="rp79t9v" class="Apple-tab-span" style="white-space:pre"> </span>outputGobbler.start();                                                // any error???            <br />   <span id="z999hfr" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="ll7tn79" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="7pz9v9n" class="Apple-tab-span" style="white-space:pre"> </span>int exitVal = proc.waitFor();            <br />   <span id="9t99lth" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="77bj9tj" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="tt977hx" class="Apple-tab-span" style="white-space:pre"> </span>System.out.println("ExitValue: " + exitVal);                <br />   <span id="xf9999h" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="pplp7b7" class="Apple-tab-span" style="white-space:pre"> </span>} catch (Throwable t)          {            <br />   <span id="7nfthv9" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="rrvp7nb" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="r79v9h9" class="Apple-tab-span" style="white-space:pre"> </span>t.printStackTrace();          <br />   <span id="vvphpdd" class="Apple-tab-span" style="white-space:pre"> </span>   <span id="7hjb97x" class="Apple-tab-span" style="white-space:pre"> </span>}    <br />   <span id="7p9tdv9" class="Apple-tab-span" style="white-space:pre"> </span>}<br />}</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">如果q行如下命o(h)上面的代码会(x)调用wordE序</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">>java GoodWindowExec “abc.doc”</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">也就是说文gcd如果window能够识别它就?x)调用对应的E序处理?/p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;">StreamGlobbler的最重要作用是他?x)清I所有的传递给他的inputstreamQ这样不?x)造成Processd或者死锁?/p><p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;"></p><img src ="http://m.shnenglu.com/mysileng/aggbug/206500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/mysileng/" target="_blank">鑫龙</a> 2014-04-08 15:20 <a href="http://m.shnenglu.com/mysileng/archive/2014/04/08/206500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.oahk.cn" target="_blank">һþöAV</a>| <a href="http://www.530taiji.cn" target="_blank">ƷþþþĻһ</a>| <a href="http://www.k1822.cn" target="_blank">þùɫAVѿ</a>| <a href="http://www.bltt.net.cn" target="_blank">þþƷˬӰ</a>| <a href="http://www.dzeuegg.cn" target="_blank">91ƷɫۺϾþ</a>| <a href="http://www.yunva.cn" target="_blank">þü¶</a>| <a href="http://www.jiletu.cn" target="_blank">þˬˬˬ</a>| <a href="http://www.sehinix.cn" target="_blank">Ʒٸavþ</a>| <a href="http://www.00225858.cn" target="_blank">ƷһþþƷ </a>| <a href="http://www.4o2ptp.cn" target="_blank">ɫav˾þô߽ӰԺ</a>| <a href="http://www.9503miwang.cn" target="_blank">þۺϸϾþù</a>| <a href="http://www.rz2.com.cn" target="_blank">ҹҹþ</a>| <a href="http://www.androidfans.com.cn" target="_blank">þۺɫHEZYO</a>| <a href="http://www.zaixianp29.cn" target="_blank">Ʒһþù</a>| <a href="http://www.ljvs.cn" target="_blank">˾ҹվھƷþþþþþþ </a>| <a href="http://www.ptmei.cn" target="_blank">ձWVһһþ㽶</a>| <a href="http://www.5656936.cn" target="_blank">þw5www</a>| <a href="http://www.weiyan2143.cn" target="_blank">ۺϾþҹAV </a>| <a href="http://www.ads9.cn" target="_blank">һƷþð͹</a>| <a href="http://www.ppmm163.cn" target="_blank">һһþAþۺϾƷ</a>| <a href="http://www.zhe38.cn" target="_blank">999Ʒþþþþ</a>| <a href="http://www.lsjtht.cn" target="_blank">ŷƷþþþþþο</a>| <a href="http://www.duteng888.com.cn" target="_blank">þù޾ƷӰԺ</a>| <a href="http://www.xiazb.cn" target="_blank">ھƷžžþþþƷ</a>| <a href="http://www.congress-gsc.cn" target="_blank">˾þۺӰԺ</a>| <a href="http://www.zyxsjjz.cn" target="_blank">ݺݾþۺ˲</a>| <a href="http://www.lueyi.com.cn" target="_blank">99þþƷѾƷһ</a>| <a href="http://www.safaen.cn" target="_blank">þþþĻɫ </a>| <a href="http://www.osgh.cn" target="_blank">츾޾þĻ</a>| <a href="http://www.baolaiqi.com.cn" target="_blank">þþþùպƷվ</a>| <a href="http://www.25552l.cn" target="_blank">ŷ777Ʒþþþ</a>| <a href="http://www.bao00long.cn" target="_blank">þþƷĻ</a>| <a href="http://www.shecb2b.com.cn" target="_blank">þҹҹݺ</a>| <a href="http://www.tjpengzhi.cn" target="_blank">˼˼þ99ѾƷ6</a>| <a href="http://www.rocchetta.com.cn" target="_blank">Ʒxxxxˮ޹Ʒþһ </a>| <a href="http://www.tasd.org.cn" target="_blank">þþƷavպ</a>| <a href="http://www.weryuadfsd.cn" target="_blank">97㽶þҹɫƷ</a>| <a href="http://www.djmb.net.cn" target="_blank">þþþ</a>| <a href="http://www.gbestech.cn" target="_blank">һaɫƬþٸһHƬѷ </a>| <a href="http://www.texlerder.com.cn" target="_blank">Ʒ޾þþþþ</a>| <a href="http://www.21gou.cn" target="_blank">ũ帾ŮëƬƷþ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>