﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-天蓝向上-随笔分类-Linux</title><link>http://www.cppblog.com/tianbianlan/category/11224.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 22 Apr 2013 08:57:28 GMT</lastBuildDate><pubDate>Mon, 22 Apr 2013 08:57:28 GMT</pubDate><ttl>60</ttl><item><title>gprof——GNU性能分析工具 </title><link>http://www.cppblog.com/tianbianlan/archive/2013/04/22/199639.html</link><dc:creator>天边蓝</dc:creator><author>天边蓝</author><pubDate>Mon, 22 Apr 2013 08:39:00 GMT</pubDate><guid>http://www.cppblog.com/tianbianlan/archive/2013/04/22/199639.html</guid><wfw:comment>http://www.cppblog.com/tianbianlan/comments/199639.html</wfw:comment><comments>http://www.cppblog.com/tianbianlan/archive/2013/04/22/199639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tianbianlan/comments/commentRss/199639.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tianbianlan/services/trackbacks/199639.html</trackback:ping><description><![CDATA[<address><em>转载至</em><a href="http://www.cnblogs.com/feisky/archive/2010/03/09/1681997.html"><em>http://www.cnblogs.com/feisky/archive/2010/03/09/1681997.html</em></a></address>
<h1>gprof介绍</h1>
<p>gprof是GNU profiler工具。可以显示程序运行的&#8220;flat profile&#8221;，包括每个函数的调用次数，每个函数消耗的处理器时间。也可以显示&#8220;调用图&#8221;，包括函数的调用关系，每个函数调用花费了多少时间。还可以显示&#8220;注释的源代码&#8221;，是程序源代码的一个复本，标记有程序中每行代码的执行次数。</p>
<h1>为gprof编译程序</h1>
<p><br />在编译或链接源程序的时候在编译器的<strong>命令行参数中加入&#8220;-pg&#8221;选项</strong>，编译时编译器会自动在目标代码中插入用于性能测试的代码片断，这些代码在程序在运行时采集并记录函数的调用关系和调用次数，以及采集并记录函数自身执行时间和子函数的调用时间，<strong>程序运行结束后，会在程序退出的路径下生成一个gmon.out文件</strong>。这个文件就是记录并保存下来的监控数据。可以通过命令行方式的gprof或图形化的Kprof来解读这些数据并对程序的性能进行分析。另外，如果想查看库函数的profiling，需要在编译是再加入&#8220;-lc_p&#8221;编译参数代替&#8220;-lc&#8221;编译参数，这样程序会链接libc_p.a库，才可以产生库函数的profiling信息。如果想执行一行一行的profiling，还需要加入&#8220;-g&#8221;编译参数。<br />例如如下命令行：gcc -Wall -g -pg -lc_p example.c -o example</p>
<h1><em>Gprof基本用法：</em></h1>
<p>1． 使用 -pg 编译和链接你的应用程序。</p>
<p>2． 执行你的应用程序使之生成供gprof 分析的数据。 
<p>3． 使用gprof 程序分析你的应用程序生成的数据。 
<p>$<strong>gprof -b a.out gmon.out</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />Flat profile: 
<p>Each sample counts as 0.01 seconds.<br />no time accumulated 
<p>&nbsp; %&nbsp;&nbsp; cumulative&nbsp;&nbsp; self&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self&nbsp;&nbsp;&nbsp;&nbsp; total&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />time&nbsp;&nbsp; seconds&nbsp;&nbsp; seconds&nbsp;&nbsp;&nbsp; calls&nbsp; Ts/call&nbsp; Ts/call&nbsp; name&nbsp;&nbsp;&nbsp; <br />&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp; function 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Call graph 
<p>granularity: each sample hit covers 2 byte(s) no time propagated 
<p>index % time&nbsp;&nbsp;&nbsp; self&nbsp; children&nbsp;&nbsp;&nbsp; called&nbsp;&nbsp;&nbsp;&nbsp; name<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1/1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; main [8]<br />[1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp; 0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function [1]<br />----------------------------------------------- 
<p>Index by function name 
<p>&nbsp;&nbsp; [1] function 
<h1>gprof产生的信息</h1>
<p><br />%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the percentage of the total running time of the<br />time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; program used by this function.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 函数使用时间占所有时间的百分比。<br />cumulative&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a running sum of the number of seconds accounted<br />seconds&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for by this function and those listed above it.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 函数和上列函数累计执行的时间。<br />self&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the number of seconds accounted for by this<br />seconds&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function alone.&nbsp; This is the major sort for this<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listing.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 函数本身所执行的时间。<br />calls&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the number of times this function was invoked, if<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this function is profiled, else blank.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 函数被调用的次数<br />self&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the average number of milliseconds spent in this<br />ms/call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function per call, if this function is profiled,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else blank.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每一次调用花费在函数的时间microseconds。<br />total&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the average number of milliseconds spent in this<br />ms/call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function and its descendents per call, if this<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function is profiled, else blank.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每一次调用，花费在函数及其衍生函数的平均时间microseconds。<br />name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the name of the function.&nbsp; This is the minor sort<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for this listing. The index shows the location of<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the function in the gprof listing. If the index is<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in parenthesis it shows where it would appear in<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the gprof listing if it were to be printed.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 函数名</p>
<h1>命令格式</h1>
<p>gprof [可执行文件] [gmon.out文件] [其它参数] 
<p>方括号中的内容可以省略。如果省略了&#8220;可执行文件&#8221;，gprof会在当前目录下搜索a.out文件作为可执行文件，而如果省略了gmon.out文件，gprof也会在当前目录下寻找gmon.out。其它参数可以控制gprof输出内容的格式等信息。最常用的参数如下： 
<p>l -b 不再输出统计图表中每个字段的详细描述。 
<p>l -p 只输出函数的调用图（Call graph的那部分信息）。 
<p>l -q 只输出函数的时间消耗列表。 
<p>l -e Name 不再输出函数Name 及其子函数的调用图（除非它们有未被限制的其它父函数）。可以给定多个 -e 标志。一个 -e 标志只能指定一个函数。 
<p>l -E Name 不再输出函数Name 及其子函数的调用图，此标志类似于 -e 标志，但它在总时间和百分比时间的计算中排除了由函数Name 及其子函数所用的时间。 
<p>l -f Name 输出函数Name 及其子函数的调用图。可以指定多个 -f 标志。一个 -f 标志只能指定一个函数。 
<p>l -F Name 输出函数Name 及其子函数的调用图，它类似于 -f 标志，但它在总时间和百分比时间计算中仅使用所打印的例程的时间。可以指定多个 -F 标志。一个 -F 标志只能指定一个函数。-F 标志覆盖 -E 标志。 
<p>l -z 显示使用次数为零的例程（按照调用计数和累积时间计算）。 
<p>不过,gprof不能显示对象之间的继承关系,这也是它的弱点.</p><img src ="http://www.cppblog.com/tianbianlan/aggbug/199639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tianbianlan/" target="_blank">天边蓝</a> 2013-04-22 16:39 <a href="http://www.cppblog.com/tianbianlan/archive/2013/04/22/199639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】浅析系统的大小端模式 </title><link>http://www.cppblog.com/tianbianlan/archive/2012/01/19/164364.html</link><dc:creator>天边蓝</dc:creator><author>天边蓝</author><pubDate>Thu, 19 Jan 2012 03:39:00 GMT</pubDate><guid>http://www.cppblog.com/tianbianlan/archive/2012/01/19/164364.html</guid><wfw:comment>http://www.cppblog.com/tianbianlan/comments/164364.html</wfw:comment><comments>http://www.cppblog.com/tianbianlan/archive/2012/01/19/164364.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tianbianlan/comments/commentRss/164364.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tianbianlan/services/trackbacks/164364.html</trackback:ping><description><![CDATA[<h3>
<h1></h1>
<p style="line-height: 130%"><span style="font-size: small"><span style="font-family: 宋体">转载来源：<a href="http://blog.csdn.net/dragonbooker/article/details/6173321">http://blog.csdn.net/dragonbooker/article/details/6173321</a><br />大端模式</span></span></p>
<p style="line-height: 130%"><span style="font-size: small"><span style="font-family: 宋体">　　所谓的大端模式，是指数据的低位（就是权值较小的后面那几位）保存在内存的高地址中，而数据的高位，保存在内存的低地址中，这样的存储模式有点儿类似于把数据当作字符串顺序处理：地址由小向大增加，而数据从高位往低位放；</span> </span></p>
<p style="line-height: 130%" sizset="34" sizcache="1"><a name="1_2"></a>&nbsp;</p>
<p style="line-height: 130%"><span style="font-size: small"><span style="font-family: 宋体">小端模式</span></span></p>
<p style="line-height: 130%"><span style="font-size: small"><span style="font-family: 宋体">　　所谓的小端模式，是指数据的低位保存在内存的低地址中，而数</span> <span style="font-family: 宋体">据的高位保存在内存的高地址中，这种存储模式将地址的高低和数据位权有效地结合起来，高地址部分权值高，低地址部分权值低，和我们的逻辑方法一致。</span> </span></p>
<p style="line-height: 130%" sizset="35" sizcache="1"><a name="1_3"></a>&nbsp;</p>
<p style="line-height: 130%"><span style="font-size: small"><span style="font-family: 宋体">为什么有大小端模式之分</span></span></p>
<p style="text-indent: 21pt; line-height: 130%"><span style="font-size: small"><span style="font-family: 宋体">为什么会有大小端模式之分呢？这是因为在计算机系统中，我们是以字节为单位的，每个地址单元都对应着一个字节，一个字节为</span><span style="font-family: Times New Roman"> 8bit</span><span style="font-family: 宋体">。但是在</span><span style="font-family: Times New Roman">C</span><span style="font-family: 宋体">语言中除了</span><span style="font-family: Times New Roman">8bit</span><span style="font-family: 宋体">的</span><span style="font-family: Times New Roman">char</span><span style="font-family: 宋体">之外，还有</span><span style="font-family: Times New Roman">16bit</span><span style="font-family: 宋体">的</span><span style="font-family: Times New Roman">short</span><span style="font-family: 宋体">型，</span><span style="font-family: Times New Roman">32bit</span><span style="font-family: 宋体">的</span><span style="font-family: Times New Roman">long</span><span style="font-family: 宋体">型（要看具体的编译器），另外，对于位数大于</span><span style="font-family: Times New Roman"> 8</span><span style="font-family: 宋体">位的处理器，例如</span><span style="font-family: Times New Roman">16</span><span style="font-family: 宋体">位或者</span><span style="font-family: Times New Roman">32</span><span style="font-family: 宋体">位的处理器，由于寄存器宽度大于一个字节，那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个</span><span style="font-family: Times New Roman">16bit</span><span style="font-family: 宋体">的</span><span style="font-family: Times New Roman">short</span><span style="font-family: 宋体">型</span><span style="font-family: Times New Roman">x</span><span style="font-family: 宋体">，在内存中的地址为</span><span style="font-family: Times New Roman">0x0010</span><span style="font-family: 宋体">，</span><span style="font-family: Times New Roman">x</span><span style="font-family: 宋体">的值为</span><span style="font-family: Times New Roman">0x1122</span><span style="font-family: 宋体">，那么</span><span style="font-family: Times New Roman">0x11</span><span style="font-family: 宋体">为高字节，</span><span style="font-family: Times New Roman">0x22</span><span style="font-family: 宋体">为低字节。对于</span> <span style="font-family: 宋体">大端模式，就将</span><span style="font-family: Times New Roman">0x11</span><span style="font-family: 宋体">放在低地址中，即</span><span style="font-family: Times New Roman">0x0010</span><span style="font-family: 宋体">中，</span><span style="font-family: Times New Roman">0x22</span><span style="font-family: 宋体">放在高地址中，即</span><span style="font-family: Times New Roman">0x0011</span><span style="font-family: 宋体">中。小端模式，刚好相反。我们常用的</span><span style="font-family: Times New Roman">X86</span><span style="font-family: 宋体">结构是小端模式，而</span><span style="font-family: Times New Roman">KEIL C51</span><span style="font-family: 宋体">则为大端模式。很多的</span><span style="font-family: Times New Roman">ARM</span><span style="font-family: 宋体">，</span><span style="font-family: Times New Roman">DSP</span><span style="font-family: 宋体">都为小端模式。有些</span><span style="font-family: Times New Roman">ARM</span><span style="font-family: 宋体">处理器还可以由硬件来选择是大端模式还是小端模式。</span></span></p>
<h3><span style="font-family: 宋体"><span style="font-size: large">二、举例说明</span></span></h3>
<p style="line-height: 130%"><span style="font-size: small"><span style="font-family: 宋体">大家都知道字符&#8216;</span><span style="font-family: Times New Roman">A</span><span style="font-family: 宋体">&#8217;的</span><span style="font-family: Times New Roman">ASCII</span><span style="font-family: 宋体">码值为</span><span style="font-family: Times New Roman">65</span><span style="font-family: 宋体">（十进制）也就是</span><span style="font-family: Times New Roman">0x41</span><span style="font-family: 宋体">，那么这个值在不同大小端模式的系统中存放的方式分别为：</span></span></p>
<p style="line-height: 130%"><span style="font-size: small"><span style="font-family: 宋体">大端模式：</span><span style="font-family: Times New Roman">00 00 00 41&nbsp;-----</span><span style="font-family: 宋体">高低模式</span></span></p>
<p style="line-height: 130%"><span style="font-size: small"><span style="font-family: 宋体">小端模式：</span><span style="font-family: Times New Roman">41 00 00 00 &nbsp;-----</span><span style="font-family: 宋体">低低模式</span></span></p>
<h3><span style="font-family: 宋体"><span style="font-size: large">三、使用代码判断大小端模式</span></span></h3>
<p><span style="font-size: small"><span style="font-family: 宋体">可以通过声明一个联合（</span><span style="font-family: Times New Roman">union</span><span style="font-family: 宋体">）判断大小端模式：</span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small; font-family: Times New Roman">/**</span></p>
<p><span style="font-size: small"><span style="font-family: Times New Roman">&nbsp;* </span><span style="font-family: 宋体">方法一</span> <span style="font-family: 宋体">得到当前系统的大小端属性</span><span style="font-family: Times New Roman">, </span><span style="font-family: 宋体">此方法要保证在</span><span style="font-family: Times New Roman">32</span><span style="font-family: 宋体">位机测试</span></span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;*/</span></span></p>
<p><span style="font-size: small; font-family: Times New Roman">static union { </span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char c[4]; </span></span></span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp; unsigned long l; </span></span></span></p>
<p><span style="font-size: small; font-family: Times New Roman">} </span></p>
<p>&nbsp;</p>
<p><span style="font-size: small"><span style="font-family: Times New Roman">endian_test = { { 'l', '?', '?', 'b' } }; </span><span style="font-family: 宋体">　　</span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small; font-family: Times New Roman">#define ENDIANNESS ((char)endian_test.l)</span></p>
<p>&nbsp;</p>
<p><span style="font-size: small; font-family: Times New Roman">/**</span></p>
<p><span style="font-size: small"><span style="font-family: Times New Roman">&nbsp;* </span><span style="font-family: 宋体">方法二</span><span style="font-family: Times New Roman">: </span><span style="font-family: 宋体">得到当前系统的大小端属性</span></span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;*/</span></span></p>
<p><span style="font-size: small; font-family: Times New Roman">static union {</span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp; short n;</span></span></span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp; char c[sizeof(short)];</span></span></span></p>
<p><span style="font-size: small; font-family: Times New Roman">}un;</span></p>
<p>&nbsp;</p>
<p><span style="font-size: small; font-family: Times New Roman">int getEndian()</span></p>
<p><span style="font-size: small; font-family: Times New Roman">{</span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small"><span>&nbsp;&nbsp; un.n = 0x0102;</span></span></span></p>
<p><span>&nbsp;</span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small"><span>&nbsp;&nbsp; if ((un.c[0] == 1 &amp;&amp; un.c[1] == 2))</span></span></span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small"><span>&nbsp;&nbsp; {</span></span></span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp; printf("big endian/n");</span></span></span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small"><span>&nbsp;&nbsp; }</span></span></span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small"><span>&nbsp;&nbsp; else if ((un.c[0] == 2 &amp;&amp; un.c[1] == 1))</span></span></span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small"><span>&nbsp;&nbsp; {</span></span></span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp; printf("little endian/n");</span></span></span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small"><span>&nbsp;&nbsp; }</span></span></span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small"><span>&nbsp;&nbsp; else </span></span></span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small"><span>&nbsp;&nbsp;&nbsp;&nbsp; printf("error!/n");</span></span></span></p>
<p>&nbsp;</p>
<p><span style="font-family: Times New Roman"><span style="font-size: small"><span>&nbsp;&nbsp; return 0;</span></span></span></p>
<p><span style="font-size: small; font-family: Times New Roman">}</span></p>
<p>&nbsp;</p>
<p><span style="font-size: small; font-family: Times New Roman">/**</span></p>
<p><span style="font-size: small"><span style="font-family: Times New Roman">&nbsp;* </span><span style="font-family: 宋体">方法三</span><span style="font-family: Times New Roman">: </span><span style="font-family: 宋体">得到当前系统的大小端属性</span></span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small">&nbsp;*/</span></span></p>
<p><span style="font-size: small; font-family: Times New Roman">int getEndian()</span></p>
<p><span style="font-size: small; font-family: Times New Roman">{</span></p>
<p><span style="font-family: Times New Roman"><span style="font-size: small"><span>&nbsp;&nbsp; int c = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // big-endian: 00 00 00 01 little-endian: 01 00 00 00</span></span></span></p>
<p>&nbsp;&nbsp;<span style="font-size: small"><span style="font-family: Times New Roman">// int c = 0x02000001;&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: small; font-family: Times New Roman">// big-endian: 02 00 00 01 little-endian: 01 00 00 02</span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp; if ((*(char *)&amp;c) == 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span></span><span style="font-family: 宋体">取</span><span style="font-family: Times New Roman">c</span><span style="font-family: 宋体">变量所在地址上的一个字节。</span></span></p>
<p><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp; {</span></span></span></p>
<p><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp; printf("little endian/n");</span></span></span></p>
<p><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp; }</span></span></span></p>
<p><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp; else</span></span></span></p>
<p><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp; printf("big endian");</span></span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp; return 0;</span></span></span></p>
<p><span style="font-size: small; font-family: Times New Roman">}</span></p><a name="1_1"></a></h3><img src ="http://www.cppblog.com/tianbianlan/aggbug/164364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tianbianlan/" target="_blank">天边蓝</a> 2012-01-19 11:39 <a href="http://www.cppblog.com/tianbianlan/archive/2012/01/19/164364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>进程间通信——FIFO</title><link>http://www.cppblog.com/tianbianlan/archive/2009/07/18/90421.html</link><dc:creator>天边蓝</dc:creator><author>天边蓝</author><pubDate>Sat, 18 Jul 2009 05:52:00 GMT</pubDate><guid>http://www.cppblog.com/tianbianlan/archive/2009/07/18/90421.html</guid><wfw:comment>http://www.cppblog.com/tianbianlan/comments/90421.html</wfw:comment><comments>http://www.cppblog.com/tianbianlan/archive/2009/07/18/90421.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tianbianlan/comments/commentRss/90421.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tianbianlan/services/trackbacks/90421.html</trackback:ping><description><![CDATA[<p>FIFO简介<br>为了解决匿名管道的限制，Linux特地提出了FIFO管道，即有名管道。FIFO十通过文件来传输数据的，但其具有匿名管道的特性——在读出数据时，FIFO同事清理管道为空。</p>
<p>创建FIFO管道<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $mkfifo &#8211;m 600 fifocat<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;sys/stat.h&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;sys/types.h&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mkfifo( const char *filename, mode_t mode );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数说明：mode指定FIFO的读写权限，新创建FIFO的用户ID和组ID规则。与open函数相同。<br>&nbsp;&nbsp; 参数mode 则有下列数种组合，只有在建立新文件时才会生效，此外真正建文件时的权限会受到umask值所影响，因此该文件权限应该为（mode-umaks）。<br>S_IRWXU00700 权限，代表该文件所有者具有可读、可写及可执行的权限。<br>S_IRUSR 或S_IREAD，00400权限，代表该文件所有者具有可读取的权限。<br>S_IWUSR 或S_IWRITE，00200 权限，代表该文件所有者具有可写入的权限。<br>S_IXUSR 或S_IEXEC，00100 权限，代表该文件所有者具有可执行的权限。<br>S_IRWXG 00070权限，代表该文件用户组具有可读、可写及可执行的权限。<br>S_IRGRP 00040 权限，代表该文件用户组具有可读的权限。<br>S_IWGRP 00020权限，代表该文件用户组具有可写入的权限。<br>S_IXGRP 00010 权限，代表该文件用户组具有可执行的权限。<br>S_IRWXO 00007权限，代表其他用户具有可读、可写及可执行的权限。<br>S_IROTH 00004 权限，代表其他用户具有可读的权限<br>S_IWOTH 00002权限，代表其他用户具有可写入的权限。<br>S_IXOTH 00001 权限，代表其他用户具有可执行的权限。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %注意：当要创建一个已经存在的FIFO时，程序会产生一个EEXIST的异常</p>
<p>FIFO读写操作<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 般的I/O（open close read write unlink）函数都可以用于FIFO文件，需要注意的是，在使用open函数打开一个FIFO文件时，open函数参数flag标志位的O_NONBLOCK标志，它关系到函数的返回状态。详细说明如表14-2所示。<br>表14-2 open函数的flag(O_NONBLOCK)详细说明<br>O_NONBLOCK标志<br>详 细 说 明<br>置位<br>只读open立即返回。当只写open时，如果没有进程为读打开FIFO，则返回&#8211;1，并置errno值为ENXIO<br>不置位<br>open视情况阻塞。只读open要阻塞到有进程为写打开FIFO，只写open要阻塞到有进程为读打开FIFO</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FIFO的写操作规则类似于匿名管道的写操作规则，当没有进程为读打开FIFO，调用write函数来进行写操作会产生信号SIGPIPE，则信号可以被捕捉或者完全忽略。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %注意：当FIFO的所有写进程都已经关闭，则为FIFO的读进程产生一个文件结束符。</p>
<p><br>FIFO的缺点<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然FIFO也有它的局限性，如图14-6所示。客户端可以发请求到服务器，但前提是要知道一个公共的FIFO通道，对于实现服务器回传应答到客户端的问题，可以通过为每一个客户端创建一个专用的FIFO，来实现回传应答。但也有不足，服务器会同时应答成千上万个客户端，创建如此多的FIFO是否会使系统负载过大，相应的如何判断客户端是否因意外而崩溃成为难题，或者客户端不读取应答直接退出，所以服务器必须处理SIGPIPE信号，并做相应处理。<br></p>
<img src ="http://www.cppblog.com/tianbianlan/aggbug/90421.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tianbianlan/" target="_blank">天边蓝</a> 2009-07-18 13:52 <a href="http://www.cppblog.com/tianbianlan/archive/2009/07/18/90421.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>进程间通信——管道</title><link>http://www.cppblog.com/tianbianlan/archive/2009/07/18/90420.html</link><dc:creator>天边蓝</dc:creator><author>天边蓝</author><pubDate>Sat, 18 Jul 2009 05:51:00 GMT</pubDate><guid>http://www.cppblog.com/tianbianlan/archive/2009/07/18/90420.html</guid><wfw:comment>http://www.cppblog.com/tianbianlan/comments/90420.html</wfw:comment><comments>http://www.cppblog.com/tianbianlan/archive/2009/07/18/90420.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tianbianlan/comments/commentRss/90420.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tianbianlan/services/trackbacks/90420.html</trackback:ping><description><![CDATA[<p style="COLOR: #000080"><span style="COLOR: red">管道简介<br></span>常说的管道都是匿名半双工管道，匿名半双工管道在系统中是没有实名的，并不可以在文件系统中以任何方式看到该管道。它只是进程的一种资源，会随着进程的结束而被系统清除。管道通信是在UNIX系统中应用比较频繁的一种方式，例如使用grep查找：ls |grep ipc<br>顾名思义，匿名半双工管道没有名字，这个特性导致了它在应用方面的局限性：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.只能在有具有公共祖先的进程间通信，即或是父子关系进程间、或是在兄弟关系进程间通信。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.数据只能在一个方向上移动<br>管道创建<br>尽管这样，半双工管道还是Linux系统上最常见的通信方式。Linux系统用pipe函数创建一个半双工管道，期函数原型为：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; include&lt;unistd.h&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int pipe(int fd[2]);<br>&nbsp;&nbsp;&nbsp;&nbsp; 参数fd是一个长度为2的文件描述符，fd[1]为输入文件描述符，fd[1]为输出文件描述符；函数返回类型为int，0表示成功，-1表示失败。当成功返回时，则自动维护一个从fd[1]到fd[0]的同行管道。<br>管道操作<br>对管道进行读写，可以通过write和read进行：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write(fd[1], "create the pipe successfully !\n", 31 ); /*向管道写入端写入数据*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char str[256];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; read(fd[0], str, sizeof(str) ); /*从管道读出端读出数据*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 读写时，需要注意的问题：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.当输出端关闭时，对输入端的写操作会产生信号SIGPIPE，说明管道读端已经关闭，并且write操作返回为&#8211;1，errno的值为EPIPE，对于SIGPIPE信号可以进行捕捉处理。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.read返回0说明管道中没数据，但不能说明输入端是否关闭<br>操作流程<br>&nbsp;&nbsp;&nbsp; 1.创建管道<br>&nbsp;&nbsp;&nbsp; 2.利用fork创建子进程<br>&nbsp;&nbsp;&nbsp; 3.控制管道流向<br>&nbsp;&nbsp;&nbsp; 4.从fd[1]向管道写信息<br>&nbsp;&nbsp;&nbsp; 5.通过fd[0]从管道渡信息<br>创建管道的标准库函数<br>&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;stdio.h&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE *popen( const char * command, const char *mode ); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int pclose ( FILE *stream );&nbsp; <br>示例<br>引用《Linux C程序设计大全》 中的例子<br>#include &lt;unistd.h&gt;<br>#include &lt;stdio.h&gt;<br>#include &lt;fcntl.h&gt;<br>#include &lt;sys/types.h&gt;<br>#define BUFES PIPE_BUF /* PIPE_BUF管道默认一次性读写的数据长度*/<br>int main ( void ) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int fd[2];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char buf[BUFSZ];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pid_t pid;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int len; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( (pipe(fd)) &lt; 0 ){ /*创建管道*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perror ( "failed to pipe" );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit( 1 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( (pid = fork()) &lt; 0 ){ /* 创建一个子进程 */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perror ( "failed to fork " );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit( 1 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if ( pid &gt; 0 ){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; close ( fd[0] ); /*父进程中关闭管道的读出端*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write (fd[1], "hello my son!\n", 14 ); /*父进程向管道写入数据*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit ( 0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; close ( fd[1] ); /*子进程关闭管道的写入端*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; len = read (fd[0], buf, BUFS ); /*子进程从管道中读出数据*/ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( len &lt; 0 ){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perror ( "process failed when read a pipe " );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit( 1 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write(STDOUT_FILENO, buf, len); /*输出到标准输出*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>}</p>
<img src ="http://www.cppblog.com/tianbianlan/aggbug/90420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tianbianlan/" target="_blank">天边蓝</a> 2009-07-18 13:51 <a href="http://www.cppblog.com/tianbianlan/archive/2009/07/18/90420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>