﻿<?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++博客-格物致瑾</title><link>http://www.cppblog.com/Wealth/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 10:15:40 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 10:15:40 GMT</pubDate><ttl>60</ttl><item><title>[翻译]嵌入式C++编程准则</title><link>http://www.cppblog.com/Wealth/archive/2009/04/29/81430.html</link><dc:creator>Wealth</dc:creator><author>Wealth</author><pubDate>Wed, 29 Apr 2009 06:02:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2009/04/29/81430.html</guid><wfw:comment>http://www.cppblog.com/Wealth/comments/81430.html</wfw:comment><comments>http://www.cppblog.com/Wealth/archive/2009/04/29/81430.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Wealth/comments/commentRss/81430.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Wealth/services/trackbacks/81430.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 从C到C++的移植需要注意哪些东西？在 http://www.caravan.net/ec2plus/guide.html 上找到了这篇文章，简单的翻译了一下，以备查看。&nbsp;&nbsp;<a href='http://www.cppblog.com/Wealth/archive/2009/04/29/81430.html'>阅读全文</a><img src ="http://www.cppblog.com/Wealth/aggbug/81430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">Wealth</a> 2009-04-29 14:02 <a href="http://www.cppblog.com/Wealth/archive/2009/04/29/81430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[笔记]Qt中Layout实现思想</title><link>http://www.cppblog.com/Wealth/archive/2009/04/05/78988.html</link><dc:creator>Wealth</dc:creator><author>Wealth</author><pubDate>Sun, 05 Apr 2009 01:19:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2009/04/05/78988.html</guid><wfw:comment>http://www.cppblog.com/Wealth/comments/78988.html</wfw:comment><comments>http://www.cppblog.com/Wealth/archive/2009/04/05/78988.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Wealth/comments/commentRss/78988.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Wealth/services/trackbacks/78988.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 学习Qt中的Layout时的笔记。&nbsp;&nbsp;<a href='http://www.cppblog.com/Wealth/archive/2009/04/05/78988.html'>阅读全文</a><img src ="http://www.cppblog.com/Wealth/aggbug/78988.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">Wealth</a> 2009-04-05 09:19 <a href="http://www.cppblog.com/Wealth/archive/2009/04/05/78988.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[笔记]ppp协议</title><link>http://www.cppblog.com/Wealth/archive/2009/02/26/74947.html</link><dc:creator>Wealth</dc:creator><author>Wealth</author><pubDate>Thu, 26 Feb 2009 02:42:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2009/02/26/74947.html</guid><wfw:comment>http://www.cppblog.com/Wealth/comments/74947.html</wfw:comment><comments>http://www.cppblog.com/Wealth/archive/2009/02/26/74947.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Wealth/comments/commentRss/74947.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Wealth/services/trackbacks/74947.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: PPP协议作为一种提供在点到点链路上封装,传输网络层数据包的数据链路层协议,处于OSI参考模型的第二层。&nbsp;&nbsp;<a href='http://www.cppblog.com/Wealth/archive/2009/02/26/74947.html'>阅读全文</a><img src ="http://www.cppblog.com/Wealth/aggbug/74947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">Wealth</a> 2009-02-26 10:42 <a href="http://www.cppblog.com/Wealth/archive/2009/02/26/74947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初探数据表现层和业务逻辑层的分离</title><link>http://www.cppblog.com/Wealth/archive/2008/06/30/54977.html</link><dc:creator>Wealth</dc:creator><author>Wealth</author><pubDate>Mon, 30 Jun 2008 11:27:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/06/30/54977.html</guid><wfw:comment>http://www.cppblog.com/Wealth/comments/54977.html</wfw:comment><comments>http://www.cppblog.com/Wealth/archive/2008/06/30/54977.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/Wealth/comments/commentRss/54977.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Wealth/services/trackbacks/54977.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 分离数据表现形式和业务逻辑计算这两个软件部件一直在脑海孕育，但总是没有实现出来。周末以MP3播放器为例，对分离这两者做了一个初步的探索。&nbsp;&nbsp;<a href='http://www.cppblog.com/Wealth/archive/2008/06/30/54977.html'>阅读全文</a><img src ="http://www.cppblog.com/Wealth/aggbug/54977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">Wealth</a> 2008-06-30 19:27 <a href="http://www.cppblog.com/Wealth/archive/2008/06/30/54977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从wave文件的读写看程序中struct的设计</title><link>http://www.cppblog.com/Wealth/archive/2008/06/16/53507.html</link><dc:creator>Wealth</dc:creator><author>Wealth</author><pubDate>Mon, 16 Jun 2008 03:00:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/06/16/53507.html</guid><wfw:comment>http://www.cppblog.com/Wealth/comments/53507.html</wfw:comment><comments>http://www.cppblog.com/Wealth/archive/2008/06/16/53507.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/Wealth/comments/commentRss/53507.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Wealth/services/trackbacks/53507.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 字节未对齐的结构也是个潜在的缺陷。程序中设计的结构应该尽量保持字节对齐。&nbsp;&nbsp;<a href='http://www.cppblog.com/Wealth/archive/2008/06/16/53507.html'>阅读全文</a><img src ="http://www.cppblog.com/Wealth/aggbug/53507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">Wealth</a> 2008-06-16 11:00 <a href="http://www.cppblog.com/Wealth/archive/2008/06/16/53507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Qt中的new和delete</title><link>http://www.cppblog.com/Wealth/archive/2008/06/04/52128.html</link><dc:creator>Wealth</dc:creator><author>Wealth</author><pubDate>Wed, 04 Jun 2008 02:49:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/06/04/52128.html</guid><wfw:comment>http://www.cppblog.com/Wealth/comments/52128.html</wfw:comment><comments>http://www.cppblog.com/Wealth/archive/2008/06/04/52128.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Wealth/comments/commentRss/52128.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Wealth/services/trackbacks/52128.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Qt中的父类能自动删除其所有孩子在堆上分配的内存&nbsp;&nbsp;<a href='http://www.cppblog.com/Wealth/archive/2008/06/04/52128.html'>阅读全文</a><img src ="http://www.cppblog.com/Wealth/aggbug/52128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">Wealth</a> 2008-06-04 10:49 <a href="http://www.cppblog.com/Wealth/archive/2008/06/04/52128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Valgrind手册翻译</title><link>http://www.cppblog.com/Wealth/archive/2008/06/04/52118.html</link><dc:creator>Wealth</dc:creator><author>Wealth</author><pubDate>Wed, 04 Jun 2008 01:40:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/06/04/52118.html</guid><wfw:comment>http://www.cppblog.com/Wealth/comments/52118.html</wfw:comment><comments>http://www.cppblog.com/Wealth/archive/2008/06/04/52118.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Wealth/comments/commentRss/52118.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Wealth/services/trackbacks/52118.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: valgrind是一款非常优秀的代码检查工具&nbsp;&nbsp;<a href='http://www.cppblog.com/Wealth/archive/2008/06/04/52118.html'>阅读全文</a><img src ="http://www.cppblog.com/Wealth/aggbug/52118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">Wealth</a> 2008-06-04 09:40 <a href="http://www.cppblog.com/Wealth/archive/2008/06/04/52118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>fcntl函数</title><link>http://www.cppblog.com/Wealth/archive/2008/06/02/51884.html</link><dc:creator>Wealth</dc:creator><author>Wealth</author><pubDate>Mon, 02 Jun 2008 06:41:00 GMT</pubDate><guid>http://www.cppblog.com/Wealth/archive/2008/06/02/51884.html</guid><wfw:comment>http://www.cppblog.com/Wealth/comments/51884.html</wfw:comment><comments>http://www.cppblog.com/Wealth/archive/2008/06/02/51884.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Wealth/comments/commentRss/51884.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Wealth/services/trackbacks/51884.html</trackback:ping><description><![CDATA[<p>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该函数可以改变已打开的文件的性质。<br></p>
<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"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">fcntl.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_63_75_Open_Image onclick="this.style.display='none'; Codehighlighter1_63_75_Open_Text.style.display='none'; Codehighlighter1_63_75_Closed_Image.style.display='inline'; Codehighlighter1_63_75_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_63_75_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_63_75_Closed_Text.style.display='none'; Codehighlighter1_63_75_Open_Image.style.display='inline'; Codehighlighter1_63_75_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;fcntl(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;fields,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;cmd,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_63_75_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">/**/</span><span id=Codehighlighter1_63_75_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;int&nbsp;arg&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">若成功则依赖于cmd,若出错则返回-1</span></div>
<p>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第三个参数总是一个整数，与上面所示函数原型中的注释部分相对应。但是在作为记录锁用时，第三个参数则是指向一个结构的指针。<br>&nbsp;&nbsp; fcntl函数有5种功能：<br>&nbsp;&nbsp;&nbsp;&nbsp; 1.复制一个现有的描述符（cmd = F_DUPFD）.<br>&nbsp;&nbsp;&nbsp;&nbsp; 2.获得／设置文件描述符标记(cmd = F_GETFD || F_SETFD).<br>&nbsp;&nbsp;&nbsp;&nbsp; 3.获得／设置文件状态标记(cmd = F_GETFL || F_SETFL).<br>&nbsp;&nbsp;&nbsp;&nbsp; 4.获得／设置异步I/O所有权(cmd = F_GETOWN || F_SETOWN).<br>&nbsp;&nbsp;&nbsp;&nbsp; 5.获得／设置记录锁(cmd = F_GETLK, F_SETLK || F_SETLKW).</p>
<p>&nbsp;</p>
<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"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">fcntl.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">unistd.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#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></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></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">*</span><span style="COLOR: #000000">&nbsp;argv[])<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img id=Codehighlighter1_133_740_Open_Image onclick="this.style.display='none'; Codehighlighter1_133_740_Open_Text.style.display='none'; Codehighlighter1_133_740_Closed_Image.style.display='inline'; Codehighlighter1_133_740_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_133_740_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_133_740_Closed_Text.style.display='none'; Codehighlighter1_133_740_Open_Image.style.display='inline'; Codehighlighter1_133_740_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_133_740_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"></span><span id=Codehighlighter1_133_740_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;fd,&nbsp;var;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">fd&nbsp;=&nbsp;open("new",O_RDWR);</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">11</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(argc&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img id=Codehighlighter1_195_247_Open_Image onclick="this.style.display='none'; Codehighlighter1_195_247_Open_Text.style.display='none'; Codehighlighter1_195_247_Closed_Image.style.display='inline'; Codehighlighter1_195_247_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_195_247_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_195_247_Closed_Text.style.display='none'; Codehighlighter1_195_247_Open_Image.style.display='inline'; Codehighlighter1_195_247_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_195_247_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"></span><span id=Codehighlighter1_195_247_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">请输入参数，即文件名！</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((var&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;fcntl(atoi(argv[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]),&nbsp;F_GETFL,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">))&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img id=Codehighlighter1_302_363_Open_Image onclick="this.style.display='none'; Codehighlighter1_302_363_Open_Text.style.display='none'; Codehighlighter1_302_363_Closed_Image.style.display='inline'; Codehighlighter1_302_363_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_302_363_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_302_363_Closed_Text.style.display='none'; Codehighlighter1_302_363_Open_Image.style.display='inline'; Codehighlighter1_302_363_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_302_363_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"></span><span id=Codehighlighter1_302_363_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strerror(errno);<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">fcntl&nbsp;file&nbsp;error.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">&nbsp;(var&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;O_ACCMODE)<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img id=Codehighlighter1_393_591_Open_Image onclick="this.style.display='none'; Codehighlighter1_393_591_Open_Text.style.display='none'; Codehighlighter1_393_591_Closed_Image.style.display='inline'; Codehighlighter1_393_591_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_393_591_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_393_591_Closed_Text.style.display='none'; Codehighlighter1_393_591_Open_Image.style.display='inline'; Codehighlighter1_393_591_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_393_591_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"></span><span id=Codehighlighter1_393_591_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;O_RDONLY&nbsp;:&nbsp;<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Read&nbsp;only..</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;O_WRONLY&nbsp;:&nbsp;<br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Write&nbsp;only..</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;O_RDWR&nbsp;&nbsp;&nbsp;:&nbsp;<br></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Read&nbsp;wirte..</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">&nbsp;&nbsp;:&nbsp;<br></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">42</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(val&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;O_APPEND)<br></span><span style="COLOR: #008080">43</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,append</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">44</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">45</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(val&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;O_NONBLOCK)<br></span><span style="COLOR: #008080">46</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,noblocking</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">47</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">48</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">exit&nbsp;0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br></span><span style="COLOR: #008080">49</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">50</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">51</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">52</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">53</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fcntl文件锁有两种类型：建议性锁和强制性锁<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 建议性锁是这样规定的：每个使用上锁文件的进程都要检查是否有锁存在，当然还得尊重已有的锁。内核和系统总体上都坚持不使用建议性锁，它们依靠程序员遵守这个规定。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 强制性锁是由内核执行的。当文件被上锁来进行写入操作时，在锁定该文件的进程释放该锁之前，内核会阻止任何对该文件的读或写访问，每次读或写访问都得检查锁是否存在。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统默认fcntl都是建议性锁，强制性锁是非POSIX标准的。如果要使用强制性锁，要使整个系统可以使用强制性锁，那么得需要重新挂载文件系统， mount使用参数 -0 mand打开强制性锁，或者关闭已加锁文件的组执行权限并且打开该文件的set-GID权限位。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 建议性锁只在cooperating processes之间才有用，对cooperating process的理解是最重要的，它指的是会影响其它进程的进程或被别的进程所影响的进程，举两个例子：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （1）我们可以同时在两个窗口中运行同一个命令，对同一个文件进行操作，那么这两个进程就是cooperating processes；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2） cat file | sort， 那么cat和sort产生的进程就是使用了pipe的cooperating processes。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用fcntl文件锁进行I/O操作必须小心：进程在开始任何I/O操作前如何去处理锁，在对文件解锁前如何完成所有的操作，是必须考虑的。如果在设置锁之前打开文件，或者读取该锁之后关闭文件，另一个进程就可能在上锁/解锁操作和打开/关闭操作之间的几分之一秒内访问该文件。当一个进程对文件加锁后，无论它是否释放所加的锁，只要文件关闭，内核都会自动释放加在文件上的建议性锁（这也是建议性锁和强制性锁的最大区别）, 所以不要想设置建议性锁来达到永久不让别的进程访问文件的目的(强制性锁才可以)；强制性锁则对所有进程起作用。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fcntl使用三个参数 F_SETLK/F_SETLKW， F_UNLCK和F_GETLK, 来分别要求、释放、测试record locks。 record locks是对文件一部分而不是整个文件的锁，这种细致的控制使得进程更好地协作以共享文件资源。fcntl能够用于读取锁和写入锁，read lock也叫shared lock（共享锁）, 因为多个cooperating process能够在文件的同一部分建立读取锁；write lock被称为exclusive lock(排斥锁)， 因为任何时刻只能有一个cooperating process在文件的某部分上建立写入锁。如果cooperating processes对文件进行操作，那么它们可以同时对文件加read lock，在一个cooperating process加write lock之前，必须释放别的cooperating process加在该文件的read lock和wrtie lock，也就是说，对于文件只能有一个write lock存在，read lock和wrtie lock不能共存。 <br>&nbsp;<br>&nbsp;<br>&nbsp;<br></p>
<img src ="http://www.cppblog.com/Wealth/aggbug/51884.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Wealth/" target="_blank">Wealth</a> 2008-06-02 14:41 <a href="http://www.cppblog.com/Wealth/archive/2008/06/02/51884.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>