﻿<?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++博客-Onway-随笔分类-使用说明</title><link>http://www.cppblog.com/Onway/category/18209.html</link><description>我是一只菜菜菜菜鸟...</description><language>zh-cn</language><lastBuildDate>Mon, 13 Feb 2017 05:39:05 GMT</lastBuildDate><pubDate>Mon, 13 Feb 2017 05:39:05 GMT</pubDate><ttl>60</ttl><item><title>认识matplotlib</title><link>http://www.cppblog.com/Onway/archive/2017/02/11/214675.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Sat, 11 Feb 2017 07:12:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2017/02/11/214675.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/214675.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2017/02/11/214675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/214675.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/214675.html</trackback:ping><description><![CDATA[<strong style="color: #454545; font-family: Helvetica; font-size: 12px;"><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">一，</span><span style="font-size: 14pt;">matplotlib</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">是什么</span></strong><br />
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;">在</span><span style="line-height: normal; font-family: Helvetica; font-size: 14pt;">python</span><span style="font-size: 14pt;">中用于数据库可视化的</span><span style="line-height: normal; font-family: Helvetica; font-size: 14pt;">2D</span><span style="font-size: 14pt;">绘图库。</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;"><br />
</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;"><strong>二，安装</strong></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #e4af09;"><span style="font-size: 14pt;"><a href="http://matplotlib.org/users/installing.html">http://matplotlib.org/users/installing.html</a></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;"><br />
</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;"><strong>三，交互模式与非交互模式</strong></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><strong><span style="line-height: normal; font-family: Helvetica; font-size: 14pt;">1</span><span style="font-size: 14pt;">，非交互模式</span></strong></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #454545;"><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">在</span><span style="font-size: 14pt;">python shell</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">里面执行</span></p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff; font-size: 12pt;">import</span><span style="font-size: 12pt;">&nbsp;matplotlib.pyplot&nbsp;as&nbsp;plt</span><br />
<span style="font-size: 12pt;">plt.plot([</span><span style="font-size: 12pt;">1</span><span style="font-size: 12pt;">,&nbsp;</span><span style="font-size: 12pt;">2</span><span style="font-size: 12pt;">])</span><br />
<span style="font-size: 12pt;">plt.show()</span></div>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;">执行</span><span style="line-height: normal; font-family: Helvetica; font-size: 14pt;">show</span><span style="font-size: 14pt;">之后会打开一个</span><span style="line-height: normal; font-family: Helvetica; font-size: 14pt;">GUI</span><span style="font-size: 14pt;">窗口显示，同时交互命令会阻塞。</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #454545;"><img src="http://www.cppblog.com/images/cppblog_com/onway/show_cmd.png" width="400" height="314" alt="" /><br />
</p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #454545;"><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;"><br />
</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><strong><span style="line-height: normal; font-family: Helvetica; font-size: 14pt;">2</span><span style="font-size: 14pt;">，交互模式</span></strong></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;">matplotlib.is_interactive()可以查看当前是否在交互模式；</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;">matplotlib.pyplot.ion()用于打开交互模式；</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;">matplotlib.pyplot.ioff()用于关闭交互模式；</span></p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff; font-size: 12pt;">import</span><span style="font-size: 12pt;">&nbsp;matplotlib.pyplot&nbsp;as&nbsp;plt</span><br />
<span style="font-size: 12pt;">plt.ion()</span><br />
<span style="font-size: 12pt;">plt.plot([</span><span style="font-size: 12pt;">1</span><span style="font-size: 12pt;">,&nbsp;</span><span style="font-size: 12pt;">2])</span></div>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;">执行</span><span style="line-height: normal; font-family: Helvetica; font-size: 14pt;">plot</span><span style="font-size: 14pt;">之后打开了一个</span><span style="line-height: normal; font-family: Helvetica; font-size: 14pt;">GUI</span><span style="font-size: 14pt;">窗口，交互命令没有阻塞，继续执行：</span></p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="font-size: 12pt;">plt.plot([2</span><span style="font-size: 12pt;">,&nbsp;</span><span style="font-size: 12pt;">3])</span></div>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;">可以看到在窗口里面再画了一条线。</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;">也就是在非交互模式，需要一次画好再调用</span><span style="line-height: normal; font-family: Helvetica; font-size: 14pt;">show</span><span style="font-size: 14pt;">显示；而交互模式在每次绘制后都能实时看到效果。</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545; min-height: 17px;"><br />
</p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #454545;"><strong><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">3，ipython的</span><span style="font-size: 14pt;">magic command</span>&nbsp;</strong></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;">在ipython的%matplotlib也可以打开交互模式。</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;">在交互模式中如果某些修改没有自动刷新，可以调用matplotlib.pyplot.draw()刷新。</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545; min-height: 17px;"><br />
</p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;"><strong>四，在jupyter notebook中使用matplotlib</strong></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;"><strong>1，%matplotlib</strong></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;">以交互模式打开独立的GUI窗口，对同一个figure的绘制都自动刷新到对应的GUI窗口。</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;"><strong><br />
</strong></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;"><strong>2，％matplotlib notebook</strong></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;">同%matplotlib，只是会将GUI窗口嵌入到cell的输出。</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><img src="http://www.cppblog.com/images/cppblog_com/onway/matplotlib_notebook.png" width="400" height="302" alt="" /><br />
</p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;"><strong><br />
</strong></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;"><strong>3，%matplotlib inline</strong></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;">将绘制的图转换为静态图片嵌入到cell的输出。在不同的cell进行绘制效果不会叠加。</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;"><img src="http://www.cppblog.com/images/cppblog_com/onway/matplotlib_inline.png" width="400" height="269" alt="" /><br />
</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;"><br />
</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #454545; min-height: 14px;"><br />
</p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><strong><span style="font-size: 14pt;">五，</span><span style="line-height: normal; font-family: Helvetica; font-size: 14pt;">figure</span><span style="font-size: 14pt;">的各个组成部分</span></strong></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #e4af09;"><span style="font-size: 14pt;"><a href="http://matplotlib.org/faq/usage_faq.html#parts-of-a-figure">http://matplotlib.org/faq/usage_faq.html#parts-of-a-figure</a></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #454545;"><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;"><br />
</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #454545;"><strong><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">六，</span><span style="font-size: 14pt;">matplotlib</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">的两种绘图接口</span></strong></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #454545;"><strong><span style="font-size: 14pt;">1</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">，</span><span style="font-size: 14pt;">matlab</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">风格接口</span></strong></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #454545;"><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">所有的</span><span style="font-size: 14pt;">plt</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">命令都会应用到自动创建的</span><span style="font-size: 14pt;">&#8220;</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">当前</span><span style="font-size: 14pt;">&#8221;</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">的</span><span style="font-size: 14pt;">figure</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">和</span><span style="font-size: 14pt;">axes</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">对象。使用</span><span style="font-size: 14pt;">plt.gcf</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">和</span><span style="font-size: 14pt;">plt.gca</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">获取</span><span style="font-size: 14pt;">&#8220;</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">当前</span><span style="font-size: 14pt;">&#8221;</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">的</span><span style="font-size: 14pt;">figure</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">和</span><span style="font-size: 14pt;">axes</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">。</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #454545;"><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">调用</span><span style="font-size: 14pt;">plt.plot([1, 2])</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">即绘制到自动创建的</span><span style="font-size: 14pt;">figure</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">和</span><span style="font-size: 14pt;">axes</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">。</span></p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="font-size: 12pt;">plt.plot([1</span><span style="font-size: 12pt;">,&nbsp;</span><span style="font-size: 12pt;">2</span><span style="font-size: 12pt;">])</span><br />
<span style="font-size: 12pt;">plt.plot([</span><span style="font-size: 12pt;">2</span><span style="font-size: 12pt;">,&nbsp;</span><span style="font-size: 12pt;">1])</span></div>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><strong><span style="line-height: normal; font-family: Helvetica; font-size: 14pt;"><br />
</span></strong></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><strong><span style="line-height: normal; font-family: Helvetica; font-size: 14pt;">2</span><span style="font-size: 14pt;">，面向对象接口</span></strong></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;">显式获得绘制对象，在特定对象执行相应操作。</span></p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="font-size: 12pt;">fig,&nbsp;ax&nbsp;=</span><span style="font-size: 12pt;">&nbsp;plt.subplots()</span><br />
<span style="font-size: 12pt;">ax.plot([</span><span style="font-size: 12pt;">1</span><span style="font-size: 12pt;">,&nbsp;</span><span style="font-size: 12pt;">2</span><span style="font-size: 12pt;">])</span><br />
<span style="font-size: 12pt;">ax.plot([</span><span style="font-size: 12pt;">2</span><span style="font-size: 12pt;">,&nbsp;</span><span style="font-size: 12pt;">1])</span></div>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><strong><span style="line-height: normal; font-family: Helvetica; font-size: 14pt;"><br />
</span></strong></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><strong><span style="line-height: normal; font-family: Helvetica; font-size: 14pt;">3</span><span style="font-size: 14pt;">，差别</span></strong></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;">对于简单绘制两种接口的差别不大，复杂情况面向对象接口会更合适。</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #454545;"><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">另外</span><span style="font-size: 14pt;">plt</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">的很多函数都可以直接转为</span><span style="font-size: 14pt;">ax</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">的函数，例如</span><span style="font-size: 14pt;">plt.plot() -&gt; ax.plot()</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">，但某些会有差别，例如</span><span style="font-size: 14pt;">plt.xlabel() -&gt; ax.set_xlabel()</span><span style="line-height: normal; font-family: 'PingFang SC'; font-size: 14pt;">。</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #454545; min-height: 14px;"><strong style="font-size: 14pt; font-family: 'PingFang SC';"><br />
</strong></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #454545; min-height: 14px;"><strong style="font-size: 14pt; font-family: 'PingFang SC';">七，各类图形demo</strong></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #e4af09;"><span style="font-size: 14pt;"><a href="http://matplotlib.org/gallery.html">http://matplotlib.org/gallery.html</a></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;"><br />
</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;"><strong>八，API</strong></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;"><a href="http://matplotlib.org/api/index.html">http://matplotlib.org/api/index.html</a></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #454545; min-height: 14px;"><br />
</p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #454545; min-height: 14px;"><br />
</p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;"><span style="font-size: 14pt;">参考：</span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #e4af09;"><span style="color: #454545; font-size: 14pt;">1</span><span style="line-height: normal; font-family: 'PingFang SC'; color: #454545; font-size: 14pt;">，<a href="http://matplotlib.org/index.html#"><span style="line-height: normal; font-family: Helvetica; color: #e4af09; font-size: 14pt;">http://matplotlib.org/index.html#</span></a></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #e4af09;"><span style="color: #454545; font-size: 14pt;">2</span><span style="line-height: normal; font-family: 'PingFang SC'; color: #454545; font-size: 14pt;">，<a href="http://matplotlib.org/faq/usage_faq.html#what-is-interactive-mode"><span style="line-height: normal; font-family: Helvetica; color: #e4af09; font-size: 14pt;">http://matplotlib.org/faq/usage_faq.html#what-is-interactive-mode</span></a></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #e4af09;"><span style="color: #454545; font-size: 14pt;">3</span><span style="line-height: normal; font-family: 'PingFang SC'; color: #454545; font-size: 14pt;">，<a href="http://jupyter.org"><span style="line-height: normal; font-family: Helvetica; color: #e4af09; font-size: 14pt;">http://jupyter.org</span></a></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #e4af09;"><span style="color: #454545; font-size: 14pt;">4</span><span style="line-height: normal; font-family: 'PingFang SC'; color: #454545; font-size: 14pt;">，<a href="http://www.labri.fr/perso/nrougier/teaching/matplotlib/#introduction"><span style="line-height: normal; font-family: Helvetica; color: #e4af09; font-size: 14pt;">http://www.labri.fr/perso/nrougier/teaching/matplotlib/#introduction</span></a></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: 'PingFang SC'; color: #454545;">
</p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #e4af09;"><span style="color: #454545; font-size: 14pt;">5</span><span style="line-height: normal; font-family: 'PingFang SC'; color: #454545; font-size: 14pt;">，<a href="http://nbviewer.jupyter.org/github/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/04.00-Introduction-To-Matplotlib.ipynb#Two-Interfaces-for-the-Price-of-One"><span style="line-height: normal; font-family: Helvetica; color: #e4af09; font-size: 14pt;">http://nbviewer.jupyter.org/github/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/04.00-Introduction-To-Matplotlib.ipynb#Two-Interfaces-for-the-Price-of-One</span></a></span></p>
<p style="margin: 0px; font-size: 12px; line-height: normal; font-family: Helvetica; color: #e4af09;"><span style="line-height: normal; font-family: 'PingFang SC'; color: #454545; font-size: 14pt;"></span></p><img src ="http://www.cppblog.com/Onway/aggbug/214675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2017-02-11 15:12 <a href="http://www.cppblog.com/Onway/archive/2017/02/11/214675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>APUE第二章 UNIX标准化及实现</title><link>http://www.cppblog.com/Onway/archive/2015/12/08/212438.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Tue, 08 Dec 2015 14:35:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2015/12/08/212438.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/212438.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2015/12/08/212438.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/212438.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/212438.html</trackback:ping><description><![CDATA[<span style="font-size: 14pt;"> </span><div><strong><span style="font-size: 14pt;">1, 三个标准</span></strong><br /><span style="font-size: 14pt;">1.1, ISO C标准由ISO/IEC维护开发</span><br /><span style="font-size: 14pt;">最新版本是C11，共有29个标准头文件。</span><br /><br /><span style="font-size: 14pt;">1.2, POSIX是一系列由IEEE制定的标准</span><br /><span style="font-size: 14pt;">POSIX包括ISO C标准库函数。</span><br /><span style="font-size: 14pt;">POSIX标准的1988版本是IEEE 1003.1-1988，经过修改后作为IEEE Std.1003.1-1990提交ISO，成为国际标准ISO/IEC 9945-1:1990,该标准通常称为POSIX.1。</span><br /><span style="font-size: 14pt;">当前最新版本是POSIX.1-2008，由IEEE和Open Group共同开发。</span><br /><br /><span style="font-size: 14pt;">1.3, SUS是POSIX的超集，其系统接口全集称为XSI</span><br /><span style="font-size: 14pt;">The core specifications of the SUS are developed and maintained by the Austin Group, which is a joint working group of IEEE, ISO JTC 1 SC22 and The Open Group.</span><br /><span style="font-size: 14pt;">只有遵循XSI的实现才能称为UNIX系统。</span><br /><span style="font-size: 14pt;">当前的最新版本是SUSv4。</span><br /><br /><span style="font-size: 14pt;">1.4, 找到一些网址</span><br /><span style="font-size: 14pt;">C11</span><br /><a href="http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=57853">http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=57853</a><br /><br /><span style="font-size: 14pt;">POSIX.1-2008</span><br /><a href="http://pubs.opengroup.org/onlinepubs/9699919799/">http://pubs.opengroup.org/onlinepubs/9699919799/</a><br /><a href="https://standards.ieee.org/findstds/standard/1003.1-2008.html">https://standards.ieee.org/findstds/standard/1003.1-2008.html</a><br /><br /><span style="font-size: 14pt;">SUSv4</span><br /><a href="https://www2.opengroup.org/ogsys/jsp/publications/PublicationDetails.jsp?publicationid=12310">https://www2.opengroup.org/ogsys/jsp/publications/PublicationDetails.jsp?publicationid=12310</a><br /><a href="https://en.wikipedia.org/wiki/Single_UNIX_Specification#cite_note-11">https://en.wikipedia.org/wiki/Single_UNIX_Specification#cite_note-11</a><br /><br /><strong><span style="font-size: 14pt;">2, 限制</span></strong><br /><span style="font-size: 14pt;">2.1 两种限制</span><br /><span style="font-size: 14pt;">编译时限制和运行时限制。</span><br /><span style="font-size: 14pt;">编译时限制通过头文件获取；</span><br /><span style="font-size: 14pt;">不与文件或目录相关的运行时限制通过sysconf函数获取；</span><br /><span style="font-size: 14pt;">与文件或目录相关的运行时限制通过pathconf和fpathconf函数获取。</span><br /><br /><span style="font-size: 14pt;">2.2 ISO C限制</span><br /><span style="font-size: 14pt;">都是编译时限制，主要定义在&lt;limits.h&gt;里面。</span><br /><a href="http://en.cppreference.com/w/c/types/limits">http://en.cppreference.com/w/c/types/limits</a><br /><br /><span style="font-size: 14pt;">2.3 POSIX限制和XSI限制</span><br /><span style="font-size: 14pt;">书中列出的都是实现中必须支持的各种最小值，特定系统实际支持的限制值需要通过头文件或者三个函数函数获取。</span><br /><span style="font-size: 14pt;">三个函数的name参数是限制名前面加_SC_或者_PC_前缀得到。</span><br /><a href="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html">http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html</a><br /><br /><span style="font-size: 14pt;">2.4 书中代码</span><br /><span style="font-size: 14pt;"></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;If&nbsp;&nbsp;name&nbsp;&nbsp;is&nbsp;&nbsp;invalid,&nbsp;-1&nbsp;is&nbsp;returned,&nbsp;and&nbsp;errno&nbsp;is&nbsp;set&nbsp;to&nbsp;EINVAL.<br />&nbsp;*&nbsp;Otherwise,&nbsp;the&nbsp;value&nbsp;returned&nbsp;is&nbsp;the&nbsp;value&nbsp;of&nbsp;the&nbsp;system&nbsp;resource&nbsp;and&nbsp;errno&nbsp;is&nbsp;not&nbsp;changed.<br />&nbsp;*&nbsp;In&nbsp;the&nbsp;case&nbsp;of&nbsp;options,&nbsp;a&nbsp;positive&nbsp;value&nbsp;is&nbsp;returned&nbsp;if&nbsp;a&nbsp;queried&nbsp;option&nbsp;is&nbsp;available,&nbsp;and&nbsp;-1&nbsp;if&nbsp;it&nbsp;is&nbsp;not.<br />&nbsp;*&nbsp;In&nbsp;the&nbsp;case&nbsp;of&nbsp;limits,&nbsp;-1&nbsp;means&nbsp;that&nbsp;there&nbsp;is&nbsp;no&nbsp;definite&nbsp;limit.<br /></span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /><br />#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">apue.h</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />#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 />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">limits.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br />#ifdef&nbsp;OPEN_MAX<br /></span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;openmax&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;OPEN_MAX;<br /></span><span style="color: #0000FF; ">#else</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;openmax&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><br /><br /></span><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;If&nbsp;OPEN_MAX&nbsp;is&nbsp;indeterminate,&nbsp;we're&nbsp;not<br />&nbsp;*&nbsp;guaranteed&nbsp;that&nbsp;this&nbsp;is&nbsp;adequate<br />&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;OPEN_MAX_GUESS&nbsp;256</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">long</span><span style="color: #000000; "><br />open_max(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(openmax&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;first&nbsp;time&nbsp;through&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errno&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;((openmax&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sysconf(_SC_OPEN_MAX))&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(errno&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;openmax&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;OPEN_MAX_GUESS;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;it's&nbsp;indeterminate&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">sysconf&nbsp;error&nbsp;for&nbsp;_SC_OPEN_MAX</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">(openmax);<br />}</span></div><br /><strong><span style="font-size: 14pt;">3, 选项</span></strong><br /><span style="font-size: 14pt;">3.1, 选项确定方式</span><br /><span style="font-size: 14pt;">编译时选项定义在&lt;unistd.h&gt;中；</span><br /><span style="font-size: 14pt;">与文件或目录无关的选项用sysconf确定；</span><br /><span style="font-size: 14pt;">与文件或目录有关的选项用pathconf或者fpathconf确定；</span><br /><a href="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html">http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html</a><br /><br /><span style="font-size: 14pt;">3.2, 选项确定流程</span><br /><span style="font-size: 14pt;">如果符号常量未定义，</span><br /><span style="font-size: 14pt;">对_POSIX前缀的选项，将_POSIX前缀替换为_SC或_PC前缀，</span><br /><span style="font-size: 14pt;">对_XOPEN前缀的选项，在_XOPEN前面加上_SC或_PC前缀，</span><br /><span style="font-size: 14pt;">然后调用sysconf, pathconf或fpathconf函数。</span><br /><span style="font-size: 14pt;">如果符号常量已经定义，则有三种可能：</span><br /><span style="font-size: 14pt;">值为-1，不支持相应的选项；</span><br /><span style="font-size: 14pt;">值大于0，支持相应的选项；</span><br /><span style="font-size: 14pt;">值为0，需调用函数确定选项是否支持。</span><br /><span style="font-size: 14pt;">注：某些系统可能出现定义了符号常量，但没有定义值的情况。</span><br /><br /><span style="font-size: 14pt;">3.4, 代码示例</span><br /><span style="font-size: 14pt;">先占坑。</span><br /><br /><strong><span style="font-size: 14pt;">4, 功能测试宏</span></strong><br /><span style="font-size: 14pt;">Feature test macros allow the programmer to control the definitions that are exposed by system header files when a program is compiled.</span><br /><span style="font-size: 14pt;">NOTE:&nbsp; In&nbsp; order&nbsp; to be effective, a feature test macro must be defined before including any header files.&nbsp; This can be done either in the compilation command (cc -DMACRO=value) or by defining the macro within the source code before including any headers.</span><br /><span style="font-size: 14pt;">see man page feature_test_macros(7).</span></div><img src ="http://www.cppblog.com/Onway/aggbug/212438.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2015-12-08 22:35 <a href="http://www.cppblog.com/Onway/archive/2015/12/08/212438.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shadowsocks</title><link>http://www.cppblog.com/Onway/archive/2015/12/06/212428.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Sun, 06 Dec 2015 09:18:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2015/12/06/212428.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/212428.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2015/12/06/212428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/212428.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/212428.html</trackback:ping><description><![CDATA[<div><strong style="font-size: 14pt;">1, shadowsocks home page</strong><br style="font-size: 14pt;" /><a style="font-size: 14pt;" href="https://shadowsocks.org/en/index.html">https://shadowsocks.org/en/index.html</a><br style="font-size: 14pt;" /><br style="font-size: 14pt;" /><strong style="font-size: 14pt;">2, install shadowsocks server</strong><br style="font-size: 14pt;" /><span style="font-size: 14pt;">$ sudo apt-get install python-pip</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">$ sudo pip install shadowsocks</span><br style="font-size: 14pt;" /><a style="font-size: 14pt;" href="https://shadowsocks.org/en/download/servers.html">https://shadowsocks.org/en/download/servers.html</a><br style="font-size: 14pt;" /><br style="font-size: 14pt;" /><strong style="font-size: 14pt;">3, shadowsocks server config file</strong><br style="font-size: 14pt;" /><span style="font-size: 14pt;">$ vi /etc/shadowsocks.json</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">{</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">&nbsp;&nbsp;&nbsp; "server":"my_server_ip",</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">&nbsp;&nbsp;&nbsp; "server_port":8388,</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">&nbsp;&nbsp;&nbsp; "local_port":1080,</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">&nbsp;&nbsp;&nbsp; "password":"barfoo!",</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">&nbsp;&nbsp;&nbsp; "timeout":600,</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">&nbsp;&nbsp;&nbsp; "method":"table"</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">}</span><br style="font-size: 14pt;" /><a style="font-size: 14pt;" href="https://shadowsocks.org/en/config/quick-guide.html">https://shadowsocks.org/en/config/quick-guide.html</a><br style="font-size: 14pt;" /><br style="font-size: 14pt;" /><strong style="font-size: 14pt;">4, shadowsocks server command</strong><br style="font-size: 14pt;" /><span style="font-size: 14pt;">$ ssserver -h // help message</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">$ ssserver -c /etc/shadowsocks.json -d start // start in daemon mode</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">$ ssserver -d stop // stop the server</span><br style="font-size: 14pt;" /><br style="font-size: 14pt;" /><strong style="font-size: 14pt;">5, shadowsocks-qt5 client for ubuntu 14.04</strong><br style="font-size: 14pt;" /><span style="font-size: 14pt;">$ sudo add-apt-repository ppa:hzwhuang/ss-qt5</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">$ sudo apt-get update</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">$ sudo apt-get install shadowsocks-qt5</span><br style="font-size: 14pt;" /><a style="font-size: 14pt;" href="https://github.com/shadowsocks/shadowsocks-qt5/wiki/Installation">https://github.com/shadowsocks/shadowsocks-qt5/wiki/Installation</a><br style="font-size: 14pt;" /><br style="font-size: 14pt;" /><strong style="font-size: 14pt;">6, install genpac to generate PAC file from gfwlist</strong><br style="font-size: 14pt;" /><span style="font-size: 14pt;">$ sudo pip install genpac // install</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">$ genpac --init // generate config.ini and user-rules.txt</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">-- modify config.ini</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">$ vi config.ini</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">[config]</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">proxy = SOCKS5 127.0.0.1:1080</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">gfwlist-url = https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">user-rule-from = /path/to/user-rules.txt</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">output = /path/to/proxy.pac</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">$ genpac -c config.ini // generate pac file</span><br style="font-size: 14pt;" /><a style="font-size: 14pt;" href="https://github.com/JinnLynn/genpac">https://github.com/JinnLynn/genpac</a><br style="font-size: 14pt;" /><a style="font-size: 14pt;" href="https://github.com/gfwlist/gfwlist">https://github.com/gfwlist/gfwlist</a><br style="font-size: 14pt;" /><br style="font-size: 14pt;" /><strong style="font-size: 14pt;">7, using a PAC file in Firefox</strong><br style="font-size: 14pt;" /><span style="font-size: 14pt;">about:preferences#advanced -&gt; Network -&gt; Settings</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">check 'Automatic proxy configuration URL:'</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">file:///path/to/proxy.pac</span><br style="font-size: 14pt;" /><span style="font-size: 14pt;">enable 'Remote DNS'</span><br style="font-size: 14pt;" /><a style="font-size: 14pt;" href="https://www.youtube.com/watch?v=nKB4FoPw15k">https://www.youtube.com/watch?v=nKB4FoPw15k</a></div><img src ="http://www.cppblog.com/Onway/aggbug/212428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2015-12-06 17:18 <a href="http://www.cppblog.com/Onway/archive/2015/12/06/212428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可枚举对象与枚举器</title><link>http://www.cppblog.com/Onway/archive/2015/08/01/211446.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Sat, 01 Aug 2015 06:00:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2015/08/01/211446.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/211446.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2015/08/01/211446.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/211446.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/211446.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1，最先学会的是，继承了IEnumerable接口的类都可以使用foreach遍历，但一直没有多想。2，IEnumerable和IEnumerable&lt;out T&gt;的定义：Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp; &nb...&nbsp;&nbsp;<a href='http://www.cppblog.com/Onway/archive/2015/08/01/211446.html'>阅读全文</a><img src ="http://www.cppblog.com/Onway/aggbug/211446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2015-08-01 14:00 <a href="http://www.cppblog.com/Onway/archive/2015/08/01/211446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Dispose模式</title><link>http://www.cppblog.com/Onway/archive/2015/07/29/211424.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Wed, 29 Jul 2015 14:50:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2015/07/29/211424.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/211424.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2015/07/29/211424.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/211424.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/211424.html</trackback:ping><description><![CDATA[<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"><span style="font-size: 14pt;">1，两个链接里面已经解析完Dispose模式了，其他的只是自己的一些理解。</span></div>
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;">
<div><a href="https://msdn.microsoft.com/en-us/library/vstudio/b1yfkh5e(v=vs.100).aspx" style="background-color: inherit; cursor: pointer;"><span style="font-size: 14pt;">https://msdn.microsoft.com/en-us/library/vstudio/b1yfkh5e(v=vs.100).aspx</span></a></div>
<div><a href="http://www.cnblogs.com/luminji/archive/2011/03/29/1997812.html" style="background-color: inherit; cursor: pointer;"><span style="font-size: 14pt;">http://www.cnblogs.com/luminji/archive/2011/03/29/1997812.html</span></a></div>
</div>
<br />
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"></div>
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"><span style="font-size: 14pt;">2，如果自定义类型封装了非托管资源，或者引用了一个封装了非托管资源的对象时（比如引用了SqlConnection对象），应该实现Dispose模式。</span></div>
<br />
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"></div>
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"><span style="font-size: 14pt;">3，如果自定义类型继承的基类需要Dispose，但该对象本身并没有需要Dispose的资源时（比如只是附加了一些简单类型），无需考虑Dispose模式。</span></div>
<br />
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"></div>
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"><span style="font-size: 14pt;">4，如果基类实现了Dispose，则其派生类只需重写protected级别的Dispose方法，释放本类型的使用到的资源。</span></div>
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"><span style="font-size: 14pt;">public级别的Dispose和Finalize方法都来自继承。</span></div>
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"><span style="font-size: 14pt;">重写的Dispose方法，记得最后调用基类带参的Dispose。</span></div>
<br />
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"></div>
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"><span style="font-size: 14pt;">5，附加的Close方法都是直接调用public无参的Dispose方法。</span></div>
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"></div>
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"><span style="font-size: 14pt;"><br />6，类型的析构函数会被编译器改为Finalize方法，不要重载这个方法。</span></div>
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"><span style="font-size: 14pt;">基类的Finalize方法总是会被自动调用的。</span></div>
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"><span style="font-size: 14pt;">Finalize方法都不应该引用任何对象。</span></div>
<br />
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"><span style="line-height: 1.5; font-size: 14pt; background-color: inherit;">7，不懂这段话，既然基类没有需要释放的资源，为何要实现Dispose模式，而为了性能考虑，又不写析构函数？</span></div>
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"></div>
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"><span style="font-size: 14pt;">那我的派生类，还要先看一下基类，再决定要不要写析构函数？</span></div>
<span style="font-family: 微软雅黑; widows: auto; font-size: 14pt; background-color: #ffffff;">Implement the dispose design pattern on a base type that commonly has derived types that hold onto resources, even if the base type does not. If the base type has a Close method, often this indicates the need to implement Dispose. In such cases, do not implement a Finalize method on the base type. Finalize should be implemented in any derived types that introduce resources that require cleanup</span><span style="font-size: 14pt; font-family: 微软雅黑; widows: auto; background-color: #ffffff;">.</span><span style="font-family: 微软雅黑; widows: auto; font-size: 14pt; background-color: #ffffff;"><br /></span>
<br />
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"><span style="font-size: 14pt;">8，对象在调用Dispose之后，除了Dispose以外，都应该抛出ObjectDisposedException异常。</span></div>
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"></div>
<br />
<div style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"><span style="font-size: 14pt;">9，实现了Finalize的对象，在第一次垃圾回收的时候，不会释放对象，而只是调用其Finalize方法，第二次回收才会真正释放对象。</span></div><img src ="http://www.cppblog.com/Onway/aggbug/211424.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2015-07-29 22:50 <a href="http://www.cppblog.com/Onway/archive/2015/07/29/211424.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>变体泛型</title><link>http://www.cppblog.com/Onway/archive/2015/07/29/211412.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Wed, 29 Jul 2015 12:23:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2015/07/29/211412.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/211412.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2015/07/29/211412.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/211412.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/211412.html</trackback:ping><description><![CDATA[<span style="font-size: 14pt;">因为某些原因，一直用的都是.NET2，但渣也总得有些追求是不，说不定哪天就用上了呢？</span><br />
<br />
<div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">using</span>&nbsp;System;<br />
<span style="color: #0000FF; ">using</span>&nbsp;System.Collections.Generic;<br />
<span style="color: #0000FF; ">using</span>&nbsp;System.Text;<br />
<br />
<span style="color: #0000FF; ">namespace</span>&nbsp;ConsoleApplicationTest<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;变体泛型<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;.NET4，在泛型接口类型或者泛型委托类型里面，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;被关键字in声明的泛型参数，其类型可以从父类向子类逆变，只能用作输入参数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;被关键字out声明的泛型参数，其类型可以从子类向父类协变，只能用于返回值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;整个泛型类型是不限于用作输入参数还是作为返回值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;interface&nbsp;IType_IN_OUT&lt;in&nbsp;T1,&nbsp;out&nbsp;T2&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;IType_IN_OUT&lt;Farmer,&nbsp;Person&gt;&nbsp;farmerPersonType&nbsp;=&nbsp;null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;IType_IN_OUT&lt;Person,&nbsp;Farmer&gt;&nbsp;personfarmerType&nbsp;=&nbsp;null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;farmerPersonFinder&nbsp;=&nbsp;personFarmerFinder;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;为什么不支持&#8220;变体&#8221;class呢？跟字段有关系么？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Program<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Main(<span style="color: #0000FF; ">string</span>[]&nbsp;args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IType_IN&lt;Person&gt;&nbsp;person_in&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IType_IN&lt;Farmer&gt;&nbsp;farmer_in&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;farmer_in&nbsp;=&nbsp;person_in;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Greeting(person_in);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(GetTypeIn()&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IType_OUT&lt;Person&gt;&nbsp;person_out&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IType_OUT&lt;Farmer&gt;&nbsp;farmer_out&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;person_out&nbsp;=&nbsp;farmer_out;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Greeting(farmer_out);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(GetTypeOut()&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Finder_IN&lt;Person&gt;&nbsp;personFinderIn&nbsp;=&nbsp;p&nbsp;=&gt;&nbsp;Console.WriteLine(p.GetType());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Finder_IN&lt;Farmer&gt;&nbsp;farmerFinderIn&nbsp;=&nbsp;f&nbsp;=&gt;&nbsp;Console.WriteLine(f.GetType());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;farmerFinderIn&nbsp;=&nbsp;personFinderIn;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Greeting(personFinderIn);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(GetFarmerFinder().GetType());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Finder_OUT&lt;Person&gt;&nbsp;personFinderOut&nbsp;=&nbsp;()&nbsp;=&gt;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Person();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Finder_OUT&lt;Farmer&gt;&nbsp;farmerFinderOut&nbsp;=&nbsp;()&nbsp;=&gt;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Farmer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;personFinderOut&nbsp;=&nbsp;farmerFinderOut;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Greeting(personFinderOut);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(GetPersonFinder().GetType());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Finder_IN_OUT&lt;Farmer,&nbsp;Person&gt;&nbsp;farmerPersonFinder&nbsp;=&nbsp;f&nbsp;=&gt;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Person();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Finder_IN_OUT&lt;Person,&nbsp;Farmer&gt;&nbsp;personFarmerFinder&nbsp;=&nbsp;p&nbsp;=&gt;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Farmer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;farmerPersonFinder&nbsp;=&nbsp;personFarmerFinder;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;interface&nbsp;IType_IN_OUT&lt;in&nbsp;T1,&nbsp;out&nbsp;T2&gt;</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IType_IN_OUT&lt;Farmer,&nbsp;Person&gt;&nbsp;farmerPersonType&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IType_IN_OUT&lt;Person,&nbsp;Farmer&gt;&nbsp;personfarmerType&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;farmerPersonType&nbsp;=&nbsp;personfarmerType;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadKey();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Greeting(IType_OUT&lt;Person&gt;&nbsp;person)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(person&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Greeting(IType_IN&lt;Farmer&gt;&nbsp;farmer)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(farmer&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;IType_OUT&lt;Person&gt;&nbsp;GetTypeOut()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IType_OUT&lt;Farmer&gt;&nbsp;farmer&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;farmer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;IType_IN&lt;Farmer&gt;&nbsp;GetTypeIn()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IType_IN&lt;Person&gt;&nbsp;person_IN&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;person_IN;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Greeting(Finder_OUT&lt;Person&gt;&nbsp;personFinder)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(personFinder().GetType());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Greeting(Finder_IN&lt;Farmer&gt;&nbsp;farmerFinder)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(farmerFinder.GetType());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Finder_OUT&lt;Person&gt;&nbsp;GetPersonFinder()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Finder_OUT&lt;Farmer&gt;&nbsp;farmerFinder&nbsp;=&nbsp;()&nbsp;=&gt;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Farmer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;farmerFinder;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Finder_IN&lt;Farmer&gt;&nbsp;GetFarmerFinder()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Finder_IN&lt;Person&gt;&nbsp;person&nbsp;=&nbsp;p&nbsp;=&gt;&nbsp;Console.WriteLine(p.GetType());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;person;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;IType_OUT&lt;<span style="color: #0000FF; ">out</span>&nbsp;T&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;IType_IN&lt;<span style="color: #0000FF; ">in</span>&nbsp;T&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;IType_IN_OUT&lt;<span style="color: #0000FF; ">in</span>&nbsp;T1,&nbsp;<span style="color: #0000FF; ">out</span>&nbsp;T2&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">delegate</span>&nbsp;T&nbsp;Finder_OUT&lt;<span style="color: #0000FF; ">out</span>&nbsp;T&gt;();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">delegate</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Finder_IN&lt;<span style="color: #0000FF; ">in</span>&nbsp;T&gt;(T&nbsp;t);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">delegate</span>&nbsp;T2&nbsp;Finder_IN_OUT&lt;<span style="color: #0000FF; ">in</span>&nbsp;T1,&nbsp;<span style="color: #0000FF; ">out</span>&nbsp;T2&gt;(T1&nbsp;t1);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Person<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Farmer&nbsp;:&nbsp;Person<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</div><img src ="http://www.cppblog.com/Onway/aggbug/211412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2015-07-29 20:23 <a href="http://www.cppblog.com/Onway/archive/2015/07/29/211412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IEEE 754二进制浮点数表示</title><link>http://www.cppblog.com/Onway/archive/2015/06/14/210923.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Sun, 14 Jun 2015 09:41:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2015/06/14/210923.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/210923.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2015/06/14/210923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/210923.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/210923.html</trackback:ping><description><![CDATA[<strong style="font-family: 微软雅黑; widows: auto;"><strong>
<div style="font-weight: normal;"><strong style="font-size: 14pt;">1，三个部分</strong></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">4字节的单精度浮点数32个位分3个部分：</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">1.1，从左往右第一位是符号位，0正1负；</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">1.2，紧接的8个位是指数部分，不要纠结是原码，反码还是补码，只是一个不带符号位的二进制数，都一样。取值区间是[0,255]，0和255有特殊含义；取值在[1,254]的情况下，需要减去127才是真正的指数值，这时指数取值是[-126,127]。</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">1.3，剩余的23位是尾数部分，用于表示浮点数的小数部分；也是一个不带符号位的二进制数。</span><br />
</div>
<br />
<div style="font-weight: normal;"></div>
<div style="font-weight: normal;"><strong style="font-size: 14pt;">2，指数部分</strong></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">2.1，当指数部分是0，且尾数部分为全0的情况，这表示浮点数0；加上符号位表示正负0。</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">2.2，当指数部分是0，且尾数部分不为0的情况，其实际指数是-126，二进制表示的科学计数法的浮点数的整数部分按0解析。</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">2.3，当指数部分是255，且尾数部分为全0的情况，表示一个无穷数；加上符号位表示正反无穷。</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">2.4，当指数部分是255，且尾数部分不为0的情况，表示不是一个有效数字，NaN。</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">2.5，当指数部分取值为[1,254]的情况，需要减去127才是实际指数值，二进制表示的科学计数法的浮点数的整数部分按1解析。</span><br />
</div>
<br />
<div style="font-weight: normal;"></div>
<div style="font-weight: normal;"><strong style="font-size: 14pt;">3，浮点书的规约形式与非规约形式</strong></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">3.1，上述的第二种情况的浮点数称为非规约浮点数；上述的第五种情况的浮点数称为规约浮点数。</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">3.2，最小的规约浮点数是指数部分是1（实际指数是-126），尾数部分为全0的时候，绝对值为1 * 2 ^ -126 ；</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">次小的规约浮点数是指数部分为1，尾数部分最低位为1其余位为0的时候，绝对值为1.000...1 * 2 ^ -126；</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">它们之间的绝对差值为(1.000...1 - 1) * 2 ^ -126 = 2 ^ -23 * 2 ^ -126 = 2 ^ -149；</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">而最小规约数与0的绝对差值是1 * 2 ^ -126 = 2 ^ -126。</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">在坐标轴的表现是，两个非0的规范浮点数的间隔很小，而最小规约浮点数与0的间隔很大，差距是23倍。</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">3.3，引入非规约形式的浮点数，可以使得0与最小规约浮点数的间隔变得均匀起来，并且间隔与两个相邻规约浮点数的间隔一致。</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">两个非规约浮点数的间隔都是0.000...1 * 2 ^ -126 = 2 ^ -149。</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">3.4，最大的非规约数是0.111...111 * 2 ^ -126，最小的规约数是1.000..0 * 2 ^ -126；</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">最大的非规约总是小于最小的规约数，也可以认识近似相等。</span></div>
<div style="font-weight: normal;"><a href="http://zh.wikipedia.org/zh-cn/IEEE_754#.E9.9D.9E.E8.A7.84.E7.BA.A6.E5.BD.A2.E5.BC.8F.E7.9A.84.E6.B5.AE.E7.82.B9.E6.95.B0" style="cursor: pointer;"><span style="font-size: 14pt;">http://zh.wikipedia.org/zh-cn/IEEE_754#.E9.9D.9E.E8.A7.84.E7.BA.A6.E5.BD.A2.E5.BC.8F.E7.9A.84.E6.B5.AE.E7.82.B9.E6.95.B0</span><br />
</a></div>
<br />
<div style="font-weight: normal;"></div>
<div style="font-weight: normal;"><strong style="font-size: 14pt;">4，浮点数舍入</strong></div>
<div style="font-weight: normal;"><a href="http://blog.csdn.net/txk15619567977/article/details/9186449" style="cursor: pointer;"><span style="font-size: 14pt;">http://blog.csdn.net/txk15619567977/article/details/9186449</span></a></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">4.1，四舍六入五成双。</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">Math.Round()</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">4.2，向0（截断）舍入</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">整型强制转换</span></div>
<span style="font-weight: normal; font-size: 14pt;">4.3，向负无穷大</span>
<div style="font-weight: normal;"><span style="font-size: 14pt;">Math.Floor()</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">4.4，向正无穷大</span></div>
<div style="font-weight: normal;"><span style="font-size: 14pt;">Math.Ceiling()</span></div>
</strong></strong><strong style="font-family: 微软雅黑; widows: auto; background-color: #ffffff;"><strong>
<div style="font-weight: normal;"></div>
</strong></strong><img src ="http://www.cppblog.com/Onway/aggbug/210923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2015-06-14 17:41 <a href="http://www.cppblog.com/Onway/archive/2015/06/14/210923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《c专家编程》笔记</title><link>http://www.cppblog.com/Onway/archive/2012/05/28/176479.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Mon, 28 May 2012 03:46:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2012/05/28/176479.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/176479.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2012/05/28/176479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/176479.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/176479.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这个月里诸多不顺，但还是一点一点翻完了这本书。自己做的笔记极少会看，算做个纪念咯。&nbsp;&nbsp;<a href='http://www.cppblog.com/Onway/archive/2012/05/28/176479.html'>阅读全文</a><img src ="http://www.cppblog.com/Onway/aggbug/176479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2012-05-28 11:46 <a href="http://www.cppblog.com/Onway/archive/2012/05/28/176479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>unix系统的限制，选项和功能测试宏</title><link>http://www.cppblog.com/Onway/archive/2012/03/26/169063.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Mon, 26 Mar 2012 14:37:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2012/03/26/169063.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/169063.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2012/03/26/169063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/169063.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/169063.html</trackback:ping><description><![CDATA[<span style="color: red;">（仅限个人理解，强烈欢迎指正！）</span><br /><div>一，理解<br />1，限制常量是对某个常量进行数值上的大小规定。其值必定是一个数值，编译时限制通常定义在&lt;limits.h&gt;头文件中。<br />2，选项常量是用来决定对某项功能是否支持。其值也是一个数值，但通常是0，-1，1或者一个表示年月的数值又或者未定义其值。编译时选项通常定义在&lt;unistd.h&gt;头文件中。<br />3，功能测试宏用来在编译时控制一些头文件的版本。通常定义在&lt;features.h&gt;头文件中。<br /><br />二，编译时常量的命名<br />1，POSIX的编译时限制以_POSIX_前缀开头，XSI编译时限制以NL_或者_XOPEN_前缀开头。特定系统实现的编译时限制不带前缀，对应于POSIX限制去掉前缀（其值应该比POSIX要大）。<br />2，选项用以表明是否对某个标准的某项功能的支持。其编译时常量通常是以_POSIX_或者_XOPEN_做前缀。没有特定系统实现的编译时选项。<br />3，功能测试宏常量只是以下划线_开头，然后就没什么规则了。功能测试宏只在编译时使用。详见man feature_test_macros。<br /><br />三，运行时确定限制或选项的三个函数<br />1，如果某个限制或选项无法从编译时确定，那就需要调用以下三个函数之一：sysconf，pathconf，fpathconf。后两个函数是跟路径相关的。<br />2，三个函数都需要一个整型常量参数，该参数命名规则为编译时的常量名去掉前缀，加上_SC_或者_PC_（调用跟路径相关的两个函数）前缀。<br />3，注意其返回值，详见函数的man手册。<br /><br />四，confstr函数和getconf命令<br />1，confstr用于获取依赖于配置的字符串变量。其参数只有几个，详见man手册。<br />2，getconf命令是用于查询系统配置变量，即编译时的限制和选项常量的值。该命令都可以查询到confstr函数的字符串变量。<br /><br /><a href="http://www.cppblog.com/Onway/archive/2015/12/08/212438.html">http://www.cppblog.com/Onway/archive/2015/12/08/212438.html</a></div><img src ="http://www.cppblog.com/Onway/aggbug/169063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2012-03-26 22:37 <a href="http://www.cppblog.com/Onway/archive/2012/03/26/169063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GPG学习笔记</title><link>http://www.cppblog.com/Onway/archive/2012/02/17/165847.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Fri, 17 Feb 2012 07:48:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2012/02/17/165847.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/165847.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2012/02/17/165847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/165847.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/165847.html</trackback:ping><description><![CDATA[见documents/note/<img src ="http://www.cppblog.com/Onway/aggbug/165847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2012-02-17 15:48 <a href="http://www.cppblog.com/Onway/archive/2012/02/17/165847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gdb常用汇编命令</title><link>http://www.cppblog.com/Onway/archive/2012/02/16/165739.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Thu, 16 Feb 2012 06:41:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2012/02/16/165739.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/165739.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2012/02/16/165739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/165739.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/165739.html</trackback:ping><description><![CDATA[见documents/note/gdb_disas<img src ="http://www.cppblog.com/Onway/aggbug/165739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2012-02-16 14:41 <a href="http://www.cppblog.com/Onway/archive/2012/02/16/165739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>格了ubuntu后驻留在MBR的GRUB，用win7安装盘没修复好，用个分区医生重建了mbr就好了。</title><link>http://www.cppblog.com/Onway/archive/2012/02/15/165691.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Wed, 15 Feb 2012 12:16:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2012/02/15/165691.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/165691.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2012/02/15/165691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/165691.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/165691.html</trackback:ping><description><![CDATA[如题<img src ="http://www.cppblog.com/Onway/aggbug/165691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2012-02-15 20:16 <a href="http://www.cppblog.com/Onway/archive/2012/02/15/165691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>局域网ubuntu使用ftp数据传输</title><link>http://www.cppblog.com/Onway/archive/2012/01/26/164547.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Thu, 26 Jan 2012 09:20:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2012/01/26/164547.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/164547.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2012/01/26/164547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/164547.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/164547.html</trackback:ping><description><![CDATA[<div><div><span style="font-size: 14pt; ">ubuntu 11.04安装ftp服务器</span></div><div><span style="font-size: 14pt; ">sudo apt-get install vsftpd</span></div><div><br /></div><div><span style="font-size: 14pt; ">默认登录需要帐号密码，其根目录是用户根目录</span></div><div><span style="font-size: 14pt; ">客户端命令：</span></div><div><span style="font-size: 14pt; ">登录：</span></div><div><span style="font-size: 14pt; ">ftp [-46pinegvd] [host[port]]</span></div><div><span style="font-size: 14pt; ">文件下载：</span></div><div><span style="font-size: 14pt; ">get remote-file [local-file]</span></div><div><span style="font-size: 14pt; ">ftp命令行不支持目录下载</span></div><div><span style="font-size: 14pt; ">通过wget得到解决</span></div><div><span style="font-size: 14pt; ">#wget ftp://IP:PORT/* --ftp-user=xxx --ftp-password=xxx -r</span></div><div><span style="font-size: 14pt; ">详见：man ftp</span><br /><br /><br /><span style="font-size: 14pt; ">或者直接浏览器下载</span></div></div><img src ="http://www.cppblog.com/Onway/aggbug/164547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2012-01-26 17:20 <a href="http://www.cppblog.com/Onway/archive/2012/01/26/164547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu one的同步问题</title><link>http://www.cppblog.com/Onway/archive/2012/01/20/164402.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Fri, 20 Jan 2012 03:56:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2012/01/20/164402.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/164402.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2012/01/20/164402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/164402.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/164402.html</trackback:ping><description><![CDATA[<div><div><span style="font-size: 14pt; ">重装系统后或者在另外的机器进行数据同步的时候，都要先在ubuntu one的客户端先登录上帐号，然后在设备选项里删掉原来的设备名（hostname），最后在云文件夹里选择需要同步的文件（文件夹）。</span></div><div><span style="font-size: 14pt; ">其实我的问题是：我先将原来云同步的本地数据拷贝到了另外一个新机器，然后我在ubuntu one的客户端删掉了旧机器设备，使用新机器进行云同步。问题是数据需要下载还是上传进行同步呢？或者都不需要？（其实如果文件名和内容都相同的话就没必要上传下载了，对比一个类似md5的校验码就可以了）。另外，云空间的数据的三个时间（atime,ctime,mtime）都比新机器硬盘里的数据要旧。</span></div></div><div></div><img src ="http://www.cppblog.com/Onway/aggbug/164402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2012-01-20 11:56 <a href="http://www.cppblog.com/Onway/archive/2012/01/20/164402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两ubuntu通过局域网进行数据传输</title><link>http://www.cppblog.com/Onway/archive/2012/01/20/164401.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Fri, 20 Jan 2012 03:53:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2012/01/20/164401.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/164401.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2012/01/20/164401.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/164401.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/164401.html</trackback:ping><description><![CDATA[<div><div><span style="font-size: 14pt; ">使用的是ssh登录查看要进行传输的数据，然后用基于ssh的scp命令进行，速度是11m多点每秒，其实如果用不加密的ftp应该会更快，但对这些网络应用都非常的不熟悉。</span></div><div><span style="font-size: 14pt; ">安装好ssh的服务器后（忘记了怎么安装的，网上教程很多，或者直接ubuntu软件中心都可以吧）</span></div><div><span style="font-size: 14pt; ">然后客户端的登录命令是：ssh username@hostname</span></div><div><span style="font-size: 14pt; ">文件从服务器拷贝回本地：scp username@host:filepath local-filepath</span></div><div><span style="font-size: 14pt; ">其实应该有很多这方面的图像工具，但这两个命令已经够本次的需要了，具体学习留待以后吧。加上-r参数或者通配符就可以将文件夹或者里面的所有文件拷贝过来了。</span></div></div><div></div><img src ="http://www.cppblog.com/Onway/aggbug/164401.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2012-01-20 11:53 <a href="http://www.cppblog.com/Onway/archive/2012/01/20/164401.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安装win7无法识别的分区，不能安装到指定的分区</title><link>http://www.cppblog.com/Onway/archive/2012/01/20/164400.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Fri, 20 Jan 2012 03:51:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2012/01/20/164400.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/164400.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2012/01/20/164400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/164400.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/164400.html</trackback:ping><description><![CDATA[<div><div><span style="font-size: 14pt; ">因为安装ubuntu的时候重建了分区表，在打算安装win7的分区将其删除了，变为空闲。</span></div><div><span style="font-size: 14pt; ">在指定win7的安装分区的时候同样是无法识别分区格式。</span></div><div><span style="font-size: 14pt; ">然后脑残又进入ubuntu将其格式化为NTFS，同样还是无法识别（windows怎么就这么娇气呢？！）</span></div><div><span style="font-size: 14pt; ">其实在指定win7安装分区的时候，不能识别的格式的分区，只要将其删除，然后创建，再格式化就可以了。</span></div></div><div></div><img src ="http://www.cppblog.com/Onway/aggbug/164400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2012-01-20 11:51 <a href="http://www.cppblog.com/Onway/archive/2012/01/20/164400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lenovo B460安装ubuntu</title><link>http://www.cppblog.com/Onway/archive/2012/01/20/164398.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Fri, 20 Jan 2012 03:44:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2012/01/20/164398.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/164398.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2012/01/20/164398.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/164398.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/164398.html</trackback:ping><description><![CDATA[<div><div><span style="font-size: 14pt; ">由于联想笔记本带有一个隐藏的分区，安装ubuntu的时候说有一个几千字节的偏移，无法继续。</span></div><div><span style="font-size: 14pt; ">只能重新建立了分区表。这不是GC，GC的是刚装上驱动的win7就这样没有了。</span></div></div><div></div><img src ="http://www.cppblog.com/Onway/aggbug/164398.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2012-01-20 11:44 <a href="http://www.cppblog.com/Onway/archive/2012/01/20/164398.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu 11.04更新软件源</title><link>http://www.cppblog.com/Onway/archive/2012/01/20/164397.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Fri, 20 Jan 2012 03:40:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2012/01/20/164397.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/164397.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2012/01/20/164397.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/164397.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/164397.html</trackback:ping><description><![CDATA[<div><div><span style="font-size: 14pt; ">其实这东西进行过好几次了，但是每次都得上网查查命令，三两条的命令都记不住。</span></div><div><span style="font-size: 14pt; ">学校用的是网通，用自带的源速度非常不错，回到家里用电信就特不给力了，然后换了网易的源，速度非常可以。</span></div><div><br /></div><div><span style="font-size: 14pt; ">先备份一下/etc/apt/sources.list，然后用以下内容替换掉整个文件，#开始行是注释。</span></div><div><span style="font-size: 14pt; ">deb http://mirrors.163.com/ubuntu/ oneiric main universe restricted multiverse</span></div><div><span style="font-size: 14pt; ">deb-src http://mirrors.163.com/ubuntu/ oneiric main universe restricted multiverse</span></div><div><span style="font-size: 14pt; ">deb http://mirrors.163.com/ubuntu/ oneiric-security universe main multiverse restricted</span></div><div><span style="font-size: 14pt; ">deb-src http://mirrors.163.com/ubuntu/ oneiric-security universe main multiverse restricted</span></div><div><span style="font-size: 14pt; ">deb http://mirrors.163.com/ubuntu/ oneiric-updates universe main multiverse restricted</span></div><div><span style="font-size: 14pt; ">deb http://mirrors.163.com/ubuntu/ oneiric-proposed universe main multiverse restricted</span></div><div><span style="font-size: 14pt; ">deb-src http://mirrors.163.com/ubuntu/ oneiric-proposed universe main multiverse restricted</span></div><div><span style="font-size: 14pt; ">deb http://mirrors.163.com/ubuntu/ oneiric-backports universe main multiverse restricted</span></div><div><span style="font-size: 14pt; ">deb-src http://mirrors.163.com/ubuntu/ oneiric-backports universe main multiverse restricted</span></div><div><span style="font-size: 14pt; ">deb-src http://mirrors.163.com/ubuntu/ oneiric-updates universe main multiverse restricted</span></div><div><span style="font-size: 14pt; ">保存后执行一下sudo apt-get update就可以了。</span></div></div><div></div><img src ="http://www.cppblog.com/Onway/aggbug/164397.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2012-01-20 11:40 <a href="http://www.cppblog.com/Onway/archive/2012/01/20/164397.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu 11.04重装grub</title><link>http://www.cppblog.com/Onway/archive/2012/01/20/164396.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Fri, 20 Jan 2012 03:38:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2012/01/20/164396.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/164396.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2012/01/20/164396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/164396.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/164396.html</trackback:ping><description><![CDATA[<div><div><span style="font-size: 14pt; ">改自：http://blog.163.com/peng_peng1028/blog/static/107463820118754931710/</span></div><div><br /></div><div><span style="font-size: 14pt; ">进入ubuntu光盘（11.04的livecd模式）</span></div><div><span style="font-size: 14pt; ">3打开终端</span></div><div><span style="font-size: 14pt; ">// 列出所有磁盘， 看清要把grub2修复在那个磁盘里～</span></div><div><span style="font-size: 14pt; ">sudo fdisk -l</span></div><div><span style="font-size: 14pt; ">//挂载根目录的分区</span></div><div><span style="font-size: 14pt; ">sudo mount /dev/sda1 /mnt</span></div><div><span style="font-size: 14pt; ">//这步只给把 /boot 另外挂载到与根目录不同分区的同学</span></div><div><span style="font-size: 14pt; ">sudo mount /dev/sda2 /mnt/boot</span></div><div><span style="font-size: 14pt; ">//挂载其他分区或设备 （不能漏掉，很重要）</span></div><div><span style="font-size: 14pt; ">sudo mount &#8211;bind /dev /mnt/dev</span></div><div><span style="font-size: 14pt; ">//另外的教程还有一步是：sudo mount --bind /proc /mnt/proc</span></div><div><span style="font-size: 14pt; ">//不知道是否有必要进行这一步，反正是加上了这步是可以的。</span></div><div><span style="font-size: 14pt; ">//改变根目录 这里不详细解释chroot的含义，讲起来有点玄，用起来就一点都不玄，很容易理解。</span></div><div><span style="font-size: 14pt; ">sudo chroot /mnt</span></div><div><span style="font-size: 14pt; ">//以下这一步我是重启后进入了ubuntu后再执行的</span></div><div><span style="font-size: 14pt; ">//运行update-grub更新配置文件（其实就是重建/boot/grub/grub.cfg）</span></div><div><span style="font-size: 14pt; ">update-grub</span></div><div><span style="font-size: 14pt; ">//执行sudo chroo /mnt后直接来到下面这一步，</span></div><div><span style="font-size: 14pt; ">//另外教程说可以安装道ubuntu所在分区，但是我试过不行，只能装到MBR</span></div><div><span style="font-size: 14pt; ">//我的情况是，重装或新装（都试过）win7后MBR被修改了，无法引导进入ubuntu。</span></div><div><span style="font-size: 14pt; ">//安装GRUB2到指定硬盘的MBR</span></div><div><span style="font-size: 14pt; ">grub-install /dev/sda</span></div><div><span style="font-size: 14pt; ">//然后原文是退出root用户和umount的，不过，我们态度强硬一点，直接重启</span></div><div><span style="font-size: 14pt; ">4进入ubuntu 后sudo update-grub</span></div><div><span style="font-size: 14pt; ">XP就在引导里了，</span></div><div><span style="font-size: 14pt; ">5设置默认xp启动</span></div><div><span style="font-size: 14pt; ">cd /boot/grub/</span></div><div><span style="font-size: 14pt; ">sudo gedit grub.cfg</span></div><div><br /></div><div><span style="font-size: 14pt; ">把&#8220;set default=4&#8220;</span></div><div><span style="font-size: 14pt; ">红字部分即为你默认OS的启动是的顺序-1，比如说我开机是winXP默认在第五行，就将红色部分改为4即可。</span></div><div><span style="font-size: 14pt; ">set timeout=2加快开机速度</span></div></div><div></div><img src ="http://www.cppblog.com/Onway/aggbug/164396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2012-01-20 11:38 <a href="http://www.cppblog.com/Onway/archive/2012/01/20/164396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>APUE第十六章到第二十一章 笔记</title><link>http://www.cppblog.com/Onway/archive/2012/01/13/164103.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Fri, 13 Jan 2012 01:44:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2012/01/13/164103.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/164103.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2012/01/13/164103.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/164103.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/164103.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: STREAMS相关内容和伪终端真是没看懂。从十一月份断电以来到现在这个学期的最后一天，每个晚上翻几页，总算将书翻完了。2012-1-13。&nbsp;&nbsp;<a href='http://www.cppblog.com/Onway/archive/2012/01/13/164103.html'>阅读全文</a><img src ="http://www.cppblog.com/Onway/aggbug/164103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2012-01-13 09:44 <a href="http://www.cppblog.com/Onway/archive/2012/01/13/164103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>王爽《汇编语言》（第二版） 笔记</title><link>http://www.cppblog.com/Onway/archive/2011/12/31/163271.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Sat, 31 Dec 2011 08:03:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2011/12/31/163271.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/163271.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2011/12/31/163271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/163271.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/163271.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 上个周六看到的一篇教程终于让我决定要学学汇编语言了，上周日开始到今天周六刚好一个星期，赶在2012来临之前算是把这本书看完了，也留下了一万字的笔记。只是从第十章开始就没做过书上的实验了,后面的综合研究也只是一页一页的翻了过去。改写书上提到的一个故事：COOL先生用了3天（或更短）的时间就学会了汇编语言。我会相信这个故事，只是故事的主角不会是我。&nbsp;&nbsp;<a href='http://www.cppblog.com/Onway/archive/2011/12/31/163271.html'>阅读全文</a><img src ="http://www.cppblog.com/Onway/aggbug/163271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2011-12-31 16:03 <a href="http://www.cppblog.com/Onway/archive/2011/12/31/163271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>APUE第十五章进程间通讯 笔记</title><link>http://www.cppblog.com/Onway/archive/2011/12/31/163269.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Sat, 31 Dec 2011 07:55:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2011/12/31/163269.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/163269.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2011/12/31/163269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/163269.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/163269.html</trackback:ping><description><![CDATA[<pre><pre><span style="font-size: 12pt; ">2011-12-21 第十五章 进程间通讯</span></pre><div><span style="font-size: 12pt; ">第一节 引言</span></div><div><span style="font-size: 12pt; ">1，过去，UNIX系统IPC是各种进程通讯方式的统称。</span></div><div><span style="font-size: 12pt; ">2，套接字和STREAMS是仅有的两种支持不同主机上各个进程间IPC的类型。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12pt; ">第二节 管道</span></div><div><span style="font-size: 12pt; ">1，管道使用例程：</span></div><div><span style="font-size: 12pt; ">int main()</span></div><div><span style="font-size: 12pt; ">{</span></div><div><span style="font-size: 12px;"><span style="white-space:pre">	</span></span><span style="font-size: 12pt; ">int n,fd[2];</span></div><div><span style="font-size: 12px;"><span style="white-space:pre">	</span></span><span style="font-size: 12pt; ">pid_t pid;</span></div><div><span style="font-size: 12px;"><span style="white-space:pre">	</span></span><span style="font-size: 12pt; ">char line[MAXLINE];</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;"><span style="white-space:pre">	</span></span><span style="font-size: 12pt; ">if(pipe(fd) &lt; 0)</span></div><div><span style="font-size: 12px;"><span style="white-space:pre">		</span></span><span style="font-size: 12pt; ">err_sys("pipe error");</span></div><div><span style="font-size: 12px;"><span style="white-space:pre">	</span></span><span style="font-size: 12pt; ">if(pid = fork() &lt; 0)</span></div><div><span style="font-size: 12px;"><span style="white-space:pre">		</span></span><span style="font-size: 12pt; ">err_sys("fock error");</span></div><div><span style="font-size: 12px;"><span style="white-space:pre">	</span></span><span style="font-size: 12pt; ">else if(pid &gt; 0){</span></div><div><span style="font-size: 12px;"><span style="white-space:pre">		</span></span><span style="font-size: 12pt; ">close(fd[0]);</span></div><div><span style="font-size: 12px;"><span style="white-space:pre">		</span></span><span style="font-size: 12pt; ">write(fd[1],"hello world\n",12);</span></div><div><span style="font-size: 12px;"><span style="white-space:pre">	</span></span><span style="font-size: 12pt; ">} else {</span></div><div><span style="font-size: 12px;"><span style="white-space:pre">		</span></span><span style="font-size: 12pt; ">close(fd[1]);</span></div><div><span style="font-size: 12px;"><span style="white-space:pre">		</span></span><span style="font-size: 12pt; ">n = read(fd[0],line,MAXLINE);</span></div><div><span style="font-size: 12px;"><span style="white-space:pre">		</span></span><span style="font-size: 12pt; ">write(STDOUT_FILENO,line,n);</span></div><div><span style="font-size: 12px;"><span style="white-space:pre">	</span></span><span style="font-size: 12pt; ">}</span></div><div><span style="font-size: 12px;"><span style="white-space:pre">	</span></span><span style="font-size: 12pt; ">exit(0);</span></div><div><span style="font-size: 12pt; ">}</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12pt; ">第三节 popen和pclose函数</span></div><div><span style="font-size: 12pt; ">1，这两个函数实现的操作是：创建一个管道，调用fork产生一个子进程，关闭管道的不使用端，执行一个shell以运行命令，然后等待命令终止。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12pt; ">第四节 协同进程</span></div><div><span style="font-size: 12pt; ">1，当一个程序产生某个过滤程序的输入，同时又读取该过滤程序的输出时，则该过滤程序就成为协同进程。</span></div><div><span style="font-size: 12pt; ">2，注意协同进程的IO缓冲方式，以避免死锁的产生。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12pt; ">第五节 FIFO</span></div><div><span style="font-size: 12pt; ">1，FIFO有时被称为命名管道。FIFO是一种文件类型。</span></div><div><span style="font-size: 12pt; ">2，FIFO有下面两种用途：</span></div><div><span style="font-size: 12pt; ">a，FIFO由shell命令使用以便将数据从一条管道线传送到另一条，为此无需创建中间临时文件。</span></div><div><span style="font-size: 12pt; ">b，FIFO用于客户进程-服务器进程应用程序中，以在客户进程和服务器进程之间传递数据。</span></div><div><span style="font-size: 12pt; ">3，管道只能用于进程间的线性连接，然而，因为FIFO具有名字，它可以用于非线性连接。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12pt; ">第六节 XSI IPC</span></div><div><span style="font-size: 12pt; ">1，有三种IPC我们称为XSI IPC，即消息队列，信号量以及共享存储器。</span></div><div><span style="font-size: 12pt; ">2，以参数key和flag创建IPC结构，返回其标识符，以其引用该IPC结构。</span></div><div><span style="font-size: 12pt; ">3，IPC_PRIVATE是键，IPC_CREATE和IPC_EXCL是flag的位标志。</span></div><div><span style="font-size: 12pt; ">4，XSI IPC为每一个IPC结构设置了一个ipc_perm结构。该结构规定了权限和所有者。</span></div><div><span style="font-size: 12pt; ">5，XSI IPC的主要问题是：</span></div><div><span style="font-size: 12pt; ">a，IPC结构是在系统范围内起作用的，没有访问计数。</span></div><div><span style="font-size: 12pt; ">b，这些IPC结构在文件系统中没有名字。为了支持它们，不得不增加了十几条新的系统调用和一些新的命令。</span></div><div><span style="font-size: 12pt; ">c，IPC结构不使用文件描述符，不能对它们使用多路转接IO函数。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12pt; ">第七节 消息队列</span></div><div><span style="font-size: 12pt; ">1，megget用于创建一个新的消息队列或打开一个现存的队列。</span></div><div><span style="font-size: 12pt; ">2，msgsnd将数据放到消息队列中。</span></div><div><span style="font-size: 12pt; ">3，msgrcv从消息队列中取用函数。</span></div><div><span style="font-size: 12pt; ">4，msgctl对消息队列指定执行多种操作。</span></div><div><span style="font-size: 12pt; ">5，在新的应用程序中不应当再使用消息队列。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12pt; ">第八节 信号量</span></div><div><span style="font-size: 12pt; ">1，信号量是一个计数器，用于安排多个进程对共享数据对象的访问。</span></div><div><span style="font-size: 12pt; ">2，一个信号量控制一个共享资源的使用情况。</span></div><div><span style="font-size: 12pt; ">3，使用信号量要先创建一个信号量集，调用函数semget。</span></div><div><span style="font-size: 12pt; ">4，semctl函数包含了多种信号量的操作。</span></div><div><span style="font-size: 12pt; ">5，函数semop自动原子性地执行信号量集合上的操作数组。</span></div><div><span style="font-size: 12pt; ">6，虽然记录锁慢于信号量，但如果只需锁一个资源并且不需要使用XSI信号量的所有花销功能，则宁可使用记录锁。理由是使用简易，且进程终止时系统会处理任何遗留下来的锁。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12pt; ">第九节 共享存储</span></div><div><span style="font-size: 12pt; ">1，共享存储允许两个或更多进程共享一给定的存储区。因为数据不需要在客户进程和服务器之间复制，所以这是最快的一种IPC。</span></div><div><span style="font-size: 12pt; ">2，使用共享存储时需要掌握的唯一窍门是多个进程之间对一给定存储区的同步访问。</span></div><div><span style="font-size: 12pt; ">3，通常，信号量被用来实现对共享存储访问的同步。（记录锁也可以）。</span></div><div><span style="font-size: 12pt; ">4，调用shmget获得一个共享存储标识符。</span></div><div><span style="font-size: 12pt; ">5，shmctl对共享存储段执行多种操作。</span></div><div><span style="font-size: 12pt; ">6，共享存储段创建之后就可以使用shmat连接它的地址空间。</span></div><div><span style="font-size: 12pt; ">7，当对共享存储段的操作已经结束的时候，调用shmdt脱接该段。</span></div><div><span style="font-size: 12pt; ">8，使用存储映射使用/dev/zero的优点是：在调用mmap创建映射区之前，无需存在一个实际文件。其缺点是：只能在相关进程间起作用。另外，对比/dev/zero的更好选择，还可使用匿名存储映射。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12pt; ">第十节 客户进程-服务器进程属性</span></div><div><span style="font-size: 12pt; ">1，客户进程和服务器进程的某些属性会受到它们之间所使用的IPC类型的影响。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12pt; ">ps：2011年的最后一天算是第一次结束了这一章了。仅限勉强有个概念的程度。</span></div></pre><img src ="http://www.cppblog.com/Onway/aggbug/163269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2011-12-31 15:55 <a href="http://www.cppblog.com/Onway/archive/2011/12/31/163269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>APUE第十四章高级I/O 笔记</title><link>http://www.cppblog.com/Onway/archive/2011/12/27/162890.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Tue, 27 Dec 2011 02:17:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2011/12/27/162890.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/162890.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2011/12/27/162890.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/162890.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/162890.html</trackback:ping><description><![CDATA[<div><div>2011-12-19 第十四章 高级I/O</div><div>第一节 引言</div><div>1，高级I/O包括：</div><div>非阻塞I/O</div><div>记录锁</div><div>系统V流机制</div><div>I/O多路转接</div><div>readv和writev函数</div><div>存储映像I/O（mmap）</div><div></div><div><br />第二节 非阻塞I/O</div><div>1，低速系统调用是可能会使进程永远阻塞的一类系统调用。</div><div>2，虽然读写磁盘文件会使调用者在短暂时间内阻塞，但并不能将与磁盘I/O有关的系统调用视为&#8220;低速&#8221;。</div><div>3，对于一个给定的描述符有两种方法对其指定非阻塞I/O：</div><div>a，如果调用open获得描述符，则可指定O_NONBLOCK标志</div><div>b，对于已经打开的一个描述符，则可调用fcntl，由该函数打开O_NONBLOCK文件状态标志。</div><div>4，POSIX.1要求，对于一个非阻塞的描述符如果无数据可读，则read返回-1，并且errno被设置为EAGAIN。</div><div>5，文件状态标志的更改影响同一文件表项的所有用户，但与通过其他文件表项对同一设备的访问无关。</div><div></div><div><br />第三节 记录锁</div><div>1，记录锁的功能是：当一个进程正在读或修改文件的某个部分时，它可以阻止其他进程修改同一文件区。</div><div>2,fcntl记录锁的基本规则是：多个进程在一个给定的字节上可以有一把共享的读锁，但是在一个给定的字节上只能有一个进程独用一把写锁。进一步而言，如果在一个给定的字节上已经有一把或多把读锁，则不能在该字节上再加写锁；如果一个字节上已经有一把独占性的写锁，则不能对它再加任何的读锁。</div><div>3，上面说明的兼容性规则适用于不同进程提出的锁请求，并不使用于单个进程提出的多个锁请求。</div><div>4,记录锁的自动继承和释放有三条规则：</div><div>a，当一个进程终止时，它锁建立的锁全部释放；任何时候关闭一个描述符时，该进程通过这一描述可以引用的文件上的任何一把锁都被释放。</div><div>b，由fork产生的子进程不继承父进程锁设置的锁。</div><div>c，在执行exec后，新程序可以继承原执行程序的锁。</div><div>5，在接近文件尾端加锁或解锁时需要特别小心。</div><div>6，建议性锁对非合作进程是不起作用的。</div><div>7，linux中，使用强制性锁需要在文件系统挂载的时候mount命令加上_omand选项以打开该机制。</div><div>8，对于一个特定文件打开其设置组ID位，并关闭其组执行位，则对该文件开始了强制性锁机制。</div><div></div><div><br />第四节 STREAMS（看不懂啊！）</div><div>1,STREAMS是系统V提供的构造内核设备驱动程序和网络协议包的一种通用方法。</div><div>2，流在用户进程和设备驱动程序之间提供了一条全双工通路。流无需和实际硬件设备直接会话，流也可以用来构造伪设备驱动程序。</div><div>3，在Linux中，STREAMS子系统是可用的，但是用户必须自行将该子系统安装到系统中，通常它默认为不包括在系统中。</div><div></div><div><br />第五节 I/O多路转接</div><div>1，I/O多路转接：先构造一张有关描述符的列表，然后调用一个函数，直到这些描述符中的一个已准备好进行I/O操作时，该函数才返回。在返回时，它告诉进程哪些进程已经好可以进行I/O。这些函数即select和pselect函数。</div><div>2，poll函数类似于select，但是其程序员接口则有所不同。</div><div>3，虽然poll函数可用于任何类型的文件描述符，但它起源于系统V，所以poll与STREAMS系统紧紧相关。</div><div>4，poll和select函数在被信号中断后都不会被重启动，即使启用了SA_RESTART函数。</div><div></div><div><br />第六节 异步I/O</div><div>1，select和poll对任意描述符都能工作。</div><div>2，在系统V派生的系统中，异步I/O只对STREAMS设备和STREAMS管道起作用。在BSD派生的系统中，异步I/O只对终端和网络起作用。</div><div></div><div><br />第七节 readv和writev函数</div><div>1，readv和writev函数用于在一次函数调用中读写多个非连续缓冲区。</div><div></div><div><br />第八节 readn和writen函数</div><div>1，readn和writen函数并非任何标准的组成部分。</div><div>2，注意read，write函数返回值小于要求值的情况。</div><div></div><div><br />第九节 存储映射I/O</div><div>1，存储映射I/O使一个磁盘文件与存储空间中的一个缓冲区相映射。</div><div>2，将一个普通文件复制到另一个普通文件中时，存储映射I/O比较快。但是有一些限制，例如，不能用其在某些设备（如网络设备或终端设备）之间进行复制，并且在对被复制的文件进行映射后，也要注意该文件的长度是否改变。</div><div></div><div><br />第十节 小结<br /><br /><br />PS：这章在STREAMS一节纠结了好久还是没看懂，其他的也只是基本看了个概念。期间也跳到第十五章看了一下前几节。</div></div><img src ="http://www.cppblog.com/Onway/aggbug/162890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2011-12-27 10:17 <a href="http://www.cppblog.com/Onway/archive/2011/12/27/162890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>APUE第十三章 守护进程 笔记</title><link>http://www.cppblog.com/Onway/archive/2011/12/18/162333.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Sun, 18 Dec 2011 04:28:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2011/12/18/162333.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/162333.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2011/12/18/162333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/162333.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/162333.html</trackback:ping><description><![CDATA[<div><div>2011-12-17 第十三章 守护进程</div><div>第一节 引言</div><div>1，守护进程通常没有控制终端。</div><div></div><div><br />第二节 守护进程的特征</div><div>1，所有用户层守护进程都是进程组的组长进程以及会话的首进程，而且是这些进程组和会话中的唯一进程。</div><div>2，大多数守护进程的父进程是init进程。</div><div></div><div><br />第三节 编程规则</div><div>1，六个进程规则使一个普通进程被正确初始化成一个守护进程。</div><div></div><div><br />第四节 出错记录</div><div>1，对于守护进程，需要一个集中的守护进程出错记录设施。</div><div>2，该设施的接口是syslog函数。</div><div></div><div><br />第五节 单实例守护进程</div><div>1，为了正常运作，某些守护进程实现为单实例的，也就是在任一时刻只运行该守护进程的一个副本。</div><div>2，文件锁和记录锁机制是一种方法的基础，该方法用来保证一个守护进程只有一个副本在运行。</div><div></div><div><br />第六节 守护进程惯例</div><div>1，如果守护进程使用锁文件，那么该文件通常存放在/var/run目录中。</div><div>2，若守护进程支持配置选项，那么配置文件通常存放在/etc目录中。</div><div>3，守护进程可用命令行启动，但通常它们是由系统初始化脚本之一启动的。如果在守护进程终止时，应当自动重新启动它，则可在/etc/inittab中为该守护进程包括_respawn记录项。</div><div>4，为了避免守护进程可能需要停止来重新读取配置文件，可使守护进程捕捉SIGHUP信号。</div><div></div><div><br />第七节 客户进程-服务进程模型</div><div>1，守护进程常常用作服务器进程。</div><div></div><div><br />第八节 小结</div></div><img src ="http://www.cppblog.com/Onway/aggbug/162333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2011-12-18 12:28 <a href="http://www.cppblog.com/Onway/archive/2011/12/18/162333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>APUE第十一十二章 线程及其控制 笔记 </title><link>http://www.cppblog.com/Onway/archive/2011/12/16/162222.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Fri, 16 Dec 2011 04:41:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2011/12/16/162222.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/162222.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2011/12/16/162222.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/162222.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/162222.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第七节 取消选项<br>1，线程的可取消状态和可取消类型这两个属性影响着线程在响应pthread_cancel函数调用时锁呈现的行为。<br>2，可取消类型分为异步取消和延迟取消，使用异步取消时，线程可以在任意时刻取消，而不是非得遇到取消点才能被取消。<br>3，当线程处于延迟取消类型的情况下，可以调用pthread_setcancelstate修改它的可取消状态。<br>4，取消点是线程检查是否被取消并按照取消请求进行动作的一个位置。<br>5，当可取消状态设置为PTHREAD_CANCEL_DISABLE时，对pthread_cancel的调用不会杀死进程，相反，取消请求对这个线程来说处于未决状态。<br>6，可以调用pthread_testcancel函数在程序中自己添加取消点。<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/Onway/archive/2011/12/16/162222.html'>阅读全文</a><img src ="http://www.cppblog.com/Onway/aggbug/162222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2011-12-16 12:41 <a href="http://www.cppblog.com/Onway/archive/2011/12/16/162222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>个人整理：字符编码</title><link>http://www.cppblog.com/Onway/archive/2011/12/04/161420.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Sun, 04 Dec 2011 06:39:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2011/12/04/161420.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/161420.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2011/12/04/161420.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/161420.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/161420.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第十二 内容转载引用自：<br>字符集：	http://baike.baidu.com/view/51987.htm<br>字符编码：http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html<br>ASCII：	http://baike.baidu.com/view/15482.htm<br>EASCII：http://zh.wikipedia.org/wiki/EASCII<br>	http://zh.wikipedia.org/wiki/ISO/IEC_8859<br>GBxxxx系列，BIG5：<br>	http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html<br>UCS&UNICODE：http://zh.wikipedia.org/wiki/通用字符集<br>		http://zh.wikipedia.org/wiki/Unicode<br>UTF-x系列：http://zh.wikipedia.org/wiki/UTF-8&nbsp;&nbsp;<a href='http://www.cppblog.com/Onway/archive/2011/12/04/161420.html'>阅读全文</a><img src ="http://www.cppblog.com/Onway/aggbug/161420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2011-12-04 14:39 <a href="http://www.cppblog.com/Onway/archive/2011/12/04/161420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《C++ Primer 中文版》笔记</title><link>http://www.cppblog.com/Onway/archive/2011/12/04/161418.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Sun, 04 Dec 2011 06:12:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2011/12/04/161418.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/161418.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2011/12/04/161418.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/161418.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/161418.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 做这些笔记的时候是一年前多了。当时还在做着ACM，学这些似乎只是抱着充实自己的心态，当时最想的似乎就是看完整本书，但最终还是在面向对象的部分停下来了。现在很多东西都忘了，毕竟这样学而没有实际使用，肯定很容易忘的。可能当时也是出现了这么个想法而停下来的吧，至少应该是其中一个原因。这份笔记似乎在硬盘里丢失过一次，最后在金山快盘里找回来的。2011-12-4&nbsp;&nbsp;<a href='http://www.cppblog.com/Onway/archive/2011/12/04/161418.html'>阅读全文</a><img src ="http://www.cppblog.com/Onway/aggbug/161418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2011-12-04 14:12 <a href="http://www.cppblog.com/Onway/archive/2011/12/04/161418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>APUE第十章 信号 笔记</title><link>http://www.cppblog.com/Onway/archive/2011/12/04/161417.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Sun, 04 Dec 2011 05:48:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2011/12/04/161417.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/161417.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2011/12/04/161417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/161417.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/161417.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第三节<br>1，signal在linux的声明<br>typedef void (*__sighandler_t) (int);<br>extern __sighandler_t signal (int __sig, __sighandler_t __handler)<br>     __THROW;<br>2，SIG_ERR，SIG_DFL和SIG_IGN的定义<br>#define SIG_ERR	((__sighandler_t) -1)		/* Error return.  */<br>#define SIG_DFL	((__sighandler_t) 0)		/* Default action.  */<br>#define SIG_IGN	((__sighandler_t) 1)		/* Ignore signal.  */<br><br>怀疑书上有错：<br>”如果查看系统的头文件<signal.h>，则很可能会找到下列形式的声明：<br>#define SIG_ERR (void (*)())-1<br>#define SIG_DFL (vo&nbsp;&nbsp;<a href='http://www.cppblog.com/Onway/archive/2011/12/04/161417.html'>阅读全文</a><img src ="http://www.cppblog.com/Onway/aggbug/161417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2011-12-04 13:48 <a href="http://www.cppblog.com/Onway/archive/2011/12/04/161417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VirtualBox笔记</title><link>http://www.cppblog.com/Onway/archive/2011/11/22/160715.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Tue, 22 Nov 2011 07:58:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2011/11/22/160715.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/160715.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2011/11/22/160715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/160715.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/160715.html</trackback:ping><description><![CDATA[<div><span style="font-size: 14pt;">一，使用数据空间：</span><br /><span style="font-size: 14pt;">环境：</span><br /><span style="font-size: 14pt;">宿主机：ubuntu</span><br /><span style="font-size: 14pt;">步骤：</span><br /><span style="font-size: 14pt;">1，进入虚拟机系统（将虚拟机开机），选择：设备-&gt;安装增强功能</span><br /><span style="font-size: 14pt;">（最好先在网上下载一个VBoxGuestAdditions.iso的增强功能文件，放到宿主机的/usr/share/virtualbox目录下）</span><br /><span style="font-size: 14pt;">2，安装完后就将虚拟机关机了，选择：控制-&gt;设置-&gt;数据空间，弹出的界面右侧有一个带加号的文件夹图标，鼠标移动过去有提示，添加数据空间。</span><br /><span style="font-size: 14pt;">3，弹出的&#8220;添加数据空间&#8221;界面里，数据空间位置选择一个在宿主机上的文件夹，数据空间名称随便，例如sharedata。选上底下的auto-mount,是否只读，你喜欢。</span><br /><span style="font-size: 14pt;">4，确定后开机就行了。</span><br /><span style="font-size: 14pt;">数据空间在虚拟机的位置是/media/sf_数据空间名称，如果是XP的虚拟机，则可以看到一个额外的盘符。</span><br /><span style="font-size: 14pt;">5，注意在虚拟机（linux）中虚拟空间文件夹是所有者是root,所属组是vboxsf，这意味着一般用户是不能访问的，将你的账户添加到其所属组吧。</span><br /><span style="font-size: 14pt;">具体参见用户手册，Guest Additions-&gt;Shared folders章节。</span><br /><br /><br /><span style="font-size: 14pt;">二，修正虚拟机的屏幕大小：</span><br /><span style="font-size: 14pt;">XP直接调整分辨率</span><br /><span style="font-size: 14pt;">ubuntu还没试成功</span><br /><br /><br /><span style="font-size: 14pt;">三，导入导出虚拟电脑：</span><br /><span style="font-size: 14pt;">按照向导操作即可。问题是：虚拟电脑上的驱动会不会因为两台宿主机硬件的不同而出问题。应该不会吧，硬件都是虚拟出来的。</span><br /><span style="font-size: 14pt;">因为导入的XP进不了系统，总是自动重启，导入的ubuntu屏幕大小太大（原虚拟机是在19寸的台式电脑，导入到14寸的笔记本），以为驱动出了问题。</span><br /><span style="font-size: 14pt;">后来重装XP才发现，装完后蓝屏（原来导入的XP可能也是这个问题而进不了系统），按照网上教程搞好后，还是要自行调整分辨率。</span><br /><span style="font-size: 14pt;">所以觉得导入导出虚拟电脑，应该不用担心驱动问题。</span><br /><br /><br /><br /><span style="font-size: 14pt;">四，宿主机和虚拟机通信并且虚拟机能够上网</span><br /><span style="font-size: 14pt;">宿主机：ubuntu 11.10 使用adsl拨号上网</span><br /><span style="font-size: 14pt;">虚拟机：centos 6.0</span><br /><br /><span style="font-size: 14pt;">1，宿主机使用ifconfig可以查看到有三个网络接口：eth0,lo,ppp0，其中eth0是没有地址的。</span><br /><span style="font-size: 14pt;">2，宿主机编辑/etc/network/interfaces，修改</span><br /><span style="font-size: 14pt;">auto eth0</span><br /><span style="font-size: 14pt;">iface eth0 inet static</span><br /><span style="font-size: 14pt;">address 192.168.1.1</span><br /><span style="font-size: 14pt;">network 192.168.1.0</span><br /><span style="font-size: 14pt;">netmask 255.255.255.0</span><br /><span style="font-size: 14pt;">broadcast 192.168.1.255</span><br /><span style="font-size: 14pt;">然后重启网络：</span><br /><span style="font-size: 14pt;">sudo /etc/init.d/networking restart</span><br /><span style="font-size: 14pt;">3，virtualbox在虚拟机中虚拟两个网卡，一个使用NAT，一个使用Bridged Adapter</span><br /><span style="font-size: 14pt;">4，虚拟机中编辑/etc/sysconfig/eth0</span><br /><span style="font-size: 14pt;">DEVICE=eth0</span><br /><span style="font-size: 14pt;">ONBOOT=yes</span><br /><span style="font-size: 14pt;">BOOTPROT=dhcp</span><br /><span style="font-size: 14pt;">NAME=net&nbsp;&nbsp; &nbsp;//不知道这个是做什么的</span><br /><span style="font-size: 14pt;">HWADDR=&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//必须的，对照virtualbox中使用NAT方式的网卡MAC地址</span><br /><span style="font-size: 14pt;">5，虚拟机中编辑/etc/sysconfig/network-scripts/ifcfg-eth1</span><br /><span style="font-size: 14pt;">DEVICE=eth1</span><br /><span style="font-size: 14pt;">ONBOOT=yes</span><br /><span style="font-size: 14pt;">BOOTPROT=static</span><br /><span style="font-size: 14pt;">IPADDR=192.168.1.2</span><br /><span style="font-size: 14pt;">NETMASK=255.255.255.0</span><br /><span style="font-size: 14pt;">NAME=bridge</span><br /><span style="font-size: 14pt;">TYPE=Ethernet</span><br /><span style="font-size: 14pt;">HWADDR=&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//必须的，对照virtualbox中使用bridged adapter的网卡mac地址</span><br /><span style="font-size: 14pt;">6，添加网络管理服务：</span><br /><span style="font-size: 14pt;">chkconfig NetworkManager on&nbsp;&nbsp; &nbsp;</span><br /><span style="font-size: 14pt;">chkconfig network on</span><br /><span style="font-size: 14pt;">service network restart&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//重启网络</span><br /></div><img src ="http://www.cppblog.com/Onway/aggbug/160715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2011-11-22 15:58 <a href="http://www.cppblog.com/Onway/archive/2011/11/22/160715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下C语言的http请求和信号注册简单例子</title><link>http://www.cppblog.com/Onway/archive/2011/11/22/160700.html</link><dc:creator>Onway</dc:creator><author>Onway</author><pubDate>Tue, 22 Nov 2011 03:55:00 GMT</pubDate><guid>http://www.cppblog.com/Onway/archive/2011/11/22/160700.html</guid><wfw:comment>http://www.cppblog.com/Onway/comments/160700.html</wfw:comment><comments>http://www.cppblog.com/Onway/archive/2011/11/22/160700.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Onway/comments/commentRss/160700.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Onway/services/trackbacks/160700.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;http.c&nbsp;by&nbsp;Onway&nbsp;2011-11-14<br />&nbsp;*&nbsp;1，间隔1秒的两次connect避免瞬间造成的错误<br />&nbsp;*&nbsp;2，网络读写超时限制参考自《UNIX环境高级编程》第二版中文版程序清单10-8，<br />&nbsp;*&nbsp;由于程序是单线程，避免进程堵塞。<br />&nbsp;*&nbsp;3，返回值说明<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;正确返回<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;网络连接失败<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;网络IO超时<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;时钟注册失败<br />&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">global.h</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">types.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">socket.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">netinet</span><span style="color: #000000; ">/</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arpa</span><span style="color: #000000; ">/</span><span style="color: #000000; ">inet.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#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 />#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 />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">setjmp.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;PORT&nbsp;80&nbsp;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;BUFFSIZE&nbsp;10086</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;sig_alrm(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">);<br /></span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;jmp_buf&nbsp;env_alrm;<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;QueryWord(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;GString&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">word,</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;GString&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">ip,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GString&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">gstrHtml)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;g_string_erase(gstrHtml,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;http&nbsp;请求&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;GString&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">request&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;g_string_new(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">GET&nbsp;/search?q=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;g_string_append(request,word</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">str);<br />&nbsp;&nbsp;&nbsp;&nbsp;g_string_append(request,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">ue</span><span style="color: #000000; ">=</span><span style="color: #000000; ">utf8</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">keyfrom</span><span style="color: #000000; ">=</span><span style="color: #000000; ">dict.index&nbsp;HTTP</span><span style="color: #000000; ">/</span><span style="color: #000000; ">1.1</span><span style="color: #000000; ">\r\n\<br />Host:&nbsp;dict.youdao.com\r\n\<br />Connection:&nbsp;close\r\n\<br />\r\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);</span><span style="color: #000000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;网络地址&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr_in&nbsp;address;<br />&nbsp;&nbsp;&nbsp;&nbsp;address.sin_family&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;AF_INET;<br />&nbsp;&nbsp;&nbsp;&nbsp;address.sin_addr.s_addr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;inet_addr(ip</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">str);<br />&nbsp;&nbsp;&nbsp;&nbsp;address.sin_port&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;htons(PORT);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;网络连接&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;socketfd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;socket(AF_INET,SOCK_STREAM,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(connect(socketfd,(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">address,</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(address))&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(connect(socketfd,(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;sockaddr&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">address,</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(address))&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_string_free(request,TRUE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;信号注册&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(signal(SIGALRM,sig_alrm)&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;SIG_ERR)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_string_free(request,TRUE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(socketfd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(setjmp(env_alrm)&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_string_free(request,TRUE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(socketfd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;网络IO&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;alarm(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;write(socketfd,request</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">str,request</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">len);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;buf[BUFFSIZE];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(&nbsp;(n&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;read(socketfd,buf,BUFFSIZE))&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_string_append_len(gstrHtml,buf,n);<br />&nbsp;&nbsp;&nbsp;&nbsp;alarm(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;正常返回&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;g_string_free(request,TRUE);<br />&nbsp;&nbsp;&nbsp;&nbsp;close(socketfd);<br />&nbsp;&nbsp;&nbsp;&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 />}<br /></span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;sig_alrm(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;signo)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;longjmp(env_alrm,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />}<br /></span></div><img src ="http://www.cppblog.com/Onway/aggbug/160700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Onway/" target="_blank">Onway</a> 2011-11-22 11:55 <a href="http://www.cppblog.com/Onway/archive/2011/11/22/160700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>