<div id="article_details" class="details">
<div class="article_title">
<span class="ico ico_type_Original"></span>
<h1>
<span class="link_title"><a href="/dlutbrucezhang/article/details/8817587">
Linux中的可重入函数和不可重入函数
</a></span>
</h1>
</div>
<div class="article_manage clearfix">
<div class="article_l">
<span class="link_categories">
标签:
<a href="http://www.csdn.net/tag/Linux" target="_blank" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">Linux</a><a href="http://www.csdn.net/tag/%e5%a4%9a%e7%ba%bf%e7%a8%8b" target="_blank" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">多线程</a><a href="http://www.csdn.net/tag/%e5%a4%84%e7%90%86%e5%99%a8" target="_blank" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">处理器</a><a href="http://www.csdn.net/tag/%e8%a1%8c%e4%b8%9a%e6%95%b0%e6%8d%ae" target="_blank" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">行业数据</a><a href="http://www.csdn.net/tag/%e5%85%a8%e5%b1%80%e5%8f%98%e9%87%8f" target="_blank" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">全局变量</a>
</span>
</div>
<div class="article_r">
<span class="link_postdate">2013-04-18 10:25</span>
<span class="link_view" title="阅读次数">3484人阅读</span>
<span class="link_comments" title="评论次数"> <a href="#comments" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(0)</span>
<span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" οnclick="javascript:collectArticle('Linux中的可重入函数和不可重入函数','8817587');return false;" title="收藏">收藏</a></span>
<span class="link_report"> <a href="#report" οnclick="javascript:report(8817587,2);return false;" title="举报">举报</a></span>
</div>
</div>
<div class="embody" style="display:none" id="embody">
<span class="embody_t">本文章已收录于:</span>
<div class="embody_c" id="lib" value="{"err":0,"msg":"ok","data":[]}"></div>
</div>
<style type="text/css">
.embody{
padding:10px 10px 10px;
margin:0 -20px;
border-bottom:solid 1px #ededed;
}
.embody_b{
margin:0 ;
padding:10px 0;
}
.embody .embody_t,.embody .embody_c{
display: inline-block;
margin-right:10px;
}
.embody_t{
font-size: 12px;
color:#999;
}
.embody_c{
font-size: 12px;
}
.embody_c img,.embody_c em{
display: inline-block;
vertical-align: middle;
}
.embody_c img{
width:30px;
height:30px;
}
.embody_c em{
margin: 0 20px 0 10px;
color:#333;
font-style: normal;
}
</style>
<script type="text/javascript">
$(function () {
try
{
var lib = eval("("+$("#lib").attr("value")+")");
var html = "";
if (lib.err == 0) {
$.each(lib.data, function (i) {
var obj = lib.data[i];
//html += '<img src="' + obj.logo + '"/>' + obj.name + " ";
html += ' <a href="' + obj.url + '" target="_blank">';
html += ' <img src="' + obj.logo + '">';
html += ' <em><b>' + obj.name + '</b></em>';
html += ' </a>';
});
if (html != "") {
setTimeout(function () {
$("#lib").html(html);
$("#embody").show();
}, 100);
}
}
} catch (err)
{ }
});
</script>
<div class="category clearfix">
<div class="category_l">
<img src="http://static.blog.csdn.net/images/category_icon.jpg">
<span>分类:</span>
</div>
<div class="category_r">
<label οnclick="GetCategoryArticles('1389271','DLUTBruceZhang','top','8817587');">
<span οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">《UNIX环境高级编程》<em>(55)</em></span>
<img class="arrow-down" src="http://static.blog.csdn.net/images/arrow_triangle _down.jpg" style="display: inline;">
<img class="arrow-up" src="http://static.blog.csdn.net/images/arrow_triangle_up.jpg" style="display: none;">
<div class="subItem" style="display: none;">
<div class="subItem_t"><a href="http://blog.csdn.net/DLUTBruceZhang/article/category/1389271" target="_blank">作者同类文章</a><i class="J_close">X</i></div>
<ul class="subItem_l" id="top_1389271"><li class="tracking-ad" data-mod="popu_140"><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/12015141" id="top_aritcle_12015141undefined25703758328020454" target="_blank" title="linux 同步与异步--阻塞与非阻塞型I/O">linux 同步与异步--阻塞与非阻塞型I/O</a></li> <li class="tracking-ad" data-mod="popu_140"><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8914772" id="top_aritcle_8914772undefined9105543782133392" target="_blank" title="使用system函数时应该忽略两个信号">使用system函数时应该忽略两个信号</a></li> <li class="tracking-ad" data-mod="popu_140"><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8914250" id="top_aritcle_8914250undefined7434481529730461" target="_blank" title="信号实现父子进程之间的同步--sigsuspend的作用">信号实现父子进程之间的同步--sigsuspend的作用</a></li> <li class="tracking-ad" data-mod="popu_140"><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8883471" id="top_aritcle_8883471undefined8961601778028432" target="_blank" title="进程控制">进程控制</a></li> <li class="tracking-ad" data-mod="popu_140"><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8883339" id="top_aritcle_8883339undefined040913594976103695" target="_blank" title="调用 fork() 两次以避免僵死进程">调用 fork() 两次以避免僵死进程</a></li> <li style="padding-left: 300px;"><a href="http://blog.csdn.net/DLUTBruceZhang/article/category/1389271" target="_blank">更多</a></li></ul>
</div>
</label>
</div>
</div>
<script type="text/javascript" src="http://static.blog.csdn.net/scripts/category.js"></script>
<div class="bog_copyright">
<p class="copyright_p">版权声明:本文为博主原创文章,未经博主允许不得转载。</p>
</div>
<div id="article_content" class="article_content">
<p><strong><span style="font-size:24px; background-color:rgb(255,255,0)">可重入函数</span></strong></p>
<p></p>
<div style="margin:0px; padding:0px; font-family:Verdana,Arial,Helvetica,sans-serif; line-height:19px; background-color:rgb(254,254,242)">
<span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>可重入函数(即可以被中断的函数)可以被一个以上的任务调用,而不担心数据破坏。可重入函数在任何时候都可以被中断,而一段时间之后又可以恢复运行,而相应的数据不会破坏或者丢失。</strong></span></span></div>
<div style="margin:0px; padding:0px; font-family:Verdana,Arial,Helvetica,sans-serif; line-height:19px; background-color:rgb(254,254,242)">
<span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>可重入函数使用的变量有两种情况:</strong></span></span></div>
<div style="margin:0px; padding:0px; font-family:Verdana,Arial,Helvetica,sans-serif; line-height:19px; background-color:rgb(254,254,242)">
<span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>1.使用局部变量,变量保存在CPU寄存器中或者堆栈中;</strong></span></span></div>
<div style="margin:0px; padding:0px; font-family:Verdana,Arial,Helvetica,sans-serif; line-height:19px; background-color:rgb(254,254,242)">
<span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>2.使用全局变量,但是这时候要注意保护全局变量(防止任务中断后被其它任务改变变量)。</strong></span></span></div>
<div style="margin:0px; padding:0px; font-family:Verdana,Arial,Helvetica,sans-serif; line-height:19px; background-color:rgb(254,254,242)">
<div class="cnblogs_Highlighter" style="margin:0px; padding:0px">
<div style="margin:0px; padding:0px">
<div id="highlighter_642385" class="syntaxhighlighter cpp" style="padding:0px; width:1066.78125px; margin:1em 0px!important; position:relative!important; overflow:auto!important; background-color:rgb(255,255,255)!important">
<div class="toolbar" style="margin:0px!important; padding:0px!important; border:none!important; bottom:auto!important; float:none!important; height:11px!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:absolute!important; right:1px!important; top:1px!important; vertical-align:baseline!important; width:11px!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; z-index:10!important; color:rgb(255,255,255)!important">
<span style="margin:0px; padding:0px; line-height:1.5"><a href="http://www.cnblogs.com/sinaxyz/archive/2012/09/10/2679440.html#" class="toolbar_item command_help help" style="color:rgb(7,93,179); margin:0px!important; padding:1px 0px 0px!important; text-decoration:none!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:center!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important; display:block!important"><span style="font-size:18px"><strong>?</strong></span></a></span></div>
<table border="0" cellpadding="0" cellspacing="0" style="border:1px solid rgb(192,192,192); width:1066px; border-collapse:collapse; margin:0px!important; padding:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">
<tbody style="margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<tr style="margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<td class="gutter" style="padding:3px; border:1px solid rgb(192,192,192); border-collapse:collapse; margin:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:rgb(175,175,175)!important; word-break:normal!important">
<div class="line number1 index0 alt2" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; background-color:rgb(248,248,248)!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>1</strong></span></div>
<div class="line number2 index1 alt1" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>2</strong></span></div>
<div class="line number3 index2 alt2" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; background-color:rgb(248,248,248)!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>3</strong></span></div>
<div class="line number4 index3 alt1" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>4</strong></span></div>
<div class="line number5 index4 alt2" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; background-color:rgb(248,248,248)!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>5</strong></span></div>
</td>
<td class="code" style="padding:3px; border:1px solid rgb(192,192,192); width:1038px; border-collapse:collapse; margin:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; word-break:normal!important">
<div class="container" style="margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:relative!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<div class="line number1 index0 alt2" style="margin:0px!important; padding:0px 1em!important; background-color:rgb(248,248,248)!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong><code class="cpp keyword bold" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:rgb(0,0,255)!important">void</code> <code class="cpp functions bold" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:rgb(255,20,147)!important">strcpy</code><code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">(*dest,*src)</code></strong></span></div>
<div class="line number2 index1 alt1" style="margin:0px!important; padding:0px 1em!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"><span style="font-size:18px"><strong>{</strong></span></code></div>
<div class="line number3 index2 alt2" style="margin:0px!important; padding:0px 1em!important; background-color:rgb(248,248,248)!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong><code class="cpp spaces" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"> </code><code class="cpp keyword bold" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:rgb(0,0,255)!important">while</code><code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">(*
dest++ = *src ++){;}</code></strong></span></div>
<div class="line number4 index3 alt1" style="margin:0px!important; padding:0px 1em!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong><code class="cpp spaces" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"> </code><code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">*dest
= NUL;</code></strong></span></div>
<div class="line number5 index4 alt2" style="margin:0px!important; padding:0px 1em!important; background-color:rgb(248,248,248)!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"><span style="font-size:18px"><strong>}</strong></span></code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div style="margin:0px; padding:0px">
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>分析:上面的函数用于字符串复制,而参数是存放在堆栈中的,故而改函数可以被多任务调用,而不必担心各个任务调用期间会互相破坏对方的指针。</strong></span></span></div>
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong> </strong></span></span></div>
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>基本上下面的函数都是不可重入的:</strong></span></span></div>
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong> 1.函数内使用了静态的数据。</strong></span></span></div>
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong> 2.函数内使用了malloc()或者free()函数的。</strong></span></span></div>
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong> 3.函数内调用了标准的I/O函数的。</strong></span></span></div>
<div style="margin:0px; padding:0px">
<div class="cnblogs_Highlighter" style="margin:0px; padding:0px">
<div style="margin:0px; padding:0px">
<div id="highlighter_763190" class="syntaxhighlighter cpp" style="padding:0px; width:1066.78125px; margin:1em 0px!important; position:relative!important; overflow:auto!important; background-color:rgb(255,255,255)!important">
<div class="toolbar" style="margin:0px!important; padding:0px!important; border:none!important; bottom:auto!important; float:none!important; height:11px!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:absolute!important; right:1px!important; top:1px!important; vertical-align:baseline!important; width:11px!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; z-index:10!important; color:rgb(255,255,255)!important">
<span style="margin:0px; padding:0px; line-height:1.5"><a href="http://www.cnblogs.com/sinaxyz/archive/2012/09/10/2679440.html#" class="toolbar_item command_help help" style="color:rgb(7,93,179); margin:0px!important; padding:1px 0px 0px!important; text-decoration:none!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:center!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important; display:block!important"><span style="font-size:18px"><strong>?</strong></span></a></span></div>
<table border="0" cellpadding="0" cellspacing="0" style="border:1px solid rgb(192,192,192); width:1066px; border-collapse:collapse; margin:0px!important; padding:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">
<tbody style="margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<tr style="margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<td class="gutter" style="padding:3px; border:1px solid rgb(192,192,192); border-collapse:collapse; margin:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:rgb(175,175,175)!important; word-break:normal!important">
<div class="line number1 index0 alt2" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; background-color:rgb(248,248,248)!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>1</strong></span></div>
<div class="line number2 index1 alt1" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>2</strong></span></div>
<div class="line number3 index2 alt2" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; background-color:rgb(248,248,248)!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>3</strong></span></div>
<div class="line number4 index3 alt1" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>4</strong></span></div>
<div class="line number5 index4 alt2" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; background-color:rgb(248,248,248)!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>5</strong></span></div>
<div class="line number6 index5 alt1" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>6</strong></span></div>
<div class="line number7 index6 alt2" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; background-color:rgb(248,248,248)!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>7</strong></span></div>
</td>
<td class="code" style="padding:3px; border:1px solid rgb(192,192,192); width:1038px; border-collapse:collapse; margin:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; word-break:normal!important">
<div class="container" style="margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:relative!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<div class="line number1 index0 alt2" style="margin:0px!important; padding:0px 1em!important; background-color:rgb(248,248,248)!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong><code class="cpp color1 bold" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:gray!important">int</code> <code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">temp;</code></strong></span></div>
<div class="line number2 index1 alt1" style="margin:0px!important; padding:0px 1em!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong><code class="cpp spaces" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"> </code><code class="cpp keyword bold" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:rgb(0,0,255)!important">void</code> <code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">swap(</code><code class="cpp color1 bold" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:gray!important">int</code> <code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">*ex1,</code><code class="cpp color1 bold" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:gray!important">int</code> <code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">*ex2)</code></strong></span></div>
<div class="line number3 index2 alt2" style="margin:0px!important; padding:0px 1em!important; background-color:rgb(248,248,248)!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"><span style="font-size:18px"><strong>{</strong></span></code></div>
<div class="line number4 index3 alt1" style="margin:0px!important; padding:0px 1em!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong><code class="cpp spaces" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"> </code><code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">temp
= *ex1; </code><code class="cpp comments" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:rgb(0,130,0)!important">//(1)</code></strong></span></div>
<div class="line number5 index4 alt2" style="margin:0px!important; padding:0px 1em!important; background-color:rgb(248,248,248)!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong><code class="cpp spaces" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"> </code><code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">*ex1
= *ex2;</code></strong></span></div>
<div class="line number6 index5 alt1" style="margin:0px!important; padding:0px 1em!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong><code class="cpp spaces" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"> </code><code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">*ex2
= temp;</code></strong></span></div>
<div class="line number7 index6 alt2" style="margin:0px!important; padding:0px 1em!important; background-color:rgb(248,248,248)!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"><span style="font-size:18px"><strong>}</strong></span></code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>分析:该函数中的全局变量temp是的函数变成了一个不可重入的函数,因为在多任务系统中,假如在任务1中调用swap函数,而程序执行到(1)处时被中断,进而执行其它的任务2,而刚好任务2也调用了swap函数,则temp里存的值则会被任务2改变。从而回到任务1被中断处继续执行的时候,temp里存的值已经不再是原来存的temp值了,进而产生了错误。</strong></span></span></div>
<div style="margin:0px; padding:0px"><span style="font-size:18px"><strong> </strong></span></div>
<div style="margin:0px; padding:0px"><span style="font-size:18px"><strong>常用的可重入函数的方法有:</strong></span></div>
<div style="margin:0px; padding:0px"><span style="font-size:18px"><strong>1.不要使用全局变量,防止别的代码覆盖这些变量的值。</strong></span></div>
<div style="margin:0px; padding:0px">
<div style="margin:0px; padding:0px">
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>2.调用这类函数之前先关掉中断,调用完之后马上打开中断。防止函数执行期间被中断进入别的任务执行。</strong></span></span></div>
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>3.使用信号量(互斥条件)。</strong></span></span></div>
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="margin:0px; padding:0px"><span style="font-size:18px"><strong>总之:要保证中断是安全的</strong></span></span></span></div>
</div>
</div>
</div>
</div>
</div>
<br>
<p></p>
<p><strong><span style="font-size:24px; background-color:rgb(255,255,0)">不可重入函数</span></strong></p>
<p></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>在多任务系统下,中断可能在任务执行的任何时间发生;如果一个函数的执行期间被中断后,到重新恢复到断点进行执行的过程中,函数所依赖的环境没有发生改变,那么这个函数就是可重入的,否则就<span style="word-wrap:break-word; background-color:rgb(160,255,255)">不可重入</span>。</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>在中断前后不都要保存和恢复上下文吗,怎么会出现函数所依赖的环境发生改变了呢?</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>我们知道中断时确实保存一些上下文,但是仅限于返回地址,cpu寄存器等之类的少量上下文,而函数内部使用的诸如全局或静态变量,buffer等并不在保护之列,所以如果这些值在函数被中断期间发生了改变,那么当函数回到断点继续执行时,其结果就不可预料了。</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>满足下面条件之一的多数是<span style="word-wrap:break-word; background-color:rgb(160,255,255)">不可重入</span>函数:</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>(1)使用了静态<a href="http://lib.csdn.net/base/31" class="replace_word" title="算法与数据结构知识库" target="_blank" style="color:#df3434; font-weight:bold;">数据结构</a>;</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>(2)调用了malloc或free;</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>(3)调用了标准I/O函数;</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>(4)进行了</strong></span><strong style="font-size:18px; text-indent:2em"><span style="word-wrap:break-word; background-color:rgb(255,255,102)">浮点</span>运算.</strong></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong> </strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>malloc/free是<span style="word-wrap:break-word; background-color:rgb(160,255,255)">不可重入</span>的,它们使用了全局变量来指向空闲区;标准I/O库的很多实现都使用了全局数据结构; 许多的处理器/编译器中,<span style="word-wrap:break-word; background-color:rgb(255,255,102)">浮点</span>一般都是<span style="word-wrap:break-word; background-color:rgb(160,255,255)">不可重入</span>的
(<span style="word-wrap:break-word; background-color:rgb(255,255,102)">浮点</span>运算大多使用协处理器或者软件模拟来实现)。</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong> </strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>在信号处理程序及多线程编程时,要特别注意。</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>考虑这种情况:</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>1) 信号处理程序A内外都调用了同一个<span style="word-wrap:break-word; background-color:rgb(160,255,255)">不可重入</span>函数B;B在执行期间被信号打断,进入A (A中调用了B),完事之后返回B被中断点继续执行,这时B函数的环境可能改变,其结果就不可预料了。</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>2) 多线程共享进程内部的资源,如果两个线程A,B调用同一个<span style="word-wrap:break-word; background-color:rgb(160,255,255)">不可重入</span>函数F,A线程进入F后,线程调度,切换到B,B也执行了F,那么当再次切换到线程A时,其调用F的结果也是不可预料的。</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>在信号处理程序中即使调用可重入函数也有问题要注意。作为一个通用的规则,当在信号处理程序中调用可重</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>入函数时,应当在其前保存errno,并在其后恢复errno。(要了解经常被捕捉到的信号是SIGCHLD,其信号处理程序通常要调用一种wait函数,而各种wait函数都能改变errno。)</strong></span></p>
<br>
</div>
<!-- Baidu Button BEGIN -->
<div class="bdsharebuttonbox tracking-ad bdshare-button-style0-16" style="float: right;" data-mod="popu_172" data-bd-bind="1476321039367">
<a href="#" class="bds_more" data-cmd="more" style="background-position:0 0 !important; background-image: url(http://bdimg.share.baidu.com/static/api/img/share/icons_0_16.png?v=d754dcc0.png) !important"></a>
<a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间" style="background-position:0 -52px !important"></a>
<a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博" style="background-position:0 -104px !important"></a>
<a href="#" class="bds_tqq" data-cmd="tqq" title="分享到腾讯微博" style="background-position:0 -260px !important"></a>
<a href="#" class="bds_renren" data-cmd="renren" title="分享到人人网" style="background-position:0 -208px !important"></a>
<a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信" style="background-position:0 -1612px !important"></a>
</div>
<script>window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "1", "bdMiniList": false, "bdPic": "", "bdStyle": "0", "bdSize": "16" }, "share": {} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];</script>
<!-- Baidu Button END -->
<link rel="stylesheet" href="http://static.blog.csdn.net/css/blog_detail.css">
<!--172.16.140.11-->
<!-- Baidu Button BEGIN -->
<script type="text/javascript" id="bdshare_js" data="type=tools&uid=1536434" src="http://bdimg.share.baidu.com/static/js/bds_s_v2.js?cdnversion=410090"></script>
<script type="text/javascript">
document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
</script>
<!-- Baidu Button END -->
<div id="digg" articleid="8817587">
<dl id="btnDigg" class="digg digg_enable" οnclick="btndigga();">
<dt>顶</dt>
<dd>1</dd>
</dl>
<dl id="btnBury" class="digg digg_enable" οnclick="btnburya();">
<dt>踩</dt>
<dd>0</dd>
</dl>
</div>
<div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);"> </a> </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);"> </a></div>
<script type="text/javascript">
function btndigga() {
$(".tracking-ad[data-mod='popu_222'] a").click();
}
function btnburya() {
$(".tracking-ad[data-mod='popu_223'] a").click();
}
</script>
<ul class="article_next_prev">
<li class="prev_article"><span οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian']);location.href='/dlutbrucezhang/article/details/8815506';">上一篇</span><a href="/dlutbrucezhang/article/details/8815506" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian'])">linux系统调用和库函数调用的区别</a></li>
<li class="next_article"><span οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_xiayipian']);location.href='/dlutbrucezhang/article/details/8819698';">下一篇</span><a href="/dlutbrucezhang/article/details/8819698" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_xiayipian'])">linux c 之sigsuspend 进程阻塞</a></li>
</ul>
<div style="clear:both; height:10px;"></div>
<div class="similar_article" style="">
<h4>我的同类文章</h4>
<div class="similar_c" style="margin:20px 0px 0px 0px">
<div class="similar_c_t">
<label class="similar_cur">
<span style="cursor:pointer" οnclick="GetCategoryArticles('1389271','DLUTBruceZhang','foot','8817587');">《UNIX环境高级编程》<em>(55)</em></span>
</label>
</div>
<div class="similar_wrap tracking-ad" data-mod="popu_141" style="max-height:195px;">
<a href="http://blog.csdn.net" style="display:none">http://blog.csdn.net</a>
<ul class="similar_list fl"><li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/12015141" id="foot_aritcle_12015141undefined6308514044622291" target="_blank" title="linux 同步与异步--阻塞与非阻塞型I/O">linux 同步与异步--阻塞与非阻塞型I/O</a><span>2013-09-25</span><label><i>阅读</i><b>1445</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8914250" id="foot_aritcle_8914250undefined10723850652524058" target="_blank" title="信号实现父子进程之间的同步--sigsuspend的作用">信号实现父子进程之间的同步--sigsuspend的作用</a><span>2013-05-11</span><label><i>阅读</i><b>3673</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8883339" id="foot_aritcle_8883339undefined46357555790109894" target="_blank" title="调用 fork() 两次以避免僵死进程">调用 fork() 两次以避免僵死进程</a><span>2013-05-04</span><label><i>阅读</i><b>4371</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8878630" id="foot_aritcle_8878630undefined8902568039123433" target="_blank" title="Linux下互斥量与条件变量详细解析">Linux下互斥量与条件变量详细解析</a><span>2013-05-03</span><label><i>阅读</i><b>3841</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8877055" id="foot_aritcle_8877055undefined15226653829029035" target="_blank" title="用C语言得到Linux主机的IP地址">用C语言得到Linux主机的IP地址</a><span>2013-05-02</span><label><i>阅读</i><b>1526</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8872581" id="foot_aritcle_8872581undefined9455712280638049" target="_blank" title="Linux下基于socket多线程并发通信的实现">Linux下基于socket多线程并发通信的实现</a><span>2013-05-01</span><label><i>阅读</i><b>2343</b></label></li> </ul>
<ul class="similar_list fr"><li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8914772" id="foot_aritcle_8914772undefined9400255583397015" target="_blank" title="使用system函数时应该忽略两个信号">使用system函数时应该忽略两个信号</a><span>2013-05-11</span><label><i>阅读</i><b>2851</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8883471" id="foot_aritcle_8883471undefined2138544279049921" target="_blank" title="进程控制">进程控制</a><span>2013-05-04</span><label><i>阅读</i><b>1276</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8880131" id="foot_aritcle_8880131undefined691412858793572" target="_blank" title="Linux C 实现文件传输">Linux C 实现文件传输</a><span>2013-05-03</span><label><i>阅读</i><b>1991</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8877236" id="foot_aritcle_8877236undefined2179933753706631" target="_blank" title="Linux C 实现生产者消费者问题">Linux C 实现生产者消费者问题</a><span>2013-05-02</span><label><i>阅读</i><b>3172</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8875027" id="foot_aritcle_8875027undefined14394689739590127" target="_blank" title="Linux多线程编程">Linux多线程编程</a><span>2013-05-02</span><label><i>阅读</i><b>1713</b></label></li> </ul>
<a href="http://blog.csdn.net/DLUTBruceZhang/article/category/1389271" class="MoreArticle">更多文章</a></div>
</div>
</div>
<script type="text/javascript">
$(function () {
GetCategoryArticles('1389271', 'DLUTBruceZhang','foot','8817587');
});
</script>
</div>
<div class="article_title">
<span class="ico ico_type_Original"></span>
<h1>
<span class="link_title"><a href="/dlutbrucezhang/article/details/8817587">
Linux中的可重入函数和不可重入函数
</a></span>
</h1>
</div>
<div class="article_manage clearfix">
<div class="article_l">
<span class="link_categories">
标签:
<a href="http://www.csdn.net/tag/Linux" target="_blank" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">Linux</a><a href="http://www.csdn.net/tag/%e5%a4%9a%e7%ba%bf%e7%a8%8b" target="_blank" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">多线程</a><a href="http://www.csdn.net/tag/%e5%a4%84%e7%90%86%e5%99%a8" target="_blank" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">处理器</a><a href="http://www.csdn.net/tag/%e8%a1%8c%e4%b8%9a%e6%95%b0%e6%8d%ae" target="_blank" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">行业数据</a><a href="http://www.csdn.net/tag/%e5%85%a8%e5%b1%80%e5%8f%98%e9%87%8f" target="_blank" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">全局变量</a>
</span>
</div>
<div class="article_r">
<span class="link_postdate">2013-04-18 10:25</span>
<span class="link_view" title="阅读次数">3484人阅读</span>
<span class="link_comments" title="评论次数"> <a href="#comments" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(0)</span>
<span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" οnclick="javascript:collectArticle('Linux中的可重入函数和不可重入函数','8817587');return false;" title="收藏">收藏</a></span>
<span class="link_report"> <a href="#report" οnclick="javascript:report(8817587,2);return false;" title="举报">举报</a></span>
</div>
</div>
<div class="embody" style="display:none" id="embody">
<span class="embody_t">本文章已收录于:</span>
<div class="embody_c" id="lib" value="{"err":0,"msg":"ok","data":[]}"></div>
</div>
<style type="text/css">
.embody{
padding:10px 10px 10px;
margin:0 -20px;
border-bottom:solid 1px #ededed;
}
.embody_b{
margin:0 ;
padding:10px 0;
}
.embody .embody_t,.embody .embody_c{
display: inline-block;
margin-right:10px;
}
.embody_t{
font-size: 12px;
color:#999;
}
.embody_c{
font-size: 12px;
}
.embody_c img,.embody_c em{
display: inline-block;
vertical-align: middle;
}
.embody_c img{
width:30px;
height:30px;
}
.embody_c em{
margin: 0 20px 0 10px;
color:#333;
font-style: normal;
}
</style>
<script type="text/javascript">
$(function () {
try
{
var lib = eval("("+$("#lib").attr("value")+")");
var html = "";
if (lib.err == 0) {
$.each(lib.data, function (i) {
var obj = lib.data[i];
//html += '<img src="' + obj.logo + '"/>' + obj.name + " ";
html += ' <a href="' + obj.url + '" target="_blank">';
html += ' <img src="' + obj.logo + '">';
html += ' <em><b>' + obj.name + '</b></em>';
html += ' </a>';
});
if (html != "") {
setTimeout(function () {
$("#lib").html(html);
$("#embody").show();
}, 100);
}
}
} catch (err)
{ }
});
</script>
<div class="category clearfix">
<div class="category_l">
<img src="http://static.blog.csdn.net/images/category_icon.jpg">
<span>分类:</span>
</div>
<div class="category_r">
<label οnclick="GetCategoryArticles('1389271','DLUTBruceZhang','top','8817587');">
<span οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">《UNIX环境高级编程》<em>(55)</em></span>
<img class="arrow-down" src="http://static.blog.csdn.net/images/arrow_triangle _down.jpg" style="display: inline;">
<img class="arrow-up" src="http://static.blog.csdn.net/images/arrow_triangle_up.jpg" style="display: none;">
<div class="subItem" style="display: none;">
<div class="subItem_t"><a href="http://blog.csdn.net/DLUTBruceZhang/article/category/1389271" target="_blank">作者同类文章</a><i class="J_close">X</i></div>
<ul class="subItem_l" id="top_1389271"><li class="tracking-ad" data-mod="popu_140"><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/12015141" id="top_aritcle_12015141undefined25703758328020454" target="_blank" title="linux 同步与异步--阻塞与非阻塞型I/O">linux 同步与异步--阻塞与非阻塞型I/O</a></li> <li class="tracking-ad" data-mod="popu_140"><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8914772" id="top_aritcle_8914772undefined9105543782133392" target="_blank" title="使用system函数时应该忽略两个信号">使用system函数时应该忽略两个信号</a></li> <li class="tracking-ad" data-mod="popu_140"><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8914250" id="top_aritcle_8914250undefined7434481529730461" target="_blank" title="信号实现父子进程之间的同步--sigsuspend的作用">信号实现父子进程之间的同步--sigsuspend的作用</a></li> <li class="tracking-ad" data-mod="popu_140"><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8883471" id="top_aritcle_8883471undefined8961601778028432" target="_blank" title="进程控制">进程控制</a></li> <li class="tracking-ad" data-mod="popu_140"><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8883339" id="top_aritcle_8883339undefined040913594976103695" target="_blank" title="调用 fork() 两次以避免僵死进程">调用 fork() 两次以避免僵死进程</a></li> <li style="padding-left: 300px;"><a href="http://blog.csdn.net/DLUTBruceZhang/article/category/1389271" target="_blank">更多</a></li></ul>
</div>
</label>
</div>
</div>
<script type="text/javascript" src="http://static.blog.csdn.net/scripts/category.js"></script>
<div class="bog_copyright">
<p class="copyright_p">版权声明:本文为博主原创文章,未经博主允许不得转载。</p>
</div>
<div id="article_content" class="article_content">
<p><strong><span style="font-size:24px; background-color:rgb(255,255,0)">可重入函数</span></strong></p>
<p></p>
<div style="margin:0px; padding:0px; font-family:Verdana,Arial,Helvetica,sans-serif; line-height:19px; background-color:rgb(254,254,242)">
<span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>可重入函数(即可以被中断的函数)可以被一个以上的任务调用,而不担心数据破坏。可重入函数在任何时候都可以被中断,而一段时间之后又可以恢复运行,而相应的数据不会破坏或者丢失。</strong></span></span></div>
<div style="margin:0px; padding:0px; font-family:Verdana,Arial,Helvetica,sans-serif; line-height:19px; background-color:rgb(254,254,242)">
<span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>可重入函数使用的变量有两种情况:</strong></span></span></div>
<div style="margin:0px; padding:0px; font-family:Verdana,Arial,Helvetica,sans-serif; line-height:19px; background-color:rgb(254,254,242)">
<span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>1.使用局部变量,变量保存在CPU寄存器中或者堆栈中;</strong></span></span></div>
<div style="margin:0px; padding:0px; font-family:Verdana,Arial,Helvetica,sans-serif; line-height:19px; background-color:rgb(254,254,242)">
<span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>2.使用全局变量,但是这时候要注意保护全局变量(防止任务中断后被其它任务改变变量)。</strong></span></span></div>
<div style="margin:0px; padding:0px; font-family:Verdana,Arial,Helvetica,sans-serif; line-height:19px; background-color:rgb(254,254,242)">
<div class="cnblogs_Highlighter" style="margin:0px; padding:0px">
<div style="margin:0px; padding:0px">
<div id="highlighter_642385" class="syntaxhighlighter cpp" style="padding:0px; width:1066.78125px; margin:1em 0px!important; position:relative!important; overflow:auto!important; background-color:rgb(255,255,255)!important">
<div class="toolbar" style="margin:0px!important; padding:0px!important; border:none!important; bottom:auto!important; float:none!important; height:11px!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:absolute!important; right:1px!important; top:1px!important; vertical-align:baseline!important; width:11px!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; z-index:10!important; color:rgb(255,255,255)!important">
<span style="margin:0px; padding:0px; line-height:1.5"><a href="http://www.cnblogs.com/sinaxyz/archive/2012/09/10/2679440.html#" class="toolbar_item command_help help" style="color:rgb(7,93,179); margin:0px!important; padding:1px 0px 0px!important; text-decoration:none!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:center!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important; display:block!important"><span style="font-size:18px"><strong>?</strong></span></a></span></div>
<table border="0" cellpadding="0" cellspacing="0" style="border:1px solid rgb(192,192,192); width:1066px; border-collapse:collapse; margin:0px!important; padding:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">
<tbody style="margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<tr style="margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<td class="gutter" style="padding:3px; border:1px solid rgb(192,192,192); border-collapse:collapse; margin:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:rgb(175,175,175)!important; word-break:normal!important">
<div class="line number1 index0 alt2" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; background-color:rgb(248,248,248)!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>1</strong></span></div>
<div class="line number2 index1 alt1" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>2</strong></span></div>
<div class="line number3 index2 alt2" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; background-color:rgb(248,248,248)!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>3</strong></span></div>
<div class="line number4 index3 alt1" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>4</strong></span></div>
<div class="line number5 index4 alt2" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; background-color:rgb(248,248,248)!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>5</strong></span></div>
</td>
<td class="code" style="padding:3px; border:1px solid rgb(192,192,192); width:1038px; border-collapse:collapse; margin:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; word-break:normal!important">
<div class="container" style="margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:relative!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<div class="line number1 index0 alt2" style="margin:0px!important; padding:0px 1em!important; background-color:rgb(248,248,248)!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong><code class="cpp keyword bold" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:rgb(0,0,255)!important">void</code> <code class="cpp functions bold" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:rgb(255,20,147)!important">strcpy</code><code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">(*dest,*src)</code></strong></span></div>
<div class="line number2 index1 alt1" style="margin:0px!important; padding:0px 1em!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"><span style="font-size:18px"><strong>{</strong></span></code></div>
<div class="line number3 index2 alt2" style="margin:0px!important; padding:0px 1em!important; background-color:rgb(248,248,248)!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong><code class="cpp spaces" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"> </code><code class="cpp keyword bold" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:rgb(0,0,255)!important">while</code><code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">(*
dest++ = *src ++){;}</code></strong></span></div>
<div class="line number4 index3 alt1" style="margin:0px!important; padding:0px 1em!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong><code class="cpp spaces" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"> </code><code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">*dest
= NUL;</code></strong></span></div>
<div class="line number5 index4 alt2" style="margin:0px!important; padding:0px 1em!important; background-color:rgb(248,248,248)!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"><span style="font-size:18px"><strong>}</strong></span></code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div style="margin:0px; padding:0px">
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>分析:上面的函数用于字符串复制,而参数是存放在堆栈中的,故而改函数可以被多任务调用,而不必担心各个任务调用期间会互相破坏对方的指针。</strong></span></span></div>
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong> </strong></span></span></div>
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>基本上下面的函数都是不可重入的:</strong></span></span></div>
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong> 1.函数内使用了静态的数据。</strong></span></span></div>
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong> 2.函数内使用了malloc()或者free()函数的。</strong></span></span></div>
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong> 3.函数内调用了标准的I/O函数的。</strong></span></span></div>
<div style="margin:0px; padding:0px">
<div class="cnblogs_Highlighter" style="margin:0px; padding:0px">
<div style="margin:0px; padding:0px">
<div id="highlighter_763190" class="syntaxhighlighter cpp" style="padding:0px; width:1066.78125px; margin:1em 0px!important; position:relative!important; overflow:auto!important; background-color:rgb(255,255,255)!important">
<div class="toolbar" style="margin:0px!important; padding:0px!important; border:none!important; bottom:auto!important; float:none!important; height:11px!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:absolute!important; right:1px!important; top:1px!important; vertical-align:baseline!important; width:11px!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; z-index:10!important; color:rgb(255,255,255)!important">
<span style="margin:0px; padding:0px; line-height:1.5"><a href="http://www.cnblogs.com/sinaxyz/archive/2012/09/10/2679440.html#" class="toolbar_item command_help help" style="color:rgb(7,93,179); margin:0px!important; padding:1px 0px 0px!important; text-decoration:none!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:center!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important; display:block!important"><span style="font-size:18px"><strong>?</strong></span></a></span></div>
<table border="0" cellpadding="0" cellspacing="0" style="border:1px solid rgb(192,192,192); width:1066px; border-collapse:collapse; margin:0px!important; padding:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">
<tbody style="margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<tr style="margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<td class="gutter" style="padding:3px; border:1px solid rgb(192,192,192); border-collapse:collapse; margin:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:rgb(175,175,175)!important; word-break:normal!important">
<div class="line number1 index0 alt2" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; background-color:rgb(248,248,248)!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>1</strong></span></div>
<div class="line number2 index1 alt1" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>2</strong></span></div>
<div class="line number3 index2 alt2" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; background-color:rgb(248,248,248)!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>3</strong></span></div>
<div class="line number4 index3 alt1" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>4</strong></span></div>
<div class="line number5 index4 alt2" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; background-color:rgb(248,248,248)!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>5</strong></span></div>
<div class="line number6 index5 alt1" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>6</strong></span></div>
<div class="line number7 index6 alt2" style="margin:0px!important; padding:0px 0.5em 0px 1em!important; background-color:rgb(248,248,248)!important; border-width:0px 3px 0px 0px!important; border-right-style:solid!important; border-right-color:rgb(108,226,108)!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; text-align:right!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong>7</strong></span></div>
</td>
<td class="code" style="padding:3px; border:1px solid rgb(192,192,192); width:1038px; border-collapse:collapse; margin:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; word-break:normal!important">
<div class="container" style="margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:relative!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<div class="line number1 index0 alt2" style="margin:0px!important; padding:0px 1em!important; background-color:rgb(248,248,248)!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong><code class="cpp color1 bold" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:gray!important">int</code> <code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">temp;</code></strong></span></div>
<div class="line number2 index1 alt1" style="margin:0px!important; padding:0px 1em!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong><code class="cpp spaces" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"> </code><code class="cpp keyword bold" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:rgb(0,0,255)!important">void</code> <code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">swap(</code><code class="cpp color1 bold" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:gray!important">int</code> <code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">*ex1,</code><code class="cpp color1 bold" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:gray!important">int</code> <code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">*ex2)</code></strong></span></div>
<div class="line number3 index2 alt2" style="margin:0px!important; padding:0px 1em!important; background-color:rgb(248,248,248)!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"><span style="font-size:18px"><strong>{</strong></span></code></div>
<div class="line number4 index3 alt1" style="margin:0px!important; padding:0px 1em!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong><code class="cpp spaces" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"> </code><code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">temp
= *ex1; </code><code class="cpp comments" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important; color:rgb(0,130,0)!important">//(1)</code></strong></span></div>
<div class="line number5 index4 alt2" style="margin:0px!important; padding:0px 1em!important; background-color:rgb(248,248,248)!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong><code class="cpp spaces" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"> </code><code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">*ex1
= *ex2;</code></strong></span></div>
<div class="line number6 index5 alt1" style="margin:0px!important; padding:0px 1em!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<span style="font-size:18px"><strong><code class="cpp spaces" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"> </code><code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important">*ex2
= temp;</code></strong></span></div>
<div class="line number7 index6 alt2" style="margin:0px!important; padding:0px 1em!important; background-color:rgb(248,248,248)!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important">
<code class="cpp plain" style="white-space:pre-wrap; margin:0px!important; padding:0px!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:2em!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:'Courier New',Consolas,'Bitstream Vera Sans Mono',Courier,monospace!important; min-height:auto!important"><span style="font-size:18px"><strong>}</strong></span></code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>分析:该函数中的全局变量temp是的函数变成了一个不可重入的函数,因为在多任务系统中,假如在任务1中调用swap函数,而程序执行到(1)处时被中断,进而执行其它的任务2,而刚好任务2也调用了swap函数,则temp里存的值则会被任务2改变。从而回到任务1被中断处继续执行的时候,temp里存的值已经不再是原来存的temp值了,进而产生了错误。</strong></span></span></div>
<div style="margin:0px; padding:0px"><span style="font-size:18px"><strong> </strong></span></div>
<div style="margin:0px; padding:0px"><span style="font-size:18px"><strong>常用的可重入函数的方法有:</strong></span></div>
<div style="margin:0px; padding:0px"><span style="font-size:18px"><strong>1.不要使用全局变量,防止别的代码覆盖这些变量的值。</strong></span></div>
<div style="margin:0px; padding:0px">
<div style="margin:0px; padding:0px">
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>2.调用这类函数之前先关掉中断,调用完之后马上打开中断。防止函数执行期间被中断进入别的任务执行。</strong></span></span></div>
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="font-size:18px"><strong>3.使用信号量(互斥条件)。</strong></span></span></div>
<div style="margin:0px; padding:0px"><span style="margin:0px; padding:0px; line-height:1.5"><span style="margin:0px; padding:0px"><span style="font-size:18px"><strong>总之:要保证中断是安全的</strong></span></span></span></div>
</div>
</div>
</div>
</div>
</div>
<br>
<p></p>
<p><strong><span style="font-size:24px; background-color:rgb(255,255,0)">不可重入函数</span></strong></p>
<p></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>在多任务系统下,中断可能在任务执行的任何时间发生;如果一个函数的执行期间被中断后,到重新恢复到断点进行执行的过程中,函数所依赖的环境没有发生改变,那么这个函数就是可重入的,否则就<span style="word-wrap:break-word; background-color:rgb(160,255,255)">不可重入</span>。</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>在中断前后不都要保存和恢复上下文吗,怎么会出现函数所依赖的环境发生改变了呢?</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>我们知道中断时确实保存一些上下文,但是仅限于返回地址,cpu寄存器等之类的少量上下文,而函数内部使用的诸如全局或静态变量,buffer等并不在保护之列,所以如果这些值在函数被中断期间发生了改变,那么当函数回到断点继续执行时,其结果就不可预料了。</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>满足下面条件之一的多数是<span style="word-wrap:break-word; background-color:rgb(160,255,255)">不可重入</span>函数:</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>(1)使用了静态<a href="http://lib.csdn.net/base/31" class="replace_word" title="算法与数据结构知识库" target="_blank" style="color:#df3434; font-weight:bold;">数据结构</a>;</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>(2)调用了malloc或free;</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>(3)调用了标准I/O函数;</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>(4)进行了</strong></span><strong style="font-size:18px; text-indent:2em"><span style="word-wrap:break-word; background-color:rgb(255,255,102)">浮点</span>运算.</strong></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong> </strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>malloc/free是<span style="word-wrap:break-word; background-color:rgb(160,255,255)">不可重入</span>的,它们使用了全局变量来指向空闲区;标准I/O库的很多实现都使用了全局数据结构; 许多的处理器/编译器中,<span style="word-wrap:break-word; background-color:rgb(255,255,102)">浮点</span>一般都是<span style="word-wrap:break-word; background-color:rgb(160,255,255)">不可重入</span>的
(<span style="word-wrap:break-word; background-color:rgb(255,255,102)">浮点</span>运算大多使用协处理器或者软件模拟来实现)。</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong> </strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>在信号处理程序及多线程编程时,要特别注意。</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>考虑这种情况:</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>1) 信号处理程序A内外都调用了同一个<span style="word-wrap:break-word; background-color:rgb(160,255,255)">不可重入</span>函数B;B在执行期间被信号打断,进入A (A中调用了B),完事之后返回B被中断点继续执行,这时B函数的环境可能改变,其结果就不可预料了。</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>2) 多线程共享进程内部的资源,如果两个线程A,B调用同一个<span style="word-wrap:break-word; background-color:rgb(160,255,255)">不可重入</span>函数F,A线程进入F后,线程调度,切换到B,B也执行了F,那么当再次切换到线程A时,其调用F的结果也是不可预料的。</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>在信号处理程序中即使调用可重入函数也有问题要注意。作为一个通用的规则,当在信号处理程序中调用可重</strong></span></p>
<p style="word-wrap:break-word; margin-top:5px; margin-bottom:5px; padding-top:0px; padding-bottom:0px; font-family:宋体,Arial; line-height:26px; text-indent:2em">
<span style="font-size:18px"><strong>入函数时,应当在其前保存errno,并在其后恢复errno。(要了解经常被捕捉到的信号是SIGCHLD,其信号处理程序通常要调用一种wait函数,而各种wait函数都能改变errno。)</strong></span></p>
<br>
</div>
<!-- Baidu Button BEGIN -->
<div class="bdsharebuttonbox tracking-ad bdshare-button-style0-16" style="float: right;" data-mod="popu_172" data-bd-bind="1476321039367">
<a href="#" class="bds_more" data-cmd="more" style="background-position:0 0 !important; background-image: url(http://bdimg.share.baidu.com/static/api/img/share/icons_0_16.png?v=d754dcc0.png) !important"></a>
<a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间" style="background-position:0 -52px !important"></a>
<a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博" style="background-position:0 -104px !important"></a>
<a href="#" class="bds_tqq" data-cmd="tqq" title="分享到腾讯微博" style="background-position:0 -260px !important"></a>
<a href="#" class="bds_renren" data-cmd="renren" title="分享到人人网" style="background-position:0 -208px !important"></a>
<a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信" style="background-position:0 -1612px !important"></a>
</div>
<script>window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "1", "bdMiniList": false, "bdPic": "", "bdStyle": "0", "bdSize": "16" }, "share": {} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];</script>
<!-- Baidu Button END -->
<link rel="stylesheet" href="http://static.blog.csdn.net/css/blog_detail.css">
<!--172.16.140.11-->
<!-- Baidu Button BEGIN -->
<script type="text/javascript" id="bdshare_js" data="type=tools&uid=1536434" src="http://bdimg.share.baidu.com/static/js/bds_s_v2.js?cdnversion=410090"></script>
<script type="text/javascript">
document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
</script>
<!-- Baidu Button END -->
<div id="digg" articleid="8817587">
<dl id="btnDigg" class="digg digg_enable" οnclick="btndigga();">
<dt>顶</dt>
<dd>1</dd>
</dl>
<dl id="btnBury" class="digg digg_enable" οnclick="btnburya();">
<dt>踩</dt>
<dd>0</dd>
</dl>
</div>
<div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);"> </a> </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);"> </a></div>
<script type="text/javascript">
function btndigga() {
$(".tracking-ad[data-mod='popu_222'] a").click();
}
function btnburya() {
$(".tracking-ad[data-mod='popu_223'] a").click();
}
</script>
<ul class="article_next_prev">
<li class="prev_article"><span οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian']);location.href='/dlutbrucezhang/article/details/8815506';">上一篇</span><a href="/dlutbrucezhang/article/details/8815506" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian'])">linux系统调用和库函数调用的区别</a></li>
<li class="next_article"><span οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_xiayipian']);location.href='/dlutbrucezhang/article/details/8819698';">下一篇</span><a href="/dlutbrucezhang/article/details/8819698" οnclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_xiayipian'])">linux c 之sigsuspend 进程阻塞</a></li>
</ul>
<div style="clear:both; height:10px;"></div>
<div class="similar_article" style="">
<h4>我的同类文章</h4>
<div class="similar_c" style="margin:20px 0px 0px 0px">
<div class="similar_c_t">
<label class="similar_cur">
<span style="cursor:pointer" οnclick="GetCategoryArticles('1389271','DLUTBruceZhang','foot','8817587');">《UNIX环境高级编程》<em>(55)</em></span>
</label>
</div>
<div class="similar_wrap tracking-ad" data-mod="popu_141" style="max-height:195px;">
<a href="http://blog.csdn.net" style="display:none">http://blog.csdn.net</a>
<ul class="similar_list fl"><li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/12015141" id="foot_aritcle_12015141undefined6308514044622291" target="_blank" title="linux 同步与异步--阻塞与非阻塞型I/O">linux 同步与异步--阻塞与非阻塞型I/O</a><span>2013-09-25</span><label><i>阅读</i><b>1445</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8914250" id="foot_aritcle_8914250undefined10723850652524058" target="_blank" title="信号实现父子进程之间的同步--sigsuspend的作用">信号实现父子进程之间的同步--sigsuspend的作用</a><span>2013-05-11</span><label><i>阅读</i><b>3673</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8883339" id="foot_aritcle_8883339undefined46357555790109894" target="_blank" title="调用 fork() 两次以避免僵死进程">调用 fork() 两次以避免僵死进程</a><span>2013-05-04</span><label><i>阅读</i><b>4371</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8878630" id="foot_aritcle_8878630undefined8902568039123433" target="_blank" title="Linux下互斥量与条件变量详细解析">Linux下互斥量与条件变量详细解析</a><span>2013-05-03</span><label><i>阅读</i><b>3841</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8877055" id="foot_aritcle_8877055undefined15226653829029035" target="_blank" title="用C语言得到Linux主机的IP地址">用C语言得到Linux主机的IP地址</a><span>2013-05-02</span><label><i>阅读</i><b>1526</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8872581" id="foot_aritcle_8872581undefined9455712280638049" target="_blank" title="Linux下基于socket多线程并发通信的实现">Linux下基于socket多线程并发通信的实现</a><span>2013-05-01</span><label><i>阅读</i><b>2343</b></label></li> </ul>
<ul class="similar_list fr"><li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8914772" id="foot_aritcle_8914772undefined9400255583397015" target="_blank" title="使用system函数时应该忽略两个信号">使用system函数时应该忽略两个信号</a><span>2013-05-11</span><label><i>阅读</i><b>2851</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8883471" id="foot_aritcle_8883471undefined2138544279049921" target="_blank" title="进程控制">进程控制</a><span>2013-05-04</span><label><i>阅读</i><b>1276</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8880131" id="foot_aritcle_8880131undefined691412858793572" target="_blank" title="Linux C 实现文件传输">Linux C 实现文件传输</a><span>2013-05-03</span><label><i>阅读</i><b>1991</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8877236" id="foot_aritcle_8877236undefined2179933753706631" target="_blank" title="Linux C 实现生产者消费者问题">Linux C 实现生产者消费者问题</a><span>2013-05-02</span><label><i>阅读</i><b>3172</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/DLUTBruceZhang/article/details/8875027" id="foot_aritcle_8875027undefined14394689739590127" target="_blank" title="Linux多线程编程">Linux多线程编程</a><span>2013-05-02</span><label><i>阅读</i><b>1713</b></label></li> </ul>
<a href="http://blog.csdn.net/DLUTBruceZhang/article/category/1389271" class="MoreArticle">更多文章</a></div>
</div>
</div>
<script type="text/javascript">
$(function () {
GetCategoryArticles('1389271', 'DLUTBruceZhang','foot','8817587');
});
</script>
</div>