﻿<?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++博客-Aaron学习笔记-文章分类-Linux编程</title><link>http://www.cppblog.com/wangfeng2500/category/16780.html</link><description>少壮不努力，长大没饭吃！</description><language>zh-cn</language><lastBuildDate>Mon, 18 Jul 2011 02:37:15 GMT</lastBuildDate><pubDate>Mon, 18 Jul 2011 02:37:15 GMT</pubDate><ttl>60</ttl><item><title>数据报和字节流在使用时的一些区别</title><link>http://www.cppblog.com/wangfeng2500/articles/150758.html</link><dc:creator>赞劲小子</dc:creator><author>赞劲小子</author><pubDate>Tue, 12 Jul 2011 07:02:00 GMT</pubDate><guid>http://www.cppblog.com/wangfeng2500/articles/150758.html</guid><wfw:comment>http://www.cppblog.com/wangfeng2500/comments/150758.html</wfw:comment><comments>http://www.cppblog.com/wangfeng2500/articles/150758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangfeng2500/comments/commentRss/150758.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangfeng2500/services/trackbacks/150758.html</trackback:ping><description><![CDATA[众所周知，TCP是面向字节流的协议，而UDP是面向数据报的，我一直不是很明白这两者之间的关系，今天写了个小程序才发现了这个问题。<br />本来是想测试一下select是不是阻塞的，也就是说看看select在其中的某个描述符可用，并且正进行处理时，如果又有描述符活动，select会不会丢失一些数据 
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">问个问题：使用select做tcp和udp的客户端，想看一下如果select后处理的时间较长，那这段时间里面描述符的改变会不会被收到！<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />tcp&nbsp;server:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;select(..);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;<br /><img id="Codehighlighter1_129_248_Open_Image" onclick="this.style.display='none'; Codehighlighter1_129_248_Open_Text.style.display='none'; Codehighlighter1_129_248_Closed_Image.style.display='inline'; Codehighlighter1_129_248_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_129_248_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_129_248_Closed_Text.style.display='none'; Codehighlighter1_129_248_Open_Image.style.display='inline'; Codehighlighter1_129_248_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_129_248_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_129_248_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(FD_ISET(sockfd,</span><span style="color: #000000">&amp;</span><span style="color: #000000">readfd))<br /><img id="Codehighlighter1_168_242_Open_Image" onclick="this.style.display='none'; Codehighlighter1_168_242_Open_Text.style.display='none'; Codehighlighter1_168_242_Closed_Image.style.display='inline'; Codehighlighter1_168_242_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_168_242_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_168_242_Closed_Text.style.display='none'; Codehighlighter1_168_242_Open_Image.style.display='inline'; Codehighlighter1_168_242_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_168_242_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_168_242_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recvfrom()..<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="color: #000000">3</span><span style="color: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />tcp&nbsp;client:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #000000">1</span><span style="color: #000000">)<br /><img id="Codehighlighter1_276_318_Open_Image" onclick="this.style.display='none'; Codehighlighter1_276_318_Open_Text.style.display='none'; Codehighlighter1_276_318_Closed_Image.style.display='inline'; Codehighlighter1_276_318_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_276_318_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_276_318_Closed_Text.style.display='none'; Codehighlighter1_276_318_Open_Image.style.display='inline'; Codehighlighter1_276_318_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;</span><span id="Codehighlighter1_276_318_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_276_318_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不停的发送数据；&nbsp;数据为:qwer<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="color: #000000">1</span><span style="color: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span></div>tcp的这个程序运行时，client：1111、1111、1111、1111、1111、1111、1111、1111、1111。1111是每次send完成后printf的一条输出，隔一秒发送一条<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;&nbsp;&nbsp;&nbsp;&nbsp;server：qwer/qwerqwer/qwerqwerqwer/qwerqwerqwer/&nbsp; 后面都是三个一次 server是sockfd有数据时，取一次数据，但是sleep(3)。<br />TCP的这个程序发现即使select延时了，数据也没有丢失，我想应该是select内核中会有一个缓冲或者队列之类的保存下了sockfd有活动来的这个状态<br />程序改为udp时，输出是:qwer/qwer/qwer/qwer/qwer/....也没有丢失数据，但是每次只输出一串"qwer"<br />这是这个程序中，tcp服务器和udp服务器的最显著的区别了，为什么呢？求助后，tcp是基于字节流的，没有边界，udp是数据报，每个包之间有边界。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&#8220;TCP&nbsp;是一个面向字节流的协议&#8221;指的是数据是作为字节流提交给接受方的，没有什么内在的消息和消息边界的赶来。在读取数据的时候用户也不知道一个给定的的读调用将会返回多少字节。面向无连接，是指每一个数据包和另外的数据包都是独立地处理，而面向连接的协议，状态信息是由协议负责维护与实现的。&nbsp;无连接的每个数据包通常称为&nbsp;&nbsp;&nbsp;数据报(Datagram)，而面向连接的是字节流。<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;所谓面向字节流就是&#8220;字节就是字节&#8221;，也就是说对TCP协议而言，字节没有特别含义，一律平等。所有字节的含义只有应用知道，所以TCP里也就没有message边界，收发双方的发送和接收次数也不一定相同。<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />http:</span><span style="color: #008000">//</span><span style="color: #008000">topic.csdn.net/t/20040408/00/2938561.html</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">QQ上问的<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">]&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">34</span><span style="color: #000000">:</span><span style="color: #000000">21</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />嗯<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">]&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">34</span><span style="color: #000000">:</span><span style="color: #000000">42</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />udp是一个包发送的<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />飛雪一刀&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">34</span><span style="color: #000000">:</span><span style="color: #000000">44</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />为什么呢？<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">]&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">34</span><span style="color: #000000">:</span><span style="color: #000000">46</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />tcp是流<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />飛雪一刀&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">34</span><span style="color: #000000">:</span><span style="color: #000000">53</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />这就是字节流和数据包的区别么？<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />飛雪一刀&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">34</span><span style="color: #000000">:</span><span style="color: #000000">57</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />报<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">35</span><span style="color: #000000">:</span><span style="color: #000000">22</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />tcp一帧数据可以分多个包发<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />飛雪一刀&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">35</span><span style="color: #000000">:</span><span style="color: #000000">57</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />是否分不确定是吧？<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">]&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">36</span><span style="color: #000000">:</span><span style="color: #000000">13</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />udp一包就一帧数据,但是每包数据最好不能大于1024<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">]&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">36</span><span style="color: #000000">:</span><span style="color: #000000">20</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />tcp自己处理<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">]&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">36</span><span style="color: #000000">:</span><span style="color: #000000">41</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />udp没有重传，丢了就丢了<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />飛雪一刀&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">36</span><span style="color: #000000">:</span><span style="color: #000000">52</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />是不是说套接口缓冲区中如果有数据，并且recv()的length能够装下的话，不管是分几次发送的，都会接受<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />飛雪一刀&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">37</span><span style="color: #000000">:</span><span style="color: #000000">31</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />而udp的每个包之间有识别<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">37</span><span style="color: #000000">:</span><span style="color: #000000">32</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />tcp是自己分包<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">]&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">37</span><span style="color: #000000">:</span><span style="color: #000000">51</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />udp人为分包<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />飛雪一刀&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">37</span><span style="color: #000000">:</span><span style="color: #000000">53</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />是发送的时候分包还是接收的时候呢？<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />飛雪一刀&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">37</span><span style="color: #000000">:</span><span style="color: #000000">56</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />tcp的话<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">]&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">38</span><span style="color: #000000">:</span><span style="color: #000000">14</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />按照发的顺序接受<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">]&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">38</span><span style="color: #000000">:</span><span style="color: #000000">43</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />在接受一方要自己按格式组成一个完整的帧<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />飛雪一刀&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">38</span><span style="color: #000000">:</span><span style="color: #000000">46</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />我tcp发送的时候qwer字符串是分多次发送的，每次间隔一秒<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />飛雪一刀&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">39</span><span style="color: #000000">:</span><span style="color: #000000">13</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />但tcp服务器好像一下就把3次的数据都接收了<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">]&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">39</span><span style="color: #000000">:</span><span style="color: #000000">36</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />操作系统内核有一个buf<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">]&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">40</span><span style="color: #000000">:</span><span style="color: #000000">13</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />都放在这个buf中<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />飛雪一刀&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">40</span><span style="color: #000000">:</span><span style="color: #000000">47</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />恩，udp的数据也是存档在buf中啊<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">]&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">41</span><span style="color: #000000">:</span><span style="color: #000000">20</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />那是操作系统控制的<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />飛雪一刀&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">41</span><span style="color: #000000">:</span><span style="color: #000000">22</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />服务端读取的时候是一个包一个包取得吧？包就是每次sendto就一个包吧？<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">](&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">41</span><span style="color: #000000">:</span><span style="color: #000000">49</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />嗯<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />飛雪一刀&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">42</span><span style="color: #000000">:</span><span style="color: #000000">29</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />哦，谢谢啊<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div><br /><br /> <img src ="http://www.cppblog.com/wangfeng2500/aggbug/150758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangfeng2500/" target="_blank">赞劲小子</a> 2011-07-12 15:02 <a href="http://www.cppblog.com/wangfeng2500/articles/150758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Makefile的multiple definition of错误</title><link>http://www.cppblog.com/wangfeng2500/articles/149493.html</link><dc:creator>赞劲小子</dc:creator><author>赞劲小子</author><pubDate>Sun, 26 Jun 2011 06:03:00 GMT</pubDate><guid>http://www.cppblog.com/wangfeng2500/articles/149493.html</guid><wfw:comment>http://www.cppblog.com/wangfeng2500/comments/149493.html</wfw:comment><comments>http://www.cppblog.com/wangfeng2500/articles/149493.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangfeng2500/comments/commentRss/149493.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangfeng2500/services/trackbacks/149493.html</trackback:ping><description><![CDATA[<span style="font-size: 12px;">今天Makefile的时候总是提示multiple definition of 的错误，也就是变量重复定义啦,可是我的程序里明明没有多个定义，搞不清楚怎么回事，我把头文件全部用头文件保护符给限定了，可是还是没用，最后在网上搜了一下，解决方法其实很简单，就是把编译出错提示最先定义的地方使用static限定词，限定为仅限在本文件中使用，就ok了</span><img src ="http://www.cppblog.com/wangfeng2500/aggbug/149493.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangfeng2500/" target="_blank">赞劲小子</a> 2011-06-26 14:03 <a href="http://www.cppblog.com/wangfeng2500/articles/149493.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>系统V共享内存过程中须注意问题</title><link>http://www.cppblog.com/wangfeng2500/articles/148735.html</link><dc:creator>赞劲小子</dc:creator><author>赞劲小子</author><pubDate>Wed, 15 Jun 2011 12:10:00 GMT</pubDate><guid>http://www.cppblog.com/wangfeng2500/articles/148735.html</guid><wfw:comment>http://www.cppblog.com/wangfeng2500/comments/148735.html</wfw:comment><comments>http://www.cppblog.com/wangfeng2500/articles/148735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangfeng2500/comments/commentRss/148735.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangfeng2500/services/trackbacks/148735.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #595959; font-family: Arial; font-size: 12px; letter-spacing: 1px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="color: #595959; font-family: Arial; letter-spacing: 1px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-size: 12pt; ">1.指定共享文件：如/etc/shm/shmtest&nbsp;&nbsp;此处shmtest需要自己建立；<br /></span></span><span class="Apple-style-span" style="color: #595959; font-family: Arial; font-size: 12px; letter-spacing: 1px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><p style="line-height: normal; "><span style="font-size: 12pt; ">2.创建IPC通讯ID值：key=ftok(char&nbsp;*&nbsp;fname,int&nbsp;id)，fname就时你指定的文件名，id是子序号，值为1-255之间。</span></p><p style="line-height: normal; "><span style="font-size: 12pt; ">3.shmget 获取shm_id：shm_id&nbsp;=&nbsp;shmget(key,4194304,IPC_CREAT);此处需注意：4194304为你所分配的共享内存的 大小，单位为Byte，这里分配了4M，这个大小在你第 &nbsp; &nbsp; &nbsp;一次分配后，即运行shmget后，没有删除这个shmget之前就不不能增大了，只能改小，如果 你在未删除shm_id之前，将此处内存改大，编译会通过，但是在运行时会报错： &nbsp; &nbsp; &nbsp; &nbsp;shmget&nbsp;error:&nbsp;Invalid&nbsp;argument。因而， 若需要修改大小（增大内存），最好在shmat后增加一句删除shm_id的语句：shmctl(shm_id,IPC_RMID,0);这样每次都是申 请的 &nbsp; &nbsp; &nbsp;新的。若你不想删除shm_id而又想扩大共享内存的话，可以修改ftok中的id参数，这样会得到不同的key，也相当于重新申请了一个 shm_id，而原来的shm_id会一直存在直到 &nbsp; &nbsp; &nbsp;reboot。</span></p><p style="line-height: normal; "><span style="font-size: 12pt; ">4.读写操作中ftok对同一指定文件须使用相同的id，这样所得到的key才是相同的，不然会出现如下错误：shmget&nbsp;error:&nbsp;Invalid&nbsp;argument。</span></p><p style="line-height: normal; "><span style="font-size: 12pt; ">&nbsp;&nbsp;&nbsp; 第一条很重要。这个文件确实需要自己来创建。我在做这块的一个小测试的时候没手动在磁盘的这个路径下穿件文件，也没在程序里创建shmtes这个文件，结 果在程序运行的时候在出错处理中就perror出了错误。但是我写的一个简单的测试程序运行结果还对，原因我不是很清楚。忘高手指点！！</span></p><p style="line-height: normal; "><span style="font-size: 12pt; ">&nbsp;&nbsp; &nbsp;剩下的几点没什么好说的了，上面已经很详细了！找个测试程序手动的编辑一下各种问题都会暴漏！出去面试的哥们，谁要被问到进程间通信方式的问题的时候，可别光说管道和socket了，消息队列和共享内存使他们想要的！</span></p></span><img src ="http://www.cppblog.com/wangfeng2500/aggbug/148735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangfeng2500/" target="_blank">赞劲小子</a> 2011-06-15 20:10 <a href="http://www.cppblog.com/wangfeng2500/articles/148735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu文件目录的不同颜色代表什么意思</title><link>http://www.cppblog.com/wangfeng2500/articles/148027.html</link><dc:creator>赞劲小子</dc:creator><author>赞劲小子</author><pubDate>Fri, 03 Jun 2011 12:25:00 GMT</pubDate><guid>http://www.cppblog.com/wangfeng2500/articles/148027.html</guid><wfw:comment>http://www.cppblog.com/wangfeng2500/comments/148027.html</wfw:comment><comments>http://www.cppblog.com/wangfeng2500/articles/148027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangfeng2500/comments/commentRss/148027.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangfeng2500/services/trackbacks/148027.html</trackback:ping><description><![CDATA[<div id="app-share-content">蓝色代表目录<br />绿色代表可执行文件<br />红色表示压缩文件<br />浅蓝色表示链接文件<br />灰色表示其他文件<br />红色闪烁表示链接的文件有问题了<br />黄色表示设备文件 </div><img src ="http://www.cppblog.com/wangfeng2500/aggbug/148027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangfeng2500/" target="_blank">赞劲小子</a> 2011-06-03 20:25 <a href="http://www.cppblog.com/wangfeng2500/articles/148027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.关于硬链接和软连接（符号链接）的区别</title><link>http://www.cppblog.com/wangfeng2500/articles/145983.html</link><dc:creator>赞劲小子</dc:creator><author>赞劲小子</author><pubDate>Sun, 08 May 2011 15:01:00 GMT</pubDate><guid>http://www.cppblog.com/wangfeng2500/articles/145983.html</guid><wfw:comment>http://www.cppblog.com/wangfeng2500/comments/145983.html</wfw:comment><comments>http://www.cppblog.com/wangfeng2500/articles/145983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangfeng2500/comments/commentRss/145983.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangfeng2500/services/trackbacks/145983.html</trackback:ping><description><![CDATA[<p align=center><strong><span>关于硬链接和软连接（符号链接）的区别</span></strong></p>
<p><span><font face="Times New Roman">&nbsp;linux</font></span><span>系统下提供</span><span><font face="Times New Roman">ln</font></span><span>指令来进行文件链接。文件链接主要分为硬链接和软链接。</span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><strong><span>硬链接</span></strong></p>
<p><span>由于</span><span><font face="Times New Roman">linux</font></span><span>下的文件是通过索引节点（</span><span><font face="Times New Roman">Inode</font></span><span>）来识别文件，硬链接可以认为是一个指针，指向文件索引节点的指针，系统并不为它重新分配</span><span><font face="Times New Roman">inode</font></span><span>。每添加一个一个硬链接，文件的链接数就加</span><span><font face="Times New Roman">1</font></span><span>。</span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span>可以用</span><span><font face="Times New Roman">ln</font></span><span>命令来建立硬链接。</span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span>语法</span><span><font face="Times New Roman">: </font></span></p>
<p><span><font face="Times New Roman">&nbsp;ln [options] existingfile newfile </font></span></p>
<p><span><font face="Times New Roman">ln [options] existingfile-list directory </font></span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span><span><font face="Times New Roman">&nbsp; </font></span></span><span>用法</span><span><font face="Times New Roman">:</font></span></p>
<p>转自：<a href="http://zqwt.012.blog.163.com/blog/static/120446842010315111759137/">http://zqwt.012.blog.163.com/blog/static/120446842010315111759137/</a><span><br>第一种</span><span><font face="Times New Roman">:</font></span><span>为&#8221;</span><span><font face="Times New Roman">existingfile</font></span><span>&#8221;创建硬链接</span><span><font face="Times New Roman">,</font></span><span>文件名为&#8221;</span><span><font face="Times New Roman">newfile</font></span><span>&#8221;。</span></p>
<p><span>第二种</span><span><font face="Times New Roman">:</font></span><span>在&#8221;</span><span><font face="Times New Roman">directory</font></span><span>&#8221;目录中</span><span><font face="Times New Roman">,</font></span><span>为</span><font face="Times New Roman"> </font><span>&#8221;</span><span><font face="Times New Roman">existingfile-list</font></span><span>&#8221;中包含的所有文件创建一个同名的硬链接。常用可选</span><span><font face="Times New Roman">[options] </font></span><span>&#8211;</span><span><font face="Times New Roman">f </font></span><span>无论&#8221;</span><span><font face="Times New Roman">newfile</font></span><span>&#8221;存在与否</span><span><font face="Times New Roman">,</font></span><span>都创建链接。</span><span><font face="Times New Roman">-n </font></span><span>如果&#8221;</span><span><font face="Times New Roman">newfile</font></span><span>&#8221;已存在</span><span><font face="Times New Roman">,</font></span><span>就不创建链接。</span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span><span><font face="Times New Roman">&nbsp; </font></span></span><span>例子：</span></p>
<p><span><font face="Times New Roman">$ ls &#8211;il</font></span></p>
<p><span><font face="Times New Roman">13058 -rwx - - - - - - 1 longcheng longcheng 48 8</font></span><span>月</span><span><font face="Times New Roman"> 5 16:38 file1</font></span></p>
<p><span><font face="Times New Roman">13059 -rwx - - - - - - 1 longcheng longcheng 57 8</font></span><span>月</span><span><font face="Times New Roman"> 5 16:40 file2</font></span></p>
<p><span><font face="Times New Roman">$ ln file2 file2hard</font></span></p>
<p><span><font face="Times New Roman">$ ls &#8211;il</font></span></p>
<p><span><font face="Times New Roman">13058 -rwx - - - - - - 1 longcheng longcheng 48 8</font></span><span>月</span><span><font face="Times New Roman"> 5 16:38 file1</font></span></p>
<p><span><font face="Times New Roman">13059 -rwx - - - - - - 2 longcheng longcheng 57 8</font></span><span>月</span><span><font face="Times New Roman"> 5 16:40 file2</font></span></p>
<p><span><font face="Times New Roman">13059 -rwx - - - - - - 2 longcheng longcheng 57 8</font></span><span>月</span><span><font face="Times New Roman"> 5 16:40 file2hard </font></span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span>注意在创建链接前</span><span><font face="Times New Roman">,file2</font></span><span>显示的链接数目为</span><span><font face="Times New Roman">1,</font></span><span>创建链接后</span></p>
<p><span><font face="Times New Roman">(1) file2</font></span><span>和</span><span><font face="Times New Roman">file1hard</font></span><span>的链接数目都为</span><span><font face="Times New Roman">2;</font></span></p>
<p><span><font face="Times New Roman">(2) file2</font></span><span>和</span><span><font face="Times New Roman">file1hard</font></span><span>在</span><span><font face="Times New Roman">inode</font></span><span>号是一样的</span><span><font face="Times New Roman">;</font></span></p>
<p><span><font face="Times New Roman">(3) file2</font></span><span>和</span><span><font face="Times New Roman">file1hard</font></span><span>显示的文件大小也是一样。</span></p>
<p><span>可见进行了</span><span><font face="Times New Roman">ln</font></span><span>命令的操作结果：</span><span><font face="Times New Roman">file2</font></span><span>和</span><span><font face="Times New Roman">file1hard</font></span><span>是同一个文件的两个名字，它们具有同样的索引节点号和文件属性，建立文件</span><span><font face="Times New Roman">file2</font></span><span>的硬链接，就是为</span><span><font face="Times New Roman">file2</font></span><span>的文件索引节点在当前目录上建立一个新指针。</span></p>
<p><span>你可以删除其中任何一个</span><span><font face="Times New Roman">,</font></span><span>如</span><span><font face="Times New Roman">rm file2 ,</font></span><span>每次只会删除一个指针，链接数同时减一</span><span><font face="Times New Roman">, </font></span><span>只有将所有指向文件内容的指针</span><span><font face="Times New Roman">,</font></span><span>也即链接数减为</span><span><font face="Times New Roman">0</font></span><span>时，内核才会把文件内容从磁盘上删除。</span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span>硬链接缺点：</span></p>
<p><span>尽管硬链接节省空间，也是</span><span><font face="Times New Roman">Linux</font></span><span>系统整合文件系统的传统方式，但是存在以下不足之处：</span></p>
<p><span>（</span><span><font face="Times New Roman">1</font></span><span>）不可以在不同文件系统的文件间建立链接；</span></p>
<p><span>（</span><span><font face="Times New Roman">2</font></span><span>）只有超级用户才可以为目录创建硬链接。</span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><strong><span>软链接（符号链接）：</span></strong></p>
<p><span>软链接克服了硬链接的不足，没有任何文件系统的限制，任何用户可以创建指向目录的符号链接。因而现在更为广泛使用，它具有更大的灵活性，甚至可以跨越不同机器、不同网络对文件进行链接。</span><span><font face="Times New Roman"> </font></span></p>
<p><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>如果给</span><span><font face="Times New Roman">ln</font></span><span>命令加上</span><span><font face="Times New Roman">- s</font></span><span>选项，则建立软链接。如果</span><span><font face="Times New Roman">[</font></span><span>链接名</span><span><font face="Times New Roman">]</font></span><span>已经存在但不是目录，将不做链接。</span><span><font face="Times New Roman">[</font></span><span>链接名</span><span><font face="Times New Roman">]</font></span><span>可以是任何一个文件名（可包含路径），也可以是一个目录，并且允许它与&#8220;目标&#8221;不在同一个文件系统中。如果</span><span><font face="Times New Roman">[</font></span><span>链接名</span><span><font face="Times New Roman">]</font></span><span>是一个已经存在的目录，系统将在该目录下建立一个或多个与&#8220;目标&#8221;同名的文件，此新建的文件实际上是指向原&#8220;目标&#8221;的符号链接文件。</span><span><font face="Times New Roman"> </font></span></p>
<p><span><span><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span>例子：</span></p>
<p><span><font face="Times New Roman">$ ls -il</font></span></p>
<p><span><font face="Times New Roman">13058 -rwx - - - - - - 1 longcheng longcheng 48 8</font></span><span>月</span><span><font face="Times New Roman"> 5 16:38 file1</font></span></p>
<p><span><font face="Times New Roman">13059 -rwx - - - - - - 2 longcheng longcheng 57 8</font></span><span>月</span><span><font face="Times New Roman"> 5 16:40 file2</font></span></p>
<p><span><font face="Times New Roman">13059 -rwx - - - - - - 2 longcheng longcheng 57 8</font></span><span>月</span><span><font face="Times New Roman"> 5 16:40 file2hard</font></span></p>
<p><span><font face="Times New Roman">$ln &#8211;s file1 file1soft</font></span></p>
<p><span><font face="Times New Roman">$ls -il</font></span></p>
<p><span><font face="Times New Roman">13058 -rwx - - - - - - 1 longcheng longcheng 48 8</font></span><span>月</span><span><font face="Times New Roman"> 5 16:38 file1</font></span></p>
<p><span><font face="Times New Roman">13059 -rwx - - - - - - 2 longcheng longcheng 57 8</font></span><span>月</span><span><font face="Times New Roman"> 5 16:40 file2</font></span></p>
<p><span><font face="Times New Roman">13059 -rwx - - - - - - 2 longcheng longcheng 57 8</font></span><span>月</span><span><font face="Times New Roman"> 5 16:40 file2hard</font></span></p>
<p><span><font face="Times New Roman">13061 lrwxrwxrwx 1 longcheng longcheng 5 8</font></span><span>月</span><span><font face="Times New Roman"> 5 16:58 file1soft-&gt;file1 </font></span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span>总之，建立软链接就是建立了一个新文件，所以要占用一些空间，而硬链接虽然和源文件大小一样，但实际上并不额外占用空间。当访问软链接文件时，系统就会发现他是个软链接文件，它读取软链接文件找到真正要访问的文件。</span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span>软链接缺点：</span></p>
<p><span>因为软链接文件包含有原文件的路径信息，所以当原文件从一个目录下移到其他目录中，再访问链接文件，系统就找不到了，而硬链接就没有这个缺陷，你想怎么移就怎么移；还有就是软连接需要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。</span></p>
<p><span><font face="Times New Roman">&nbsp;</font></span></p>
<p><span>软链接与硬链接，区别不仅仅是在概念上，在实现上也是不同的。</span></p>
<p><span>两者区别：</span></p>
<p><span><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>对于硬链接，原文件和硬链接文件公用一个</span><span><font face="Times New Roman">inode</font></span><span>号，这说明他们是同一个文件，而对于软链接，原文件和软链接文件拥有不同的</span><span><font face="Times New Roman">inode</font></span><span>号，表明他们是两个不同的文件；</span></p>
<p><span><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>在文件属性上软链接明确写出了是链接文件，而硬链接没有写出来，因为在本质上硬链接文件和原文件是完全平等关系；</span></p>
<p><span><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>链接数目是不一样的，软链接的链接数目不会增加；</span></p>
<p><span><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>文件大小是不一样的，硬链接文件显示的大小是跟原文件是一样的，因为是等同的嘛，而这里软链接显示的大小与原文件就不同了，</span><span><font face="Times New Roman">file1</font></span><span>大小是</span><span><font face="Times New Roman">48B</font></span><span>，而</span><span><font face="Times New Roman">file1soft</font></span><span>是</span><span><font face="Times New Roman">5B</font></span><span>，这里面的</span><span><font face="Times New Roman">5</font></span><span>实际上就是&#8220;</span><span><font face="Times New Roman">file1</font></span><span>&#8221;的大小。</span></p>
<img src ="http://www.cppblog.com/wangfeng2500/aggbug/145983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangfeng2500/" target="_blank">赞劲小子</a> 2011-05-08 23:01 <a href="http://www.cppblog.com/wangfeng2500/articles/145983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>perror函数,strerror函数,errno </title><link>http://www.cppblog.com/wangfeng2500/articles/145403.html</link><dc:creator>赞劲小子</dc:creator><author>赞劲小子</author><pubDate>Sat, 30 Apr 2011 07:26:00 GMT</pubDate><guid>http://www.cppblog.com/wangfeng2500/articles/145403.html</guid><wfw:comment>http://www.cppblog.com/wangfeng2500/comments/145403.html</wfw:comment><comments>http://www.cppblog.com/wangfeng2500/articles/145403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangfeng2500/comments/commentRss/145403.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangfeng2500/services/trackbacks/145403.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 12pt">#include &lt;stdio.h&gt; // void perror(const char *msg);<br>#include &lt;string.h&gt; // char *strerror(int errnum);<br>#include &lt;errno.h&gt; //errno</p>
<p style="FONT-SIZE: 12pt">errno 是错误代码，在 errno.h头文件中；<br>perror是错误输出函数，输出格式为：msg:errno对应的错误信息(加上一个换行符)；<br>strerror 是通过参数 errnum （就是errno），返回对应的错误信息。</p>
<p style="FONT-SIZE: 12pt">以下是测试程序：</p>
<p style="FONT-SIZE: 12pt">--------------------------------------------------------------------<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;p_str_error.c<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;perror&nbsp;,&nbsp;strerror&nbsp;函数&nbsp;,&nbsp;errno&nbsp;测试</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdlib.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">errno.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv[])<br><img id=Codehighlighter1_165_456_Open_Image onclick="this.style.display='none'; Codehighlighter1_165_456_Open_Text.style.display='none'; Codehighlighter1_165_456_Closed_Image.style.display='inline'; Codehighlighter1_165_456_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_165_456_Closed_Image onclick="this.style.display='none'; Codehighlighter1_165_456_Closed_Text.style.display='none'; Codehighlighter1_165_456_Open_Image.style.display='inline'; Codehighlighter1_165_456_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_165_456_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_165_456_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;FILE&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">fp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">buf;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;(fp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;fopen(argv[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">],&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">r</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;NULL)<br><img id=Codehighlighter1_233_350_Open_Image onclick="this.style.display='none'; Codehighlighter1_233_350_Open_Text.style.display='none'; Codehighlighter1_233_350_Closed_Image.style.display='inline'; Codehighlighter1_233_350_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_233_350_Closed_Image onclick="this.style.display='none'; Codehighlighter1_233_350_Closed_Text.style.display='none'; Codehighlighter1_233_350_Open_Image.style.display='inline'; Codehighlighter1_233_350_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_233_350_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_233_350_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;perror(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">perror</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;好方便</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;errno&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">strerror:&nbsp;%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;strerror(errno));&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">转换错误码为对应的错误信息</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;exit(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;perror(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">perror</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;errno&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">13</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">strerror:&nbsp;%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;strerror(errno));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;fclose(fp);&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p style="FONT-SIZE: 12pt"><br>--------------------------------------------------------------------<br>输入一个存在的文件名，如：./a.out 111</p>
<p style="FONT-SIZE: 12pt">open失败则会输出：<br>perror: No such file or directory<br>strerror: Cannot allocate memory</p>
<p style="FONT-SIZE: 12pt">open成功则会输出：<br>perror: Success<br>strerror: Permission denied</p>
<p style="FONT-SIZE: 12pt">很明显，perror信息是由 perror函数输出的了，第二行是 strerror通过将 errno 轮换成对应的错误信息打印出来。</p>
<img src ="http://www.cppblog.com/wangfeng2500/aggbug/145403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangfeng2500/" target="_blank">赞劲小子</a> 2011-04-30 15:26 <a href="http://www.cppblog.com/wangfeng2500/articles/145403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>stdin和STDIN_FILENO区别</title><link>http://www.cppblog.com/wangfeng2500/articles/145377.html</link><dc:creator>赞劲小子</dc:creator><author>赞劲小子</author><pubDate>Sat, 30 Apr 2011 02:39:00 GMT</pubDate><guid>http://www.cppblog.com/wangfeng2500/articles/145377.html</guid><wfw:comment>http://www.cppblog.com/wangfeng2500/comments/145377.html</wfw:comment><comments>http://www.cppblog.com/wangfeng2500/articles/145377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangfeng2500/comments/commentRss/145377.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangfeng2500/services/trackbacks/145377.html</trackback:ping><description><![CDATA[stdin是文件指针，是FILE *类型<br>STDIN_FILENO是文件描述符，是int类型的<br>stdout和STDOUT_FILENO同样。<br>所以使用fread(,,stdin)，而read(STDOUT_FILENO)，因为函数的参数类型是不一样的
<img src ="http://www.cppblog.com/wangfeng2500/aggbug/145377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangfeng2500/" target="_blank">赞劲小子</a> 2011-04-30 10:39 <a href="http://www.cppblog.com/wangfeng2500/articles/145377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>