<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>yaron&#039;s space</title>
	<atom:link href="http://yaronspace.cn/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://yaronspace.cn/blog</link>
	<description>以技术为主</description>
	<lastBuildDate>Sun, 12 Feb 2012 16:45:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>gdb调试程序之监控内存【七】</title>
		<link>http://yaronspace.cn/blog/archives/1383</link>
		<comments>http://yaronspace.cn/blog/archives/1383#comments</comments>
		<pubDate>Sun, 12 Feb 2012 08:56:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[awtach]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[rwatch]]></category>
		<category><![CDATA[watch]]></category>
		<category><![CDATA[监控内存]]></category>

		<guid isPermaLink="false">http://yaronspace.cn/blog/?p=1383</guid>
		<description><![CDATA[gdb提供awtach rwatch watch来监控调试中变量或者内存的变化 awatch 命令 awtach [expr] 当debugger read或者write该expr时，debugger 停止 rwatch 命令 rwatch [expr] 当debugger read该expr时，debugger停止 watch命令 watch [expr] 当debugger write该expr时，debugger停止 说明：expr可以是变量或者是内存地址]]></description>
			<content:encoded><![CDATA[<p>gdb提供awtach rwatch watch来监控调试中变量或者内存的变化</p>
<p><strong>awatch 命令</strong></p>
<p>awtach [expr]</p>
<p>当debugger read或者write该expr时，debugger 停止</p>
<p><strong>rwatch 命令</strong></p>
<p>rwatch [expr]</p>
<p>当debugger read该expr时，debugger停止</p>
<p><strong>watch命令</strong></p>
<p>watch [expr]</p>
<p>当debugger write该expr时，debugger停止</p>
<p>说明：expr可以是变量或者是内存地址</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1383/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2011年的最后一天</title>
		<link>http://yaronspace.cn/blog/archives/1376</link>
		<comments>http://yaronspace.cn/blog/archives/1376#comments</comments>
		<pubDate>Sat, 31 Dec 2011 09:41:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[生活感悟]]></category>
		<category><![CDATA[2011]]></category>
		<category><![CDATA[2012]]></category>

		<guid isPermaLink="false">http://yaronspace.cn/blog/?p=1376</guid>
		<description><![CDATA[马上就2012了，实验室的人都跑光了，一会我也闪人，分享个华为的年终晚会视频，比较有意思 晚上写下总结]]></description>
			<content:encoded><![CDATA[<p>马上就2012了，实验室的人都跑光了，一会我也闪人，分享个华为的年终晚会视频，比较有意思</p>
<p>晚上写下总结<br />
<embed src="http://player.youku.com/player.php/sid/XMzM3MjE3NzI0/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" allowFullscreen="true" type="application/x-shockwave-flash"></embed></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1376/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vim使用技巧小结【继续更新】</title>
		<link>http://yaronspace.cn/blog/archives/1368</link>
		<comments>http://yaronspace.cn/blog/archives/1368#comments</comments>
		<pubDate>Thu, 22 Dec 2011 08:20:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[使用技巧]]></category>

		<guid isPermaLink="false">http://yaronspace.cn/blog/?p=1368</guid>
		<description><![CDATA[笔者在本博客上之前记录了vim相关方面的用法，现在总结下，记录的文章如下： 1.    vim中recording模式详解 2.    Vim纵向编辑模式的用法 3.    vim templates模板用法介绍 4.    vim中两个实用插件doxygen和projects的安装与使用 5.    VIM查找替换归纳总结 6.    vim编辑多个文件的方法 7.   vim插件之TagList安装与使用方法 今天在云云网上看到有人发帖收集常用的vim技巧，现在也记录下 1.在以普通用户打开的VIM当中保存一个ROOT用户文件 :   w !sudo tee % 2.  把所有的行都翻转 把所有行的顺序反转， 比如： 1 2 3 变为&#62; 3 2&#62; 1 方法 :g/^/m0 解释： : 开始命令行 g 表示对匹配后面正则的行采取动作 / 开始正则 ^ 匹配行首， 这里就是想匹配所有行 / 结束正则， 后面跟的是动作]]></description>
			<content:encoded><![CDATA[<p>笔者在本博客上之前记录了vim相关方面的用法，现在总结下，记录的文章如下：</p>
<p>1.    <a title="永久链接: vim中recording模式详解" rel="bookmark" href="http://yaronspace.cn/blog/archives/1302"><strong>vim</strong>中recording模式详解</a></p>
<p>2.    <a title="永久链接: Vim纵向编辑模式的用法" rel="bookmark" href="http://yaronspace.cn/blog/archives/1205"><strong>Vim</strong>纵向编辑模式的用法</a></p>
<p>3.    <a title="永久链接: vim templates模板用法介绍" rel="bookmark" href="http://yaronspace.cn/blog/archives/868"><strong>vim</strong> templates模板用法介绍</a></p>
<p>4.    <a title="永久链接: vim中两个实用插件doxygen和projects的安装与使用" rel="bookmark" href="http://yaronspace.cn/blog/archives/682"><strong>vim</strong>中两个实用插件doxygen和projects的安装与使用</a></p>
<p>5.    <a title="永久链接: VIM查找替换归纳总结" rel="bookmark" href="http://yaronspace.cn/blog/archives/642"><strong>VIM</strong>查找替换归纳总结</a></p>
<p>6.    <a title="永久链接: vim编辑多个文件的方法" rel="bookmark" href="http://yaronspace.cn/blog/archives/530"><strong>vim</strong>编辑多个文件的方法</a></p>
<p>7.   <a title="永久链接: vim插件之TagList安装与使用方法" rel="bookmark" href="http://yaronspace.cn/blog/archives/569"><strong>vim</strong>插件之TagList安装与使用方法</a><br />
<span id="more-1368"></span><br />
今天在<a href="http://www.yunyun.com/Qa.php?qid=960884432719381389" target="_blank">云云网</a>上看到有人发帖收集常用的vim技巧，现在也记录下</p>
<p><strong>1.在以普通用户打开的VIM当中保存一个ROOT用户文件</strong></p>
<div>
<div>:   w !sudo tee %</div>
<div><strong>2.  把所有的行都翻转</strong></div>
<pre>把所有行的顺序反转， 比如：
1
2
3
变为&gt;
3
2&gt;
1
方法 <strong>:g/^/m0</strong>
解释：
<ul>
<li>: 开始命令行</li>
<li>g 表示对匹配后面正则的行采取动作</li>
<li>/ 开始正则</li>
<li>^ 匹配行首， 这里就是想匹配所有行</li>
<li>/ 结束正则， 后面跟的是动作</li>
<li>m 意思是移动</li>
<li>0 是移动的目的行， 第0行， 也就是开头</li>
</ul>

这个命令就是把每一行都移到开头， 结果就把所有行反转了
g开头的命令还有一些常用的：
<ul>
<li>删除包含foo的行   :g/foo/d</li>
<li>删除不包含foo的行 :g!/foo/d</li>
</ul>
</pre>
<p>3. ctrl+a 将光标下的数字加1<br />
   ctrl+x  将光标下数字减1</p>
<p>比较全的技巧文档：<a href="http://www.rayninfo.co.uk/vimtips.html">http://www.rayninfo.co.uk/vimtips.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1368/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>积攒人品</title>
		<link>http://yaronspace.cn/blog/archives/1356</link>
		<comments>http://yaronspace.cn/blog/archives/1356#comments</comments>
		<pubDate>Fri, 11 Nov 2011 06:53:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[生活感悟]]></category>

		<guid isPermaLink="false">http://yaronspace.cn/blog/?p=1356</guid>
		<description><![CDATA[最近人品开始暴跌 我要开始积攒人品]]></description>
			<content:encoded><![CDATA[<p>最近人品开始暴跌</p>
<p>我要开始积攒人品</p>
<p><a rel="attachment wp-att-1361" href="http://yaronspace.cn/blog/archives/1356/gic3309294"><img class="aligncenter size-medium wp-image-1361" title="gic3309294" src="http://yaronspace.cn/blog/wp-content/uploads/2011/11/gic3309294-199x300.jpg" alt="" width="199" height="300" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1356/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于const与volatile笔试题目的分析</title>
		<link>http://yaronspace.cn/blog/archives/1347</link>
		<comments>http://yaronspace.cn/blog/archives/1347#comments</comments>
		<pubDate>Mon, 17 Oct 2011 06:26:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[面试题]]></category>
		<category><![CDATA[const]]></category>
		<category><![CDATA[const_cast]]></category>
		<category><![CDATA[volatile]]></category>

		<guid isPermaLink="false">http://yaronspace.cn/blog/?p=1347</guid>
		<description><![CDATA[昨天笔试遇到了关于c++中关于const与const_cast的题目，大概如下： CPP CODEint main&#40;int argc, char* argv&#91;&#93;&#41; &#123; const int a = 10; int * p = const_cast&#60;int *&#62;&#40;&#38;a&#41;; *p = 1; printf&#40;&#34;%d %d\n&#34;, a, *p&#41;; return 0; &#125; 求上述程序的输出结果，正确答案是：10 1 分析如下： 首先可以确定是p和&#038;a的地址是指向同一片内存区域的，理论上来说最后的输出结果应该是1 1 但是为什么会输出a的值为10呢？ 猜测应该是const关键字的问题，可能编译器看到a为const型变量，所以在编译期就将所有的a直接替换为10了，这个是编译器做的一个优化， 下面简单的验证下： 直接使用下面的命令来看下编译后的汇编代码，关键部分的汇编如下： ASM CODE movl %edi, -20&#40;%rbp&#41; movq %rsi, -32&#40;%rbp&#41; movl $10, -12&#40;%rbp&#41; leaq -12&#40;%rbp&#41;, %rax movq %rax, -8&#40;%rbp&#41;]]></description>
			<content:encoded><![CDATA[<p>昨天笔试遇到了关于c++中关于const与const_cast的题目，大概如下：</p>

<div class="wp_syntax"><div class="code_title">CPP CODE</div><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
     <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
     <span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span> p <span style="color: #000080;">=</span> <span style="color: #0000ff;">const_cast</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span><span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #000040;">*</span>p <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
     <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, a, <span style="color: #000040;">*</span>p<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>求上述程序的输出结果，正确答案是：10  1</p>
<h3>分析如下：</h3>
<p>首先可以确定是p和&#038;a的地址是指向同一片内存区域的，理论上来说最后的输出结果应该是1  1<br />
但是为什么会输出a的值为10呢？ 猜测应该是const关键字的问题，可能编译器看到a为const型变量，所以在编译期就将所有的a直接替换为10了，这个是编译器做的一个优化，<br />
<strong>下面简单的验证下：</strong><br />
直接使用下面的命令来看下编译后的汇编代码，关键部分的汇编如下：</p>

<div class="wp_syntax"><div class="code_title">ASM CODE</div><div class="code"><pre class="asm" style="font-family:monospace;">        movl    <span style="color: #339933;">%</span><span style="color: #00007f;">edi</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">20</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span>rbp<span style="color: #009900; font-weight: bold;">&#41;</span>
        movq    <span style="color: #339933;">%</span>rsi<span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">32</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span>rbp<span style="color: #009900; font-weight: bold;">&#41;</span>
        movl    $<span style="color: #0000ff;">10</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">12</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span>rbp<span style="color: #009900; font-weight: bold;">&#41;</span>
        leaq    <span style="color: #339933;">-</span><span style="color: #0000ff;">12</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span>rbp<span style="color: #009900; font-weight: bold;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span>rax
        movq    <span style="color: #339933;">%</span>rax<span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000ff;">8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span>rbp<span style="color: #009900; font-weight: bold;">&#41;</span>
        movq    <span style="color: #339933;">-</span><span style="color: #0000ff;">8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span>rbp<span style="color: #009900; font-weight: bold;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span>rax
        movl    $<span style="color: #0000ff;">1</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span>rax<span style="color: #009900; font-weight: bold;">&#41;</span>
        movq    <span style="color: #339933;">-</span><span style="color: #0000ff;">8</span><span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span>rbp<span style="color: #009900; font-weight: bold;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span>rax
        movl    <span style="color: #009900; font-weight: bold;">&#40;</span><span style="color: #339933;">%</span>rax<span style="color: #009900; font-weight: bold;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">edx</span>
        movl    $<span style="color: #0000ff;">10</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">esi</span>
        movl    $<span style="color: #339933;">.</span>LC0<span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">edi</span>
        movl    $<span style="color: #0000ff;">0</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">eax</span>
        <span style="color: #00007f; font-weight: bold;">call</span>    printf
        movl    $<span style="color: #0000ff;">0</span><span style="color: #339933;">,</span> <span style="color: #339933;">%</span><span style="color: #00007f;">eax</span>
        <span style="color: #00007f; font-weight: bold;">leave</span>
        <span style="color: #00007f; font-weight: bold;">ret</span></pre></div></div>

<p>显然%rax中存放的指针p的值，(%rax)代表间接寻址<br />
在调用printf函数之前，将10放入%esi, (%rax)放入到%edx中，显然验证了上述的猜想</p>
<h3>关于volatile关键字</h3>
<p>如何避免编译器做这方面的优化呢？<br />
一个常用的方法是将变量a加上关键字volatile，代表是&#8221;易变，每次都需要从内存中读取，这样上述程序的运行结果就是1  1了<br />
<strong>当然修改常量变量的值不是好的编程习惯，尽量还是少用上述用法</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1347/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux关于sort命令的高级用法（按多个列值进行排列）</title>
		<link>http://yaronspace.cn/blog/archives/1343</link>
		<comments>http://yaronspace.cn/blog/archives/1343#comments</comments>
		<pubDate>Sat, 08 Oct 2011 11:32:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[sort]]></category>
		<category><![CDATA[分割符]]></category>
		<category><![CDATA[多列排列]]></category>

		<guid isPermaLink="false">http://yaronspace.cn/blog/?p=1343</guid>
		<description><![CDATA[如果单纯地使用sort按行进行排序比较简单， 但是使用sort按多个列值排列，同时使用tab作为分隔符，而且对于某些列需要进行逆序排列，这样sort命令写起来就比较麻烦了 比如下面的文件内容，使用[TAB]进行分割: Group-ID   Category-ID   Text        Frequency ---------------------------------------------- 200        1000          oranges     10 200        900           bananas     5 200        1000          pears       8 200        1000          lemons      10 200        900           figs        4 190        700           grapes      17 下面使用这些列进行排序（列4在列3之前进行排序，而且列4是逆序排列） * Group ID (integer) * Category]]></description>
			<content:encoded><![CDATA[<p>如果单纯地使用sort按行进行排序比较简单，</p>
<p>但是使用sort按多个列值排列，同时使用tab作为分隔符，而且对于某些列需要进行逆序排列，这样sort命令写起来就比较麻烦了</p>
<p>比如下面的文件内容，使用[TAB]进行分割:</p>
<pre>Group-ID   Category-ID   Text        Frequency
----------------------------------------------
200        1000          oranges     10
200        900           bananas     5
200        1000          pears       8
200        1000          lemons      10
200        900           figs        4
190        700           grapes      17</pre>
<p>下面使用这些列进行排序（列4在列3之前进行排序，而且列4是逆序排列）</p>
<pre>
    * Group ID (integer)
    * Category ID (integer)
    * Frequency “sorted in reverse order” (integer)
    * Text (alpha-numeric)
</pre>
<p>排序后的结果应该为：</p>
<pre>
Group-ID   Category-ID   Text        Frequency
----------------------------------------------
190        700           grapes      17
200        900           bananas     5
200        900           figs        4
200        1000          lemons      10
200        1000          oranges     10
200        1000          pears       8
</pre>
<p>可以直接使用sort命令来解决这个问题：</p>

<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sort</span> <span style="color: #660033;">-t</span> $<span style="color: #ff0000;">'\t'</span> <span style="color: #660033;">-k</span> 1n,<span style="color: #000000;">1</span> <span style="color: #660033;">-k</span> 2n,<span style="color: #000000;">2</span> -k4rn,<span style="color: #000000;">4</span> -k3,<span style="color: #000000;">3</span> <span style="color: #000000; font-weight: bold;">&lt;</span>my-file<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p><strong>解释如下：</strong></p>
<pre>
-t $'\t'：指定TAB为分隔符
-k 1, 1: 按照第一列的值进行排序，如果只有一个1的话，相当于告诉sort从第一列开始直接到行尾排列
n:代表是数字顺序，默认情况下市字典序，如10<2
r: reverse 逆序排列，默认情况下市正序排列
</pre>
<p>所以最后的命令：<strong>sort -t $'\t' -k 1n,1 -k 2n,2 -k4rn,4 -k3,3 my-file</strong></p>
<p>参考资料：<a href="http://www.btaz.com/unixlinux/unixlinux-sort-multiple-columns-tab-delimited-and-reverse-sort-order/"></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1343/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>register、volatile、restrict 三关键字的用法[转载]</title>
		<link>http://yaronspace.cn/blog/archives/1341</link>
		<comments>http://yaronspace.cn/blog/archives/1341#comments</comments>
		<pubDate>Thu, 06 Oct 2011 08:25:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[面试题]]></category>
		<category><![CDATA[register]]></category>
		<category><![CDATA[restrict]]></category>
		<category><![CDATA[volatile]]></category>

		<guid isPermaLink="false">http://yaronspace.cn/blog/?p=1341</guid>
		<description><![CDATA[原文地址：register、volatile、restrict 三关键字的用法 – RaymondAmos的技术专栏 – CSDN博客. register 使用修饰符register声明的变量属于寄存器存储类型。该类型与自动存储类型相似，具有自动存储时期、代码块作用域和内连接。声明为register 仅仅是一个请求，因此该变量仍然可能是普通的自动变量。无论哪种情况，用register修饰的变量都无法获取地址。如果没有被初始化，它的值是未定的。 volatile volatile告诉编译器该被变量除了可被程序修改外，还可能被其他代理、线程修改。因此，当使用volatile 声明的变量的值的时候，系统总是重新从它所在的内存读取数据，而不使用寄存器中的缓存的值。比如， CPP CODEval1=x; val2=x; 如 果没有声明volatile，系统在给val2赋值的时候可能直接从寄存器读取x，而不是从内存的初始位置读取。那么在两次赋值之间，x完全有可能被被某 些编译器未知的因素更改（比如：操作系统、硬件或者其它线程等）。如果声明为volatile，编译器将不使用缓存，而是每次都从内存重新读取x。 restrict restrict是c99引入的，它只可以用于限定指针，并表明指针是访问一个数据对象的唯一且初始的方式，考虑下面的例子： CPP CODEint ar&#91;10&#93;; int * restrict restar=&#40;int *&#41;malloc&#40;10*sizeof&#40;int&#41;&#41;; int *par=ar; 这里说明restar是访问由malloc()分配的内存的唯一且初始的方式。par就不是了。那么： CPP CODEfor&#40;n=0;n&#60;10;n++&#41; &#123; par&#91;n&#93;+=5; restar&#91;n&#93;+=5; ar&#91;n&#93;*=2; par&#91;n&#93;+=3; restar&#91;n&#93;+=3; &#125; 因 为restar是访问分配的内存的唯一且初始的方式，那么编译器可以将上述对restar的操作进行优化：restar[n]+=8;。而par并不是访 问数组ar的唯一方式，因此并不能进行下面的优化：par[n]+=8;。因为在par[n]+=3前，ar[n]*=2进行了改变。使用了关键字 restric，编译器就可以放心地进行优化了。这个关键字据说来源于古老的FORTRAN。 总结 两个关键字：volatile和restrict，两者都是为了方便编译器的优化。]]></description>
			<content:encoded><![CDATA[<p>原文地址：<a href="http://blog.csdn.net/hxg130435477/article/details/6636023">register、volatile、restrict 三关键字的用法 – RaymondAmos的技术专栏 – CSDN博客</a>.</p>
<p><strong>register</strong></p>
<p>使用修饰符register声明的变量属于寄存器存储类型。该类型与自动存储类型相似，具有自动存储时期、代码块作用域和内连接。声明为register 仅仅是一个请求，因此该变量仍然可能是普通的自动变量。无论哪种情况，用register修饰的变量都无法获取地址。如果没有被初始化，它的值是未定的。</p>
<p><strong> </strong></p>
<p><strong>volatile</strong><br />
volatile告诉编译器该被变量除了可被程序修改外，还可能被其他代理、线程修改。因此，当使用volatile 声明的变量的值的时候，系统总是重新从它所在的内存读取数据，而不使用寄存器中的缓存的值。比如，</p>

<div class="wp_syntax"><div class="code_title">CPP CODE</div><div class="code"><pre class="cpp" style="font-family:monospace;">val1<span style="color: #000080;">=</span>x<span style="color: #008080;">;</span>
val2<span style="color: #000080;">=</span>x<span style="color: #008080;">;</span></pre></div></div>

<p>如 果没有声明volatile，系统在给val2赋值的时候可能直接从寄存器读取x，而不是从内存的初始位置读取。那么在两次赋值之间，x完全有可能被被某 些编译器未知的因素更改（比如：操作系统、硬件或者其它线程等）。如果声明为volatile，编译器将不使用缓存，而是每次都从内存重新读取x。<br />
<strong>restrict</strong></p>
<p>restrict是c99引入的，它只可以用于限定指针，并表明指针是访问一个数据对象的唯一且初始的方式，考虑下面的例子：</p>

<div class="wp_syntax"><div class="code_title">CPP CODE</div><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> ar<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span> restrict restar<span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">malloc</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">10</span><span style="color: #000040;">*</span><span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span>par<span style="color: #000080;">=</span>ar<span style="color: #008080;">;</span></pre></div></div>

<p>这里说明restar是访问由malloc()分配的内存的唯一且初始的方式。par就不是了。那么：</p>

<div class="wp_syntax"><div class="code_title">CPP CODE</div><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span>n<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>n<span style="color: #000080;">&lt;</span><span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>n<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    par<span style="color: #008000;">&#91;</span>n<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span><span style="color: #000080;">=</span><span style="color: #0000dd;">5</span><span style="color: #008080;">;</span>
    restar<span style="color: #008000;">&#91;</span>n<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span><span style="color: #000080;">=</span><span style="color: #0000dd;">5</span><span style="color: #008080;">;</span>
    ar<span style="color: #008000;">&#91;</span>n<span style="color: #008000;">&#93;</span><span style="color: #000040;">*</span><span style="color: #000080;">=</span><span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
    par<span style="color: #008000;">&#91;</span>n<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span><span style="color: #000080;">=</span><span style="color: #0000dd;">3</span><span style="color: #008080;">;</span>
    restar<span style="color: #008000;">&#91;</span>n<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span><span style="color: #000080;">=</span><span style="color: #0000dd;">3</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>因 为restar是访问分配的内存的唯一且初始的方式，那么编译器可以将上述对restar的操作进行优化：restar[n]+=8;。而par并不是访 问数组ar的唯一方式，因此并不能进行下面的优化：par[n]+=8;。因为在par[n]+=3前，ar[n]*=2进行了改变。使用了关键字 restric，编译器就可以放心地进行优化了。这个关键字据说来源于古老的FORTRAN。</p>
<p><strong>总结</strong></p>
<p>两个关键字：volatile和restrict，两者都是为了方便编译器的优化。</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1341/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>今天EMC笔试题目</title>
		<link>http://yaronspace.cn/blog/archives/1338</link>
		<comments>http://yaronspace.cn/blog/archives/1338#comments</comments>
		<pubDate>Sun, 25 Sep 2011 11:41:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[面试题]]></category>
		<category><![CDATA[emc]]></category>
		<category><![CDATA[笔试题]]></category>

		<guid isPermaLink="false">http://yaronspace.cn/blog/?p=1338</guid>
		<description><![CDATA[两道的题目： 1. dup(int fd)和dup2(int fd1, int fd2)函数的区别：详细请见http://blog.donews.com/mutecat/archive/2007/09/20/1212178.aspx 2. 有关一致性哈希的算法设计 其他的是 多项选择题目，涉及的范围比较广，linux和语言层次的题目偏多一些吧 包括堆栈缓冲区溢出以及linux内核中container_of宏的实现，以及spinlock和虚拟内存的相关知识 关于container_of这个请参考我的前一篇blog: http://yaronspace.cn/blog/index.php/archives/1026]]></description>
			<content:encoded><![CDATA[<p>两道的题目：</p>
<p>1. dup(int fd)和dup2(int fd1, int fd2)函数的区别：详细请见<a href="http://blog.donews.com/mutecat/archive/2007/09/20/1212178.aspx">http://blog.donews.com/mutecat/archive/2007/09/20/1212178.aspx</a></p>
<p>2. 有关一致性哈希的算法设计</p>
<p>其他的是 多项选择题目，涉及的范围比较广，linux和语言层次的题目偏多一些吧</p>
<p>包括堆栈缓冲区溢出以及linux内核中container_of宏的实现，以及spinlock和虚拟内存的相关知识</p>
<p>关于container_of这个请参考我的前一篇blog: <span style="color: #888888;"><a href="http://yaronspace.cn/blog/index.php/archives/1026">http://yaronspace.cn/blog/index.php/archives/1026</a></span></p>
<p><span style="color: #888888;"> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1338/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>debian系统sshd连接慢的解决办法</title>
		<link>http://yaronspace.cn/blog/archives/1336</link>
		<comments>http://yaronspace.cn/blog/archives/1336#comments</comments>
		<pubDate>Fri, 26 Aug 2011 02:42:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[sshd]]></category>
		<category><![CDATA[连接慢]]></category>

		<guid isPermaLink="false">http://yaronspace.cn/blog/?p=1336</guid>
		<description><![CDATA[最近客户端连debian下sshd很慢，每次都需要等待半分钟左右，今天终于无法忍受了，上网找了下资料，把这个问题解决了 原因： 主要是debian在默认情况下开启了dns的反向解析，这个比较耗时 解决方法： 1. 编辑/etc/nsswitch.conf 找到hosts行，替换为 hosts: files dns [NOTFOUND=return] 2. 查看/etc/resolv.conf文件，查看dns地址是否设置正确，如果没有用，直接注掉即可 3. 重启sshd ： 先kill掉，然后/usr/sbin/sshd 启功即可]]></description>
			<content:encoded><![CDATA[<p>最近客户端连debian下sshd很慢，每次都需要等待半分钟左右，今天终于无法忍受了，上网找了下资料，把这个问题解决了</p>
<p><strong>原因：</strong></p>
<p>主要是debian在默认情况下开启了dns的反向解析，这个比较耗时</p>
<p><strong>解决方法：</strong></p>
<p>1. 编辑/etc/nsswitch.conf 找到hosts行，替换为</p>
<p>hosts: files dns [NOTFOUND=return]</p>
<p>2. 查看/etc/resolv.conf文件，查看dns地址是否设置正确，如果没有用，直接注掉即可</p>
<p>3. 重启sshd ： 先kill掉，然后/usr/sbin/sshd 启功即可</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1336/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux下多线程编程的几篇不错的博文</title>
		<link>http://yaronspace.cn/blog/archives/1333</link>
		<comments>http://yaronspace.cn/blog/archives/1333#comments</comments>
		<pubDate>Tue, 23 Aug 2011 14:15:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[多线程]]></category>
		<category><![CDATA[注意事项]]></category>

		<guid isPermaLink="false">http://yaronspace.cn/blog/?p=1333</guid>
		<description><![CDATA[1. 多线程服务器的常用编程模型 2. 多线程服务器的适用场合 3. 并发编程的 15 条建议(译) 4. C++ 多线程系统编程精要 选自陈硕的blog : http://blog.csdn.net/solstice]]></description>
			<content:encoded><![CDATA[<p>1. <a title="多线程服务器的常用编程模型" href="http://blog.csdn.net/solstice/article/details/5307710">多线程服务器的常用编程模型</a></p>
<p>2. <a title="多线程服务器的适用场合" href="http://blog.csdn.net/solstice/article/details/5334243">多线程服务器的适用场合</a></p>
<p>3. <a title="并发编程的 15 条建议(译)" href="http://blog.csdn.net/solstice/article/details/5915355">并发编程的 15 条建议(译)</a></p>
<p>4. <a title="C++ 多线程系统编程精要" href="http://blog.csdn.net/solstice/article/details/6181488">C++ 多线程系统编程精要</a></p>
<p>选自陈硕的blog : <a href="http://blog.csdn.net/solstice">http://blog.csdn.net/solstice</a></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1333/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>查看 CPU, Memory, I/O and NetFlow[转载]</title>
		<link>http://yaronspace.cn/blog/archives/1331</link>
		<comments>http://yaronspace.cn/blog/archives/1331#comments</comments>
		<pubDate>Wed, 10 Aug 2011 01:23:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[iostat]]></category>
		<category><![CDATA[linux命令]]></category>
		<category><![CDATA[top]]></category>
		<category><![CDATA[vmstat]]></category>

		<guid isPermaLink="false">http://yaronspace.cn/blog/?p=1331</guid>
		<description><![CDATA[原文地址：http://blogread.cn/it/article.php?id=3908&#38;f=sa iostat 查看磁盘 I/O [root@localhost ~]# iostat -d -x 2 extended device statistics device mgr/s mgw/s r/s w/s kr/s kw/s size queue wait svc_t %b hda 0 0 0.0 0.9 0.1 5.4 6.3 0.0 4.7 0.9 0 extended device statistics device mgr/s mgw/s r/s w/s kr/s kw/s size queue wait svc_t %b hda 0 3]]></description>
			<content:encoded><![CDATA[<p>原文地址：<a href="http://blogread.cn/it/article.php?id=3908&amp;f=sa">http://blogread.cn/it/article.php?id=3908&amp;f=sa</a></p>
<h3>iostat 查看磁盘 I/O</h3>
<pre>[root@localhost ~]# iostat -d -x 2
                             extended device statistics
device mgr/s mgw/s    r/s    w/s    kr/s    kw/s   size queue   wait svc_t  %b
hda        0     0    0.0    0.9     0.1     5.4    6.3   0.0    4.7   0.9   0
                             extended device statistics
device mgr/s mgw/s    r/s    w/s    kr/s    kw/s   size queue   wait svc_t  %b
hda        0     3    0.0    2.0     0.0    20.0   10.0   0.0    0.8   0.5   0
 ......
</pre>
<p>命令释意: 查看磁盘 I/0 情况，且每两秒刷新一次</p>
<pre>[root@localhost ~]# vmstat 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0    284  68700 165876 416748    0    0     0     5    1    1  0  0 100  0  0
 ......
</pre>
<p>命令释意: 查看CPU使用情况的命令, 每 5 秒刷新一次，最右侧列为 CPU 的占用率的数据</p>
<h3>top 查看进程占有率</h3>
<pre>[root@localhost ~]# top
</pre>
<p>然后在 top 的命令内部命令栏输入shift+p or P</p>
<pre>top - 13:38:52 up 102 days,  4:17,  1 user,  load average: 0.00, 0.00, 0.00
Tasks:  81 total,   2 running,  79 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1035292k total,   966592k used,    68700k free,   165876k buffers
Swap:  2096472k total,      284k used,  2096188k free,   416760k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 4875 root      15   0  2192 1000  800 R  0.3  0.1   0:00.15 top
    1 root      15   0  2060  620  532 S  0.0  0.1   0:01.65 init
    2 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 migration/0
.......
</pre>
<p>命令释意: 查看进程处理器占用率情况，并对其进行排序</p>
<h3>free 查看内存使用情况</h3>
<pre>[root@localhost ~]# free
             total       used       free     shared    buffers     cached
Mem:       1035292     966592      68700          0     165876     416768
-/+ buffers/cache:     383948     651344
Swap:      2096472        284    2096188
</pre>
<p>命令释意: 查看内存使用情况</p>
<h3>top 查看进程内存使用</h3>
<pre>[root@localhost ~]# top
</pre>
<p>然后在 top 的命令内部命令栏输入shift+m or M</p>
<pre>top - 13:48:52 up 102 days,  4:27,  1 user,  load average: 0.00, 0.01, 0.00
Tasks:  81 total,   2 running,  79 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1035292k total,   966592k used,    68700k free,   165876k buffers
Swap:  2096472k total,      284k used,  2096188k free,   416784k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 4128 root      34  19  280m 266m 2112 S  0.0 26.4   1:48.40 yum-updatesd
 8314 www       18   0  171m  34m  34m S  0.0  3.4   0:06.03 memcacheq
 8280 www       15   0 88084  34m  588 S  0.0  3.4   0:01.23 memcached
10907 mysql     15   0  122m  16m 3892 S  0.0  1.7   0:25.29 mysqld
......
</pre>
<p>命令释意: 查看进程内存占用率情况，并对其进行排序<br />
<span id="more-1331"></span></p>
<h3>获得针对某个 Interface 的网络流量</h3>
<pre>[root@localhost ~]# date;ifconfig eth0
Sun Mar 13 13:51:29 CST 2011
eth0      Link encap:Ethernet  HWaddr 00:50:56:A4:0D:89
          inet addr:172.10.7.215  Bcast:172.10.7.255  Mask:255.255.248.0
          inet6 addr: fe80::250:56ff:fea4:d89/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:72113071 errors:12213 dropped:30790 overruns:0 frame:0
          TX packets:1062902 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3311165612 (3.0 GiB)  TX bytes:101244262 (96.5 MiB)
          Interrupt:59 Base address:0x2000

[root@localhost ~]# date;ifconfig eth0
Sun Mar 13 13:53:13 CST 2011
eth0      Link encap:Ethernet  HWaddr 00:50:56:A4:0D:89
          inet addr:172.10.7.215  Bcast:172.10.7.255  Mask:255.255.248.0
          inet6 addr: fe80::250:56ff:fea4:d89/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:72113528 errors:12213 dropped:30790 overruns:0 frame:0
          TX packets:1062968 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3311204659 (3.0 GiB)  TX bytes:101285190 (96.5 MiB)
          Interrupt:59 Base address:0x2000
</pre>
<p>命令释意: 通过比较两个时间网络接口的 <strong>RX</strong> 和 <strong>TX</strong> 数据来获得针对某个 Interface 的网络流量</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1331/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[编程之美]随机数范围扩展方法总结</title>
		<link>http://yaronspace.cn/blog/archives/1326</link>
		<comments>http://yaronspace.cn/blog/archives/1326#comments</comments>
		<pubDate>Wed, 03 Aug 2011 02:50:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[编程之美]]></category>
		<category><![CDATA[随机数范围扩展方法]]></category>

		<guid isPermaLink="false">http://yaronspace.cn/blog/?p=1326</guid>
		<description><![CDATA[问题描述 已知random3()这个随机数产生器生成[1, 3]范围的随机数，请用random3()构造random5()函数，生成[1, 5]的随机数？ 问题分析 如何从[1-3]范围的数构造更大范围的数呢？同时满足这个更大范围的数出现概率是相同的，可以想到的运算包括两种：加法和乘法 考虑下面的表达式： 3 * (random3() &#8211; 1) + random3(); 可以计算得到上述表达式的范围是[1, 9]  而且数的出现概率是相同的，即1/9 下面考虑如何从[1, 9]范围的数生成[1, 5]的数呢？ 可以想到的方法就是 rejection sampling 方法，即生成[1, 9]的随机数，如果数的范围不在[1, 5]内，则重新取样 解决方法 CPP CODEint random5&#40;&#41; &#123; int val = 0; do &#123; val = 3 * &#40;random3&#40;&#41; - 1&#41; + random3&#40;&#41;; &#125; while &#40;val &#62; 5&#41;; return val; &#125; 归纳总结]]></description>
			<content:encoded><![CDATA[<h4>问题描述</h4>
<p>已知random3()这个随机数产生器生成[1, 3]范围的随机数，请用random3()构造random5()函数，生成[1, 5]的随机数？</p>
<h4>问题分析</h4>
<p>如何从[1-3]范围的数构造更大范围的数呢？同时满足这个更大范围的数出现概率是相同的，可以想到的运算包括两种：加法和乘法</p>
<p>考虑下面的表达式：</p>
<p><span style="color: #ff0000;"><strong>3 * (random3() &#8211; 1) + random3();</strong></span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">可以计算得到上述表达式的范围是[1, 9]  而且数的出现概率是相同的，即1/9 </span></span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">下面考虑如何从[1, 9]范围的数生成[1, 5]的数呢？</span></span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">可以想到的方法就是 rejection sampling 方法，即生成[1, 9]的随机数，如果数的范围不在[1, 5]内，则重新取样</span></span></p>
<h4><span style="color: #ff0000;"><span style="color: #000000;">解决方法</span></span></h4>

<div class="wp_syntax"><div class="code_title">CPP CODE</div><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> random5<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span> val <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">do</span> <span style="color: #008000;">&#123;</span>
        val <span style="color: #000080;">=</span> <span style="color: #0000dd;">3</span> <span style="color: #000040;">*</span> <span style="color: #008000;">&#40;</span>random3<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> random3<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>val <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> val<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<h4>归纳总结</h4>
<p>将这个问题进一步抽象，已知random_m()随机数生成器的范围是[1, m] 求random_n()生成[1, n]范围的函数，m &lt; n &amp;&amp; n &lt;= m *m<br />
一般解法：</p>

<div class="wp_syntax"><div class="code_title">CPP CODE</div><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> random_n<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span> val <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span> <span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> t<span style="color: #008080;">;</span> <span style="color: #666666;">// t为n最大倍数，且满足 t &amp;lt;= m * m     </span>
    <span style="color: #0000ff;">do</span> <span style="color: #008000;">&#123;</span>         
        val <span style="color: #000080;">=</span> m <span style="color: #000040;">*</span> <span style="color: #008000;">&#40;</span>random_m<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> random_m<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>     
    <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>val <span style="color: #000080;">&gt;</span> t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> val<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<h4>参考资料：</h4>
<p><a href="http://stackoverflow.com/questions/137783/expand-a-random-range-from-1-5-to-1-7">http://stackoverflow.com/questions/137783/expand-a-random-range-from-1-5-to-1-7</a></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1326/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>推荐firefox插件vimperator (用vim方式使用Firefox)</title>
		<link>http://yaronspace.cn/blog/archives/1323</link>
		<comments>http://yaronspace.cn/blog/archives/1323#comments</comments>
		<pubDate>Mon, 18 Jul 2011 13:09:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[业界趣闻轶事]]></category>
		<category><![CDATA[开源软件]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[vimperator]]></category>

		<guid isPermaLink="false">http://yaronspace.cn/blog/?p=1323</guid>
		<description><![CDATA[今天在逛水木的时候，发现这篇文章：http://www.newsmth.net/bbsrecon.php?id=8017 是对vimperator进行了介绍，原来国外哥们写的firefox插件，能够像使用Vim的方式来高效地使用firefox，下来来尝试了，效果不错！ 下载地址：https://addons.mozilla.org/en-US/firefox/addon/vimperator/ 常用命令（不断更新）： open: 在当前tab打开新的网址  open www.baidu.com tabopen: 在新的tab打开网址 back: 后退键 forward:前进键 gt/gT：在tab间进行移动 d: 关闭当前tab hjkl:上下移动网页或者光标 i(insert)：进入insert模式，可以移动光标 / ：搜索网页的内容 总的来说很强大哈!!!]]></description>
			<content:encoded><![CDATA[<p>今天在逛水木的时候，发现这篇文章：<a href="http://www.newsmth.net/bbsrecon.php?id=8017">http://www.newsmth.net/bbsrecon.php?id=8017</a></p>
<p>是对vimperator进行了介绍，原来国外哥们写的firefox插件，能够像使用Vim的方式来高效地使用firefox，下来来尝试了，效果不错！</p>
<p>下载地址：<cite>https://addons.mozilla.org/en-US/firefox/addon/<strong>vimperator</strong>/</cite></p>
<p><strong>常用命令（不断更新）：</strong></p>
<p>open: 在当前tab打开新的网址  open www.baidu.com</p>
<p>tabopen: 在新的tab打开网址</p>
<p>back: 后退键</p>
<p>forward:前进键</p>
<p>gt/gT：在tab间进行移动</p>
<p>d: 关闭当前tab</p>
<p>hjkl:上下移动网页或者光标</p>
<p>i(insert)：进入insert模式，可以移动光标</p>
<p>/ ：搜索网页的内容</p>
<p>总的来说很强大哈!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1323/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL索引背后的数据结构及算法原理【好文】</title>
		<link>http://yaronspace.cn/blog/archives/1320</link>
		<comments>http://yaronspace.cn/blog/archives/1320#comments</comments>
		<pubDate>Mon, 18 Jul 2011 12:59:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mysql]]></category>
		<category><![CDATA[索引结构]]></category>

		<guid isPermaLink="false">http://yaronspace.cn/blog/?p=1320</guid>
		<description><![CDATA[这篇文章从mysql索引的内部结构B+树来分析如何来提高索引的性能，以及索引如何进行存储等方面， 写的比较通俗易懂，推荐！ 地址：http://www.cnblogs.com/leoo2sk/archive/2011/07/10/mysql-index.html]]></description>
			<content:encoded><![CDATA[<p>这篇文章从mysql索引的内部结构B+树来分析如何来提高索引的性能，以及索引如何进行存储等方面，</p>
<p>写的比较通俗易懂，推荐！</p>
<p>地址：<a href="http://www.cnblogs.com/leoo2sk/archive/2011/07/10/mysql-index.html">http://www.cnblogs.com/leoo2sk/archive/2011/07/10/mysql-index.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1320/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>140个Google的面试题【转载】</title>
		<link>http://yaronspace.cn/blog/archives/1315</link>
		<comments>http://yaronspace.cn/blog/archives/1315#comments</comments>
		<pubDate>Sat, 16 Jul 2011 09:39:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[面试题]]></category>

		<guid isPermaLink="false">http://yaronspace.cn/blog/?p=1315</guid>
		<description><![CDATA[原文地址：http://coolshell.cn/articles/3345.html 来源：http://blog.seattleinterviewcoach.com/2009/02/140-google-interview-questions.html（墙） 某猎头收集了140多个Google的面试题，都张到他的Blog中了，主要是下面这些职位的，因为被墙，且无任何敏感信息，所以，我原文搬过来了。 Product Marketing Manager Product Manager Software Engineer Software Engineer in Test Quantitative Compensation Analyst Engineering Manager AdWords Associate 这篇Blog例举了Google用来面试下面这几个职位的面试题。很多不是很容易回答，不过都比较经典与变态，是 Google，Microsoft，Amazon之类的公司的风格。对于本文，我没有翻译，因为我相信，英文问题是最好的。不过对于有些问题，我做了一些 注释，不一定对，但希望对你有帮助启发。对于一些问题，如果你百思不得其解，可以Google一下，StackOverflow或是Wikipedia上 可能会给你非常全面的答案。 Product Marketing Manager Why do you want to join Google? What do you know about Google’s product and technology? If you are Product Manager for Google’s Adwords, how do you]]></description>
			<content:encoded><![CDATA[<p>原文地址：<a href="http://coolshell.cn/articles/3345.html">http://coolshell.cn/articles/3345.html</a></p>
<p>来源：<a href="http://blog.seattleinterviewcoach.com/2009/02/140-google-interview-questions.html" target="_blank">http://blog.seattleinterviewcoach.com/2009/02/140-google-interview-questions.html</a>（墙）<br />
<img title="Google 面试题 " src="http://coolshell.cn/wp-content/uploads/2010/12/googlequestion-300x225.jpg" alt="" width="210" height="158" /></p>
<div>某猎头收集了140多个Google的面试题，都张到他的Blog中了，主要是下面这些职位的，因为被墙，且无任何敏感信息，所以，我原文搬过来了。</div>
<div>
<ul>
<li>Product Marketing Manager</li>
<li>Product Manager</li>
<li>Software Engineer</li>
<li>Software Engineer in Test</li>
<li>Quantitative Compensation Analyst</li>
<li>Engineering Manager</li>
<li>AdWords Associate</li>
</ul>
</div>
<p>这篇Blog例举了Google用来面试下面这几个职位的面试题。很多不是很容易回答，不过都比较经典与变态，是 Google，Microsoft，Amazon之类的公司的风格。对于本文，我没有翻译，因为我相信，英文问题是最好的。不过对于有些问题，我做了一些 注释，不一定对，但希望对你有帮助启发。对于一些问题，如果你百思不得其解，可以Google一下，StackOverflow或是Wikipedia上 可能会给你非常全面的答案。</p>
<div><strong>Product Marketing Manager</strong></div>
<div>
<div>
<ul>
<li>Why do you want to join Google?</li>
<li>What do you know about Google’s product and technology?</li>
<li>If you are Product Manager for Google’s Adwords, how do you plan to market this?</li>
<li>What would you say during an AdWords or AdSense product seminar?</li>
<li>Who are Google’s competitors, and how does Google compete with them?</li>
<li>Have you ever used Google’s products? Gmail?</li>
<li>What’s a creative way of marketing Google’s brand name and product?</li>
<li>If you are the product marketing manager for Google’s Gmail product,  how do you plan to market it so as to achieve 100 million customers in 6  months?</li>
<li>How much money you think Google makes daily from Gmail ads?</li>
<li>Name a piece of technology you’ve read about recently. Now tell me your own creative execution for an ad for that product.</li>
<li>Say an advertiser makes $0.10 every time someone clicks on their ad.   Only 20% of people who visit the site click on their ad.  How many  people need to visit the site for the advertiser to make $20?</li>
<li>Estimate the number of students who are college seniors, attend  four-year schools, and graduate with a job in the United States every  year.</li>
</ul>
</div>
</div>
<div><strong>Product Manager</strong></div>
<div>
<div>
<ul>
<li>How would you boost the GMail subscription base?</li>
<li>What is the most efficient way to sort a million integers?  （陈皓：merge sort）</li>
<li>How would you re-position Google’s offerings to counteract competitive threats from Microsoft?</li>
<li>How many golf balls can fit in a school bus?  （陈皓：这种题一般来说是考你的解题思路的，注意，你不能单纯地把高尔夫球当成一个小立方体，其是一个圆球，堆起来的时候应该是错开的——也就是三个相邻 的球的圆心是个等边三角形）</li>
<li>You are shrunk to the height of a nickel and your mass is  proportionally reduced so as to maintain your original density. You are  then thrown into an empty glass blender. The blades will start moving in  60 seconds. What do you do?</li>
<li>How much should you charge to wash all the windows in Seattle?</li>
<li>How would you find out if a machine’s stack grows up or down in memory?</li>
<li>Explain a database in three sentences to your eight-year-old nephew. （陈皓：用三句话向8岁的侄子解释什么是数据库，考你的表达能力了）</li>
<li>How many times a day does a clock’s hands overlap?（陈皓：经典的时钟问题）</li>
<li>You have to get from point A to point B. You don’t know if you can get there. What would you do?</li>
<li>Imagine you have a closet full of shirts. It’s very hard to find a  shirt. So what can you do to organize your shirts for easy retrieval?  （陈皓：很不错的一道题，不要以为分类查询很容易，想想图书馆图书的分类查询问题吧。另外，你处想想如何在你在你的衣柜里实现一个相当于Hash表或是一 个Tree之类的数据结构）</li>
<li>Every man in a village of 100 married couples has cheated on his  wife. Every wife in the village instantly knows when a man other than  her husband has cheated, but does not know when her own husband has. The  village has a law that does not allow for adultery. Any wife who can  prove that her husband is unfaithful must kill him that very day. The  women of the village would never disobey this law. One day, the queen of  the village visits and announces that at least one husband has been  unfaithful. What happens?  （陈皓：这个问题很有限制级，哈哈，非常搞的一个问题，注意wife们的递归，这类的问题是经典的分布式通讯问题，上网搜 一搜吧。）</li>
<li>In a country in which people only want boys, every family continues  to have children until they have a boy. If they have a girl, they have  another child. If they have a boy, they stop. What is the proportion of  boys to girls in the  country?（陈皓：第一反应是——这个国家是中国。一个概率问题，其实，无论你怎么生，50%的概率是永远不变的。）</li>
<li>If the probability of observing a car in 30 minutes on a highway is  0.95, what is the probability of observing a car in 10 minutes (assuming  constant default probability)?</li>
<li>If you look at a clock and the time is 3:15, what is the angle  between the hour and the minute hands? (The answer to this is not zero!)</li>
<li>Four people need to cross a rickety rope bridge to get back to their  camp at night. Unfortunately, they only have one flashlight and it only  has enough light left for seventeen minutes. The bridge is too  dangerous to cross without a flashlight, and it’s only strong enough to  support two people at any given time. Each of the campers walks at a  different speed. One can cross the bridge in 1 minute, another in 2  minutes, the third in 5 minutes, and the slow poke takes 10 minutes to  cross. How do the campers make it across in 17 minutes?（陈皓：经典的过桥问题）</li>
<li>You are at a party with a friend and 10 people are present including  you and the friend. your friend makes you a wager that for every person  you find that has the same birthday as you, you get $1; for every  person he finds that does not have the same birthday as you, he gets $2.  would you accept the wager?</li>
<li>How many piano tuners are there in the entire world?</li>
<li>You have eight balls all of the same size. 7 of them weigh the same,  and one of them weighs slightly more. How can you find the ball that is  heavier by using a balance and only two  weighings?（陈皓：经典的称重问题。这样的问题花样很多，不过都不难回答）</li>
<li>You have five pirates, ranked from 5 to 1 in descending order. The  top pirate has the right to propose how 100 gold coins should be divided  among them. But the others get to vote on his plan, and if fewer than  half agree with him, he gets killed. How should he allocate the gold in  order to maximize his share but live to enjoy it? (Hint: One pirate ends  up with 98 percent of the gold.)</li>
<li>You are given 2 eggs. You have access to a 100-story building. Eggs  can be very hard or very fragile means it may break if dropped from the  first floor or may not even break if dropped from 100th floor. Both eggs  are identical. You need to figure out the highest floor of a 100-story  building an egg can be dropped without breaking. The question is how  many drops you need to make. You are allowed to break 2 eggs in the  process.  （陈皓：从3的倍数的楼层开始扔，比如3，6，9，12…..，如果鸡蛋在3n层碎了，那到在3n-1层扔第二个鸡蛋，如果没碎，则最高不碎楼层为3n- 1，否则为3n-2）</li>
<li>Describe a technical problem you had and how you solved it.</li>
<li>How would you design a simple search engine?</li>
<li>Design an evacuation plan for San Francisco.</li>
<li>There’s a latency problem in South Africa. Diagnose it.  （陈皓：这个问题完全是在考你的解决问题的能力。没有明确的答案。不过，解决性能问题的第一步通常是找出瓶颈，找瓶颈有很多种方法，工具，二分查，时间记 录等等。）</li>
<li>What are three long term challenges facing Google?</li>
<li>Name three non-Google websites that you visit often and like.  What  do you like about the user interface and design?  Choose one of the  three sites and comment on what new feature or project you would work  on.  How would you design it?</li>
<li>If there is only one elevator in the building, how would you change  the design?  How about if there are only two elevators in the building?  （陈皓：经典的电梯设计问题，这种问题千变万化，主要是考你的设计能力和需求变化的适变能力，与此相似的是酒店订房系统。）</li>
<li>How many vacuum’s are made per year in USA?</li>
</ul>
</div>
</div>
<div>
<div><span id="more-1315"></span></div>
<div><strong>Software Engineer</strong></div>
<div>
<div>
<ul>
<li>Why are manhole covers round? （陈皓：为什么下水井盖是圆的？这是有N种答案的，上Wiki看看吧）</li>
<li>What is the difference between a mutex and a semaphore?  Which one would you use to protect access to an increment operation?</li>
<li>A man pushed his car to a hotel and lost his fortune. What happened? （陈皓：脑筋急转弯？他在玩大富翁游戏？！！）</li>
<li>Explain the significance of “dead beef”.（陈皓：要是你看到的是16进制 DEAD BEEF，你会觉得这是什么？IPv6的地址？）</li>
<li>Write a C program which measures the the speed of a context switch on a UNIX/Linux system.</li>
<li>Given a function which produces a random integer in the range 1 to  5, write a function which produces a random integer in the range 1 to  7.（陈皓：上StackOverflow看看吧，经典的问题）</li>
<li>Describe the algorithm for a depth-first graph traversal.</li>
<li>Design a class library for writing card games. （陈皓：用一系列的类来设计一个扑克游戏，设计题）</li>
<li>You need to check that your friend, Bob, has your correct phone  number, but you cannot ask him directly. You must write a the question  on a card which and give it to Eve who will take the card to Bob and  return the answer to you. What must you write on the card, besides the  question, to ensure Bob can encode the message so that Eve cannot read  your phone  number?（陈皓：协议+数字加密，我试想了一个，纸条上可以这样写，“Bob，请把我的手机号以MD5算法加密后的字符串，比对下面的字符串—— XXXXXX，它们是一样的吗？”）</li>
<li>How are cookies passed in the HTTP protocol?</li>
<li>Design the SQL database tables for a car rental database.</li>
<li>Write a regular expression which matches a email address. （陈皓：上StackOverflow查相当的问题吧。）</li>
<li>Write a function f(a, b) which takes two character string arguments  and returns a string containing only the characters found in both  strings in the order of a. Write a version which is order N-squared and  one which is order N.（陈皓：算法题，不难，不说了。一个O(n^2)和一个O(n)的算法复杂度）</li>
<li>You are given a the source to a application which is crashing when  run. After running it 10 times in a debugger, you find it never crashes  in the same place. The application is single threaded, and uses only the  C standard library. What programming errors could be causing this  crash? How would you test each one? （陈皓：和随机数有关系？或是时间？）</li>
<li>Explain how congestion control works in the TCP protocol.</li>
<li>In Java, what is the difference between final, finally, and finalize?</li>
<li>What is multithreaded programming? What is a deadlock?</li>
<li>Write a function (with helper functions if needed) called to Excel  that takes an excel column value (A,B,C,D…AA,AB,AC,… AAA..) and returns a  corresponding integer value (A=1,B=2,… AA=26..).</li>
<li>You have a stream of infinite queries (ie: real time Google search  queries that people are entering). Describe how you would go about  finding a good estimate of 1000 samples from this never ending set of  data and then write code for it.</li>
<li>Tree search algorithms. Write BFS and DFS code, explain run time and  space requirements. Modify the code to handle trees with weighted edges  and loops with BFS and DFS, make the code print out path to goal state.</li>
<li>You are given a list of numbers. When you reach the end of the list  you will come back to the beginning of the list (a circular list). Write  the most efficient algorithm to find the minimum # in this list. Find  any given # in the list. The numbers in the list are always increasing  but you don’t know where the circular list begins, ie: 38, 40, 55, 89,  6, 13, 20, 23, 36. （陈皓：循环排序数组的二分查找问题）</li>
<li>Describe the data structure that is used to manage memory. (stack)</li>
<li>What’s the difference between local and global variables?</li>
<li>If you have 1 million integers, how would you sort them efficiently? (modify a specific sorting algorithm to solve this)</li>
<li>In Java, what is the difference between static, final, and const.  (if you don’t know Java they will ask something similar for C or C++).</li>
<li>Talk about your class projects or work projects (pick something  easy)… then describe how you could make them more efficient (in terms of  algorithms).</li>
<li>Suppose you have an NxN matrix of positive and negative integers.  Write some code that finds the sub-matrix with the maximum sum of its  elements.（陈皓：以前见过一维数组的这个问题，现在是二维的。感觉应该是把二维的第一行的最大和的区间算出来，然后再在这个基础之上进行二维的 分析。思路应该是这个，不过具体的算法还需要想一想）</li>
<li>Write some code to reverse a string.</li>
<li>Implement division (without using the divide operator, obviously).（陈皓：想一想手算除法的过程。）</li>
<li>Write some code to find all permutations of the letters in a particular string.</li>
<li>What method would you use to look up a word in a dictionary? （陈皓：使用排序，哈希，树等算法和数据结构）</li>
<li>Imagine you have a closet full of shirts. It’s very hard to find a  shirt. So what can you do to organize your shirts for easy retrieval?</li>
<li>You have eight balls all of the same size. 7 of them weigh the same,  and one of them weighs slightly more. How can you fine the ball that is  heavier by using a balance and only two weighings?</li>
<li>What is the C-language command for opening a connection with a foreign host over the internet?</li>
<li>Design and describe a system/application that will most efficiently  produce a report of the top 1 million Google search requests. These are  the particulars: 1) You are given 12 servers to work with. They are all  dual-processor machines with 4Gb of RAM, 4x400GB hard drives and  networked together.(Basically, nothing more than high-end PC’s) 2) The  log data has already been cleaned for you. It consists of 100 Billion  log lines, broken down into 12 320 GB files of 40-byte search terms per  line. 3) You can use only custom written applications or available free  open-source software.</li>
<li>There is an array A[N] of N numbers. You have to compose an array  Output[N] such that Output[i] will be equal to multiplication of all the  elements of A[N] except A[i]. For example Output[0] will be  multiplication of A[1] to A[N-1] and Output[1] will be multiplication of  A[0] and from A[2] to A[N-1]. Solve it without division operator and in  O(n).（陈皓：注意其不能使用除法。算法思路是这样的，把output[i]=a[i]左边的乘积 x  a[i]右边的乘积，所以，我们可以分两个循环，第一次先把A[i]左边的乘积放在Output[i]中，第二次把A[i]右边的乘积算出来。我们先看第 一次的循环，使用迭代累积的方式，代码如下：for(r=1; i=0; i&lt;n-1; i++){ Output[i]=r; r*=a[i];  }，看明白了吧。第二次的循环我就不说了，方法一样的。）</li>
<li>There is a linked list of numbers of length N. N is very large and  you don’t know N. You have to write a function that will return k random  numbers from the list. Numbers should be completely random. Hint: 1.  Use random function rand() (returns a number between 0 and 1) and  irand() (return either 0 or 1) 2. It should be done in  O(n).（陈皓：本题其实不难。在遍历链表的同时一边生成随机数，一边记录最大的K个随机数和其链接地址。）</li>
<li>Find or determine non existence of a number in a sorted list of N  numbers where the numbers range over M, M&gt;&gt; N and N large enough  to span multiple disks. Algorithm to beat O(log n) bonus points for  constant time algorithm.（陈皓：使用bitmap，如果一个长整形有64位，那么我们可以使用M/64个bitmap）</li>
<li>You are given a game of Tic Tac Toe. You have to write a function in  which you pass the whole game and name of a player. The function will  return whether the player has won the game or not. First you to decide  which data structure you will use for the game. You need to tell the  algorithm first and then need to write the code. Note: Some position may  be blank in the game। So your data structure should consider this  condition also.</li>
<li>You are given an array [a1 To an] and we have to construct another  array [b1 To bn] where bi = a1*a2*…*an/ai. you are allowed to use only  constant space and the time complexity is O(n). No divisions are  allowed.（陈皓：前面说过了）</li>
<li>How do you put a Binary Search Tree in an array in a efficient  manner. Hint :: If the node is stored at the ith position and its  children are at 2i and 2i+1(I mean level order wise)Its not the most  efficient way.（陈皓：按顺序遍历树）</li>
<li>How do you find out the fifth maximum element in an Binary Search  Tree in efficient manner. Note: You should not use use any extra space.  i.e sorting Binary Search Tree and storing the results in an array and  listing out the fifth element.</li>
<li>Given a Data Structure having first n integers and next n chars. A =  i1 i2 i3 … iN c1 c2 c3 … cN.Write an in-place algorithm to rearrange  the elements of the array ass A = i1 c1 i2 c2 … in  cn（陈皓：这个算法其实就是从中间开始交换元素，代码：for(i=n-1; i&gt;1; i++) {  for(j=i;  j&lt;2*n-i; j+=2) { swap(a[j], a[j+1]); } }，不好意思写在同一行上了。）</li>
<li>Given two sequences of items, find the items whose absolute number  increases or decreases the most when comparing one sequence with the  other by reading the sequence only once.</li>
<li>Given That One of the strings is very very long , and the other one  could be of various sizes. Windowing will result in O(N+M) solution but  could it be better? May be NlogM or even better?</li>
<li>How many lines can be drawn in a 2D plane such that they are equidistant from 3 non-collinear points?</li>
<li>Let’s say you have to construct Google maps from scratch and guide a  person standing on Gateway of India (Mumbai) to India Gate(Delhi). How  do you do the same?</li>
<li>Given that you have one string of length N and M small strings of  length L. How do you efficiently find the occurrence of each small  string in the larger one?</li>
<li>Given a binary tree, programmatically you need to prove it is a binary search tree.</li>
<li>You are given a small sorted list of numbers, and a very very long  sorted list of numbers – so long that it had to be put on a disk in  different blocks. How would you find those short list numbers in the  bigger one?</li>
<li>Suppose you have given N companies, and we want to eventually merge  them into one big company. How many ways are theres to merge?</li>
<li>Given a file of 4 billion 32-bit integers, how to find one that appears at least twice? （陈皓：我能想到的是拆分成若干个小数组，排序，然后一点点归并起来）</li>
<li>Write a program for displaying the ten most frequent words in a file  such that your program should be efficient in all complexity  measures.（陈皓：你可能需要看看这篇文章<a href="http://www.cs.rutgers.edu/%7Efarach/pubs/FrequentStream.pdf" target="_blank">Finding Frequent Items in Data Streams</a>）</li>
<li>Design a stack. We want to push, pop, and also, retrieve the minimum element in constant time.</li>
<li>Given a set of coin denominators, find the minimum number of coins to give a certain amount of change.（陈皓：你应该查看一下这篇文章：<a href="http://www.algorithmist.com/index.php/Coin_Change" target="_blank">Coin Change Problem</a>）</li>
<li>Given an array, i) find the longest continuous increasing  subsequence. ii) find the longest increasing  subsequence.（陈皓：这个题不难，O(n)算法是边遍历边记录当前最大的连续的长度。）</li>
<li>Suppose we have N companies, and we want to eventually merge them into one big company. How many ways are there to merge?</li>
<li>Write a function to find the middle node of a single link list. （陈皓：我能想到的算法是——设置两个指针p1和p2，每一次，p1走两步，p2走一步，这样，当p1走到最后时，p2就在中间）</li>
<li>Given two binary trees, write a compare function to check if they  are equal or not. Being equal means that they have the same value and  same structure.（陈皓：这个很简单，使用递归算法。）</li>
<li>Implement put/get methods of a fixed size cache with LRU replacement algorithm.</li>
<li>You are given with three sorted arrays ( in ascending order), you  are required to find a triplet ( one element from each array) such that  distance is minimum. Distance is defined like this : If a[i], b[j] and  c[k] are three elements then  distance=max(abs(a[i]-b[j]),abs(a[i]-c[k]),abs(b[j]-c[k]))” Please give a  solution in O(n) time complexity（陈皓：三个指针，a, b,  c分别指向三个数组头，假设：a[0]&lt;b[0]&lt;c[0]，推进a直到a[i]&gt;b[0]，计算 abs(a[i-1] –  c[0])，把结果保存在min中。现在情况变成找 a[i],  b[0],c[0]，重复上述过程，如果有一个新的值比min要小，那就取代现有的min。）</li>
<li>How does C++ deal with constructors and deconstructors of a class and its child class?</li>
<li>Write a function that flips the bits inside a byte (either in C++ or  Java). Write an algorithm that take a list of n words, and an integer  m, and retrieves the mth most frequent word in that list.</li>
<li>What’s 2 to the power of 64?</li>
<li>Given that you have one string of length N and M small strings of  length L. How do you efficiently find the occurrence of each small  string in the larger one?  （陈皓：我能想到的是——把那M个小字串排个序，然后遍历大字串，并在那M个字串中以二分取中的方式查找。）</li>
<li>How do you find out the fifth maximum element in an Binary Search Tree in efficient manner.</li>
<li>Suppose we have N companies, and we want to eventually merge them into one big company. How many ways are there to merge?</li>
<li>There is linked list of millions of node and you do not know the  length of it. Write a function which will return a random number from  the list.</li>
<li>You need to check that your friend, Bob, has your correct phone  number, but you cannot ask him directly. You must write a the question  on a card which and give it to Eve who will take the card to Bob and  return the answer to you. What must you write on the card, besides the  question, to ensure Bob can encode the message so that Eve cannot read  your phone number?</li>
<li>How long it would take to sort 1 trillion numbers? Come up with a good estimate.</li>
<li>Order the functions in order of their asymptotic performance: 1) 2^n 2) n^100 3) n! 4) n^n</li>
<li>There are some data represented by(x,y,z). Now we want to find the  Kth least data. We say (x1, y1, z1) &gt; (x2, y2, z2) when value(x1, y1,  z1) &gt; value(x2, y2, z2) where value(x,y,z) = (2^x)*(3^y)*(5^z). Now  we can not get it by calculating value(x,y,z) or through other indirect  calculations as lg(value(x,y,z)). How to solve it?</li>
<li>How many degrees are there in the angle between the hour and minute hands of a clock when the time is a quarter past three?</li>
<li>Given an array whose elements are sorted, return the index of a the  first occurrence of a specific integer. Do this in sub-linear time. I.e.  do not just go through each element searching for that element.</li>
<li>Given two linked lists, return the intersection of the two lists:  i.e. return a list containing only the elements that occur in both of  the input lists. （陈皓：把第一个链表存入hash表，然后遍历第二个链表。不知道还没有更好的方法。）</li>
<li>What’s the difference between a hashtable and a hashmap?</li>
<li>If a person dials a sequence of numbers on the telephone, what  possible words/strings can be formed from the letters associated with  those numbers?（陈皓：这个问题和美国的电话有关系，大家可以试着想一下我们发短信的手机，按数字键出字母，一个组合的数学问题。）</li>
<li>How would you reverse the image on an n by n matrix where each pixel is represented by a bit?</li>
<li>Create a fast cached storage mechanism that, given a limitation on  the amount of cache memory, will ensure that only the least recently  used items are discarded when the cache memory is reached when inserting  a new item. It supports 2 functions: String get(T t) and void  put(String k, T t).</li>
<li>Create a cost model that allows Google to make purchasing decisions  on to compare the cost of purchasing more RAM memory for their servers  vs. buying more disk space.</li>
<li>Design an algorithm to play a game of Frogger and then code the  solution. The object of the game is to direct a frog to avoid cars while  crossing a busy road. You may represent a road lane via an array.  Generalize the solution for an N-lane road.</li>
<li>What sort would you use if you had a large data set on disk and a small amount of ram to work with?</li>
<li>What sort would you use if you required tight max time bounds and wanted highly regular performance.</li>
<li>How would you store 1 million phone numbers?（陈皓：试想电话是有区段的，可以把区段统一保存，Flyweight设计模式）</li>
<li>Design a 2D dungeon crawling game. It must allow for various items  in the maze – walls, objects, and computer-controlled characters. (The  focus was on the class structures, and how to optimize the experience  for the user as s/he travels through the dungeon.)</li>
<li>What is the size of the C structure below on a 32-bit system? On a 64-bit? （陈皓：注意编译器的对齐）</li>
</ul>
<p>struct foo {</p>
<div>char a;</div>
<div>char* b;</div>
<div>};</div>
</div>
</div>
<div><strong>Software Engineer in Test</strong></div>
<div>
<ul>
<li>Efficiently implement 3 stacks in a single array.</li>
<li>Given an array of integers which is circularly sorted, how do you find a given integer.</li>
<li>Write a program to find depth of binary search tree without using recursion.</li>
<li>Find the maximum rectangle (in terms of area) under a histogram in linear time.</li>
<li>Most phones now have full keyboards. Before there there three  letters mapped to a number button. Describe how you would go about  implementing spelling and word suggestions as people type.</li>
<li>Describe recursive mergesort and its runtime. Write an iterative version in C++/Java/Python.</li>
<li>How would you determine if someone has won a game of tic-tac-toe on a board of any size?</li>
<li>Given an array of numbers, replace each number with the product of  all the numbers in the array except the number itself *without* using  division.</li>
<li>Create a cache with fast look up that only stores the N most recently accessed items.</li>
<li>How to design a search engine? If each document contains a set of  keywords, and is associated with a numeric attribute, how to build  indices?</li>
<li>Given two files that has list of words (one per line), write a program to show the intersection.</li>
<li>What kind of data structure would you use to index annagrams of  words? e.g. if there exists the word “top” in the database, the query  for “pot” should list that.</li>
</ul>
<div>
<div><strong>Quantitative Compensation Analyst</strong></div>
</div>
</div>
<div>
<ul>
<li>What is the yearly standard deviation of a stock given the monthly standard deviation?</li>
<li>How many resumes does Google receive each year for software engineering?</li>
<li>Anywhere in the world, where would you open up a new Google office  and how would you figure out compensation for all the employees at this  new office?</li>
<li>What is the probability of breaking a stick into 3 pieces and forming a triangle?</li>
</ul>
</div>
<div><strong>Engineering Manager</strong></div>
<div>
<ul>
<li>You’re the captain of a pirate ship, and your crew gets to vote on  how the gold is divided up. If fewer than half of the pirates agree with  you, you die. How do you recommend apportioning the gold in such a way  that you get a good share of the booty, but still survive?</li>
</ul>
</div>
<div><strong>AdWords Associate</strong></div>
<div>
<ul>
<li>How would you work with an advertiser who was not seeing the benefits of the AdWords relationship due to poor conversions?</li>
<li>How would you deal with an angry or frustrated advertisers on the phone?</li>
</ul>
</div>
<div><em>Sources</em></div>
<div><a href="http://news.ycombinator.com/item?id=266663" target="_blank">http://news.ycombinator.com/item?id=266663</a></div>
<div><a href="http://tihomir.org/crazy-questions-at-google-job-interview/" target="_blank">http://tihomir.org/crazy-questions-at-google-job-interview/</a></div>
<div><a href="http://www.drizzle.com/%7Ejpaint/google.html" target="_blank">http://www.drizzle.com/~jpaint/google.html</a></div>
<div><a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=299692" target="_blank">http://www.gamedev.net/community/forums/topic.asp?topic_id=299692</a></div>
<div><a href="http://careers.cse.sc.edu/googleinterview" target="_blank">http://careers.cse.sc.edu/googleinterview</a></div>
<div><a href="http://job-interview.blogspot.com/2005/02/google-interview-product-marketing.html" target="_blank">http://job-interview.blogspot.com/2005/02/google-interview-product-marketing.html</a></div>
<div><a href="http://www.theregister.co.uk/2007/01/05/google_interview_tales/" target="_blank">http://www.theregister.co.uk/2007/01/05/google_interview_tales/</a></div>
<div><a href="http://money.cnn.com/2007/08/29/technology/brain_teasers.biz2/index.htm" target="_blank">http://money.cnn.com/2007/08/29/technology/brain_teasers.biz2/index.htm</a></div>
<div><a href="http://money.cnn.com/2007/08/29/technology/brain_teasers.biz2/index.htm" target="_blank">http://blogs.lessthandot.com/index.php/ITProfessionals/EthicsIT/google-interview-questions</a></div>
<div><a href="http://placementsindia.blogspot.com/2007/09/google-top-interview-puzzles.html" target="_blank">http://placementsindia.blogspot.com/2007/09/google-top-interview-puzzles.html</a></div>
<div><a href="http://linkmingle.com/user/interview_questions/google_interview_questions" target="_blank">http://linkmingle.com/user/interview_questions/google_interview_questions</a></div>
<div><a href="http://discuss.joelonsoftware.com/default.asp?interview.11.626758.33" target="_blank">http://discuss.joelonsoftware.com/default.asp?interview.11.626758.33</a></div>
<div><a href="http://mindcipher.com/puzzle/78-clock-works" target="_blank">http://mindcipher.com/puzzle/78-clock-works</a></div>
<div><a href="http://www.glassdoor.com/" target="_blank">http://www.glassdoor.com</a></div>
<div>
<div><a href="http://bluepixel.ca/blog/?p=69" target="_blank">http://bluepixel.ca/blog/?p=69</a></div>
<div><a href="http://www.businessinsider.com/my-nightmare-interviews-with-google-2009-11" target="_blank">http://www.businessinsider.com/my-nightmare-interviews-with-google-2009-11</a></div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1315/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[编程之美]N个鸡蛋放到M个篮子的方法</title>
		<link>http://yaronspace.cn/blog/archives/1312</link>
		<comments>http://yaronspace.cn/blog/archives/1312#comments</comments>
		<pubDate>Tue, 05 Jul 2011 15:11:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[编程语言与算法设计]]></category>

		<guid isPermaLink="false">http://yaronspace.cn/blog/?p=1312</guid>
		<description><![CDATA[今天看到一个面试题目，题目大意：将n个鸡蛋放到m个篮子，同时保证不能有空篮子，且对于任意小于等于n的数，都能保证有几个篮子的鸡蛋数等于这个数 题目分析 第一眼看到这个题目时，感觉像是整数拆分问题，但是有两个限制：1. 不能有空篮子 2.保证能够针对任意&#60;=n的数，都可以用几个篮子的鸡蛋的和来表示，所以应该不是整数拆分问题。 首先想到是就是穷举，也就是深度搜索，但是如何判断搜索的一个结果是否满足第二个条件呢？ 这里可以通过归纳的方法，假设当前的前n个数为Sn，同时任意&#60;=Sn的数都可以用前n个数某些数的和来表示，那么第n+1个数的范围是什么呢？ 这里应该可以想到，如果第n+1个数&#62;(Sn) + 1 的话，相当于有间隔，那么(Sn) + 1这个就无法表示，所以第n+1个数应该是&#60;= Sn + 1，这样就可以满足 任意的&#60;=S(n+1) 的数都可以用前n+1个数来表示； 同时在搜索的过程中保证序列是非降序的，而且会有剪枝的方法，实现具体看代码 代码实现 CPP CODE/* * Author: liyangguang &#60;liyangguang@software.ict.ac.cn&#62; * http://www.yaronspace.cn/blog * * File: 1312.cc * Create Date: 2011-07-05 22:39:34 * */ #include &#60;stdio.h&#62; &#160; #define MAX_N 100000 #define MAX_M 1000 static int s_arrAns&#91;MAX_M&#93;; static int s_iM; static]]></description>
			<content:encoded><![CDATA[<p>今天看到一个面试题目，题目大意：将n个鸡蛋放到m个篮子，同时保证不能有空篮子，且对于任意小于等于n的数，都能保证有几个篮子的鸡蛋数等于这个数</p>
<h5>题目分析</h5>
<p>第一眼看到这个题目时，感觉像是整数拆分问题，但是有两个限制：1. 不能有空篮子 2.保证能够针对任意&lt;=n的数，都可以用几个篮子的鸡蛋的和来表示，所以应该不是整数拆分问题。</p>
<p>首先想到是就是穷举，也就是深度搜索，但是如何判断搜索的一个结果是否满足第二个条件呢？</p>
<p>这里可以通过归纳的方法，假设当前的前n个数为Sn，同时任意&lt;=Sn的数都可以用前n个数某些数的和来表示，那么第n+1个数的范围是什么呢？</p>
<p>这里应该可以想到，如果第n+1个数&gt;(Sn) + 1 的话，相当于有间隔，那么(Sn) + 1这个就无法表示，所以第n+1个数应该是&lt;= Sn + 1，这样就可以满足</p>
<p>任意的&lt;=S(n+1) 的数都可以用前n+1个数来表示；</p>
<p>同时在搜索的过程中保证序列是非降序的，而且会有剪枝的方法，实现具体看代码</p>
<h5>代码实现</h5>
<p><span id="more-1312"></span></p>

<div class="wp_syntax"><div class="code_title">CPP CODE</div><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/*
 * Author: liyangguang &lt;liyangguang@software.ict.ac.cn&gt;
 * http://www.yaronspace.cn/blog
 *
 * File: 1312.cc
 * Create Date: 2011-07-05 22:39:34
 *
 */</span>
<span style="color: #339900;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #339900;">#define MAX_N 100000</span>
<span style="color: #339900;">#define MAX_M 1000</span>
<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> s_arrAns<span style="color: #008000;">&#91;</span>MAX_M<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> s_iM<span style="color: #008080;">;</span>
<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> s_iN<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span>
search<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> iCurSum, <span style="color: #0000ff;">int</span> iIdx, <span style="color: #0000ff;">int</span> iCurNum<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>iCurSum <span style="color: #000080;">==</span> s_iN <span style="color: #000040;">&amp;&amp;</span> iIdx <span style="color: #000080;">==</span> s_iM<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
&nbsp;
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> s_iM<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
            <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d &quot;</span>, s_arrAns<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>iCurSum <span style="color: #000080;">&gt;</span> s_iN <span style="color: #000040;">||</span> iIdx <span style="color: #000080;">&gt;=</span> s_iM<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #666666;">//存在两个剪枝的优化，分别放最少和最多的鸡蛋</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>iCurSum <span style="color: #000040;">+</span> iCurNum <span style="color: #000040;">*</span> <span style="color: #008000;">&#40;</span>s_iM <span style="color: #000040;">-</span> iIdx<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&gt;</span> s_iN <span style="color: #000040;">||</span> iCurSum <span style="color: #000040;">+</span> <span style="color: #008000;">&#40;</span>iCurSum <span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>s_iM <span style="color: #000040;">-</span> iIdx<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;</span> s_iN<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">else</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> iCurNum<span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;=</span> iCurSum <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
&nbsp;
            s_arrAns<span style="color: #008000;">&#91;</span>iIdx<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
            search<span style="color: #008000;">&#40;</span>iCurSum<span style="color: #000040;">+</span>i, iIdx<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>, i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> 
main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
&nbsp;
    <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d %d&quot;</span>, <span style="color: #000040;">&amp;</span>s_iN, <span style="color: #000040;">&amp;</span>s_iM<span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000ff;">EOF</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        search<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
&nbsp;
&nbsp;
<span style="color: #ff0000; font-style: italic;">/* vim: set ts=4 sw=4: */</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1312/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用mmap实现文件的拷贝</title>
		<link>http://yaronspace.cn/blog/archives/1310</link>
		<comments>http://yaronspace.cn/blog/archives/1310#comments</comments>
		<pubDate>Mon, 04 Jul 2011 14:13:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[mmap]]></category>
		<category><![CDATA[munmap]]></category>
		<category><![CDATA[拷贝]]></category>
		<category><![CDATA[文件间复制]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1310</guid>
		<description><![CDATA[今天看csapp看到了虚拟存储器的映射以及mmap函数的用法，作为练习，使用mmap来实现文件的拷贝操作，同时与传统的文件拷贝操作进行了性能比较。 mmap与munmap函数介绍： CPP CODE#include &#60;unistd.h&#62; #include &#60;sys/mman.h&#62; void *mmap&#40;void *start, size_t length, int prot, int flag, int fd, off_t offset&#41;; //返回:若成功时则返回映射区域的指针，若出错则为MAP_FAILED(-1) start: 最好从start开始的一个区域，这个是hint，具体映射结果还是要看返回结果 length: 映射区域的大小 prot: 映射区域的访问权限位 PROT_EXEC PROT_READ PROT_WRITE PROT_NONE flags: 映射对象的类型 MAP_ANON MAP_PRIVATE MAP_SHARED munmap函数删除映射区域 CPP CODE#include &#60;unistd.h&#62; #include &#60;sys/mman.h&#62; int munmap&#40;void *start, size_t length&#41;; 实验 分别使用了mmap函数和普通的read write实现了文件的复制拷贝，下面是通过复制50M的文件性能分析： BASH CODE&#91;yangguang@sim124 ~&#93;$ time ./workspace/mmapcopy]]></description>
			<content:encoded><![CDATA[<p>今天看csapp看到了虚拟存储器的映射以及mmap函数的用法，作为练习，使用mmap来实现文件的拷贝操作，同时与传统的文件拷贝操作进行了性能比较。</p>
<h5>mmap与munmap函数介绍：</h5>

<div class="wp_syntax"><div class="code_title">CPP CODE</div><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;unistd.h&gt;</span>
<span style="color: #339900;">#include &lt;sys/mman.h&gt;</span>
<span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>mmap<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>start, <span style="color: #0000ff;">size_t</span> length, <span style="color: #0000ff;">int</span> prot, <span style="color: #0000ff;">int</span> flag, <span style="color: #0000ff;">int</span> fd, off_t offset<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #666666;">//返回:若成功时则返回映射区域的指针，若出错则为MAP_FAILED(-1)</span></pre></div></div>

<p>start: 最好从start开始的一个区域，这个是hint，具体映射结果还是要看返回结果<br />
length: 映射区域的大小<br />
prot: 映射区域的访问权限位  PROT_EXEC PROT_READ PROT_WRITE PROT_NONE<br />
flags: 映射对象的类型 MAP_ANON  MAP_PRIVATE MAP_SHARED</p>
<p>munmap函数删除映射区域</p>

<div class="wp_syntax"><div class="code_title">CPP CODE</div><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;unistd.h&gt;</span>
<span style="color: #339900;">#include &lt;sys/mman.h&gt;</span>
<span style="color: #0000ff;">int</span> munmap<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>start, <span style="color: #0000ff;">size_t</span> length<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<h5>实验</h5>
<p>分别使用了mmap函数和普通的read write实现了文件的复制拷贝，下面是通过复制50M的文件性能分析：</p>

<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span>yangguang<span style="color: #000000; font-weight: bold;">@</span>sim124 ~<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ <span style="color: #000000; font-weight: bold;">time</span> .<span style="color: #000000; font-weight: bold;">/</span>workspace<span style="color: #000000; font-weight: bold;">/</span>mmapcopy linux-20101214.tar.gz .<span style="color: #000000; font-weight: bold;">/</span>output    
real    0m0.100s
user    0m0.034s
sys     0m0.065s</pre></div></div>


<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span>yangguang<span style="color: #000000; font-weight: bold;">@</span>sim124 ~<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ <span style="color: #000000; font-weight: bold;">time</span> .<span style="color: #000000; font-weight: bold;">/</span>workspace<span style="color: #000000; font-weight: bold;">/</span>copy linux-20101214.tar.gz .<span style="color: #000000; font-weight: bold;">/</span>output
real    0m5.016s
user    0m0.000s
sys     0m0.124s</pre></div></div>

<p>可以看到使用mmap的性能明显高于使用Read write的方式，这里主要原因是使用mmap减少了用户态和内核态间数据<br />
的拷贝<br />
<span id="more-1310"></span></p>
<h5>源码分析</h5>

<div class="wp_syntax"><div class="code_title">CPP CODE</div><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/*
 * Author: liyangguang &lt;liyangguang@software.ict.ac.cn&gt;
 * http://www.yaronspace.cn/blog
 *
 * File: mmapcopy.c
 * Create Date: 2011-07-04 21:02:48
 *
 */</span>
<span style="color: #339900;">#include &lt;stdio.h&gt;</span>
<span style="color: #339900;">#include &lt;sys/mman.h&gt;</span>
<span style="color: #339900;">#include &lt;sys/types.h&gt;</span>
<span style="color: #339900;">#include &lt;sys/stat.h&gt;</span>
<span style="color: #339900;">#include &lt;fcntl.h&gt;</span>
<span style="color: #339900;">#include &lt;unistd.h&gt;</span>
<span style="color: #339900;">#include &lt;string.h&gt;</span>
<span style="color: #339900;">#include &lt;errno.h&gt;</span>
&nbsp;
<span style="color: #0000ff;">void</span>
mmapcopy<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> src_fd, <span style="color: #0000ff;">size_t</span> src_len, <span style="color: #0000ff;">int</span> dst_fd<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>src_ptr, <span style="color: #000040;">*</span>dst_ptr<span style="color: #008080;">;</span>
    src_ptr <span style="color: #000080;">=</span> mmap<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, src_len, PROT_READ, MAP_PRIVATE, src_fd, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    dst_ptr <span style="color: #000080;">=</span> mmap<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, src_len, PROT_WRITE <span style="color: #000040;">|</span> PROT_READ, MAP_SHARED, dst_fd, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>dst_ptr <span style="color: #000080;">==</span> MAP_FAILED<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
&nbsp;
        <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;mmap error:%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #0000dd;">strerror</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">errno</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000dd;">memcpy</span><span style="color: #008000;">&#40;</span>dst_ptr, src_ptr, src_len<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    munmap<span style="color: #008000;">&#40;</span>src_ptr, src_len<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    munmap<span style="color: #008000;">&#40;</span>dst_ptr, src_len<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">int</span> 
main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>argc <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Usage: %s &lt;src_file&gt; &lt;dst_file&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, argv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">int</span> src_fd <span style="color: #000080;">=</span> open<span style="color: #008000;">&#40;</span>argv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span>, O_RDONLY<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> dst_fd <span style="color: #000080;">=</span> open<span style="color: #008000;">&#40;</span>argv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span>, O_RDWR <span style="color: #000040;">|</span> O_CREAT <span style="color: #000040;">|</span> O_TRUNC<span style="color: #008000;">&#41;</span><span style="color: #008080;">;;</span>
    <span style="color: #0000ff;">struct</span> stat stat<span style="color: #008080;">;</span>
    fstat<span style="color: #008000;">&#40;</span>src_fd, <span style="color: #000040;">&amp;</span>stat<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    truncate<span style="color: #008000;">&#40;</span>argv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span>, stat.<span style="color: #007788;">st_size</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    mmapcopy<span style="color: #008000;">&#40;</span>src_fd, stat.<span style="color: #007788;">st_size</span>, dst_fd<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    close<span style="color: #008000;">&#40;</span>src_fd<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    close<span style="color: #008000;">&#40;</span>dst_fd<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code_title">CPP CODE</div><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/*
 * Author: liyangguang &lt;liyangguang@software.ict.ac.cn&gt;
 * http://www.yaronspace.cn/blog
 *
 * File: copy.c
 * Create Date: 2011-07-04 21:38:00
 *
 */</span>
<span style="color: #339900;">#include &lt;stdio.h&gt;</span>
<span style="color: #339900;">#include &lt;sys/types.h&gt;</span>
<span style="color: #339900;">#include &lt;sys/stat.h&gt;</span>
<span style="color: #339900;">#include &lt;fcntl.h&gt;</span>
<span style="color: #339900;">#include &lt;string.h&gt;</span>
<span style="color: #339900;">#include &lt;errno.h&gt;</span>
<span style="color: #339900;">#include &lt;unistd.h&gt;</span>
&nbsp;
<span style="color: #0000ff;">void</span>
copy<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> src_fd, <span style="color: #0000ff;">int</span> dst_fd<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">char</span> buffer<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1024</span><span style="color: #000040;">*</span><span style="color: #0000dd;">1024</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>ptr <span style="color: #000080;">=</span> buffer<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">size_t</span> nread, nwrite, nremain<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>nread <span style="color: #000080;">=</span> read<span style="color: #008000;">&#40;</span>src_fd, ptr, <span style="color: #0000dd;">1024</span><span style="color: #000040;">*</span><span style="color: #0000dd;">1024</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        nremain <span style="color: #000080;">=</span> nread<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>nremain <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
            nwrite <span style="color: #000080;">=</span> write<span style="color: #008000;">&#40;</span>dst_fd, ptr, nremain<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            nremain <span style="color: #000040;">-</span><span style="color: #000080;">=</span> nwrite<span style="color: #008080;">;</span> 
            ptr   <span style="color: #000080;">=</span> ptr <span style="color: #000040;">+</span> nwrite<span style="color: #008080;">;</span> 
        <span style="color: #008000;">&#125;</span> 
        ptr <span style="color: #000080;">=</span> buffer<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #008000;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">int</span> 
main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>argc <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Usage: %s &lt;src_file&gt; &lt;dst_file&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, argv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">int</span> src_fd <span style="color: #000080;">=</span> open<span style="color: #008000;">&#40;</span>argv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span>, O_RDONLY<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> dst_fd <span style="color: #000080;">=</span> open<span style="color: #008000;">&#40;</span>argv<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span>, O_RDWR <span style="color: #000040;">|</span> O_CREAT <span style="color: #000040;">|</span> O_TRUNC, S_IRWXU<span style="color: #008000;">&#41;</span><span style="color: #008080;">;;</span>
    copy<span style="color: #008000;">&#40;</span>src_fd, dst_fd<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    close<span style="color: #008000;">&#40;</span>src_fd<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    close<span style="color: #008000;">&#40;</span>dst_fd<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
&nbsp;
&nbsp;
&nbsp;
<span style="color: #ff0000; font-style: italic;">/* vim: set ts=4 sw=4: */</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1310/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[编程之美]使用最大堆和最小堆来求中位数</title>
		<link>http://yaronspace.cn/blog/archives/1306</link>
		<comments>http://yaronspace.cn/blog/archives/1306#comments</comments>
		<pubDate>Tue, 28 Jun 2011 14:07:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[中位数]]></category>
		<category><![CDATA[最大堆]]></category>
		<category><![CDATA[最小堆]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1306</guid>
		<description><![CDATA[好久没更新blog，都快荒废了，今天发个算法问题 题目介绍： 输入为不断地数字流，实时显示出当前已经输入的数字序列的中位数 解答： 求中位数的方法很多，对于大数据量最经典是桶的计数方法，但是对于这个问题不适用，因为数据是不断变化的 可以用最大堆和最小堆来解答这个问题： 1.假设当前的中位数为m，其中最大堆维护的是&#60;=m的数字序列，最小堆维护的是&#62;=m的数字序列，但是两个堆都不包含m 2.当新的数字到达时，比如为a，将a与m进行比较，若a&#60;=m 则将其加入到最大堆中，否则将其加入到最小堆中 3.如果此时最小堆和最大堆的元素个数的差值&#62;=2 ，则将m加入到元素个数少的堆中，然后从元素个数多的堆将根节点赋值到m，最后重建两个最大堆和最小堆，返回到2]]></description>
			<content:encoded><![CDATA[<p>好久没更新blog，都快荒废了，今天发个算法问题</p>
<p><strong>题目介绍：</strong></p>
<p>输入为不断地数字流，实时显示出当前已经输入的数字序列的中位数</p>
<p><strong>解答：</strong></p>
<p>求中位数的方法很多，对于大数据量最经典是桶的计数方法，但是对于这个问题不适用，因为数据是不断变化的</p>
<p>可以用最大堆和最小堆来解答这个问题：</p>
<p>1.假设当前的中位数为m，其中最大堆维护的是&lt;=m的数字序列，最小堆维护的是&gt;=m的数字序列，但是两个堆都不包含m</p>
<p>2.当新的数字到达时，比如为a，将a与m进行比较，若a&lt;=m 则将其加入到最大堆中，否则将其加入到最小堆中</p>
<p>3.如果此时最小堆和最大堆的元素个数的差值&gt;=2 ，则将m加入到元素个数少的堆中，然后从元素个数多的堆将根节点赋值到m，最后重建两个最大堆和最小堆，返回到2</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1306/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vim中recording模式详解</title>
		<link>http://yaronspace.cn/blog/archives/1302</link>
		<comments>http://yaronspace.cn/blog/archives/1302#comments</comments>
		<pubDate>Thu, 09 Jun 2011 03:08:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[recording]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[详解]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1302</guid>
		<description><![CDATA[今天看到这个视频：http://v.youku.com/v_show/id_XODk1NjkyNTI=.html 里面有一段是对某一行进行修改，然后可以将这些修改应用到与这一行类似的其他行，然后就想到了vim中recording模式，今天好好总结学习下。 进入recording模式 在正常状态（正常状态 = !insert状态 &#38;&#38; !visual状态）下，按q，再按下一个字母或数字，这个数字代表缓冲区的名字，是键盘操作存储的位置，这时编辑器下方就显示&#8221;recording(记录)&#8221;字样，然后进行操作，最后按q退出这中模式，这样在这期间进行的操作就保存在缓冲区中了 生效缓冲区的内容 怎样将同样的操作在类似的行上生效呢？ 使用@后面加上缓冲区的名字即可 实际例子 在文本区中存在以下内容： int a; int b; int c; int d; 然后将光标放入到第一行的第一个字符输入以下内容：qm$i=1+1&#60;ESC&#62;q qm：表示进入recording模式，选择缓冲区m $i:定位到行尾并进入插入模式 =1+1：表示插入的内容 &#60;ESC&#62;q：返回正常状态，并退出recording模式 最后将光标定位到第二行的行首，输入：@m 以下几行类似操作。 最后文本内容变为： int a=1+1; int b=1+1; int c=1+1; int d=1+1; 参考资料：http://hi.baidu.com/xiaowp/blog/item/c27b50543bb08a53574e0066.html]]></description>
			<content:encoded><![CDATA[<p>今天看到这个视频：<a href="http://v.youku.com/v_show/id_XODk1NjkyNTI=.html">http://v.youku.com/v_show/id_XODk1NjkyNTI=.html</a></p>
<p>里面有一段是对某一行进行修改，然后可以将这些修改应用到与这一行类似的其他行，然后就想到了vim中recording模式，今天好好总结学习下。</p>
<h5>进入recording模式</h5>
<p>在正常状态（正常状态 = !insert状态 &amp;&amp; !visual状态）下，按q，再按下一个字母或数字，这个数字代表缓冲区的名字，是键盘操作存储的位置，这时编辑器下方就显示&#8221;recording(记录)&#8221;字样，然后进行操作，最后按q退出这中模式，这样在这期间进行的操作就保存在缓冲区中了</p>
<h5>生效缓冲区的内容</h5>
<p>怎样将同样的操作在类似的行上生效呢？</p>
<p>使用@后面加上缓冲区的名字即可</p>
<h5>实际例子</h5>
<p>在文本区中存在以下内容：</p>
<pre>
int a;
int b;
int c;
int d;
</pre>
<p>然后将光标放入到第一行的第一个字符输入以下内容：qm$i=1+1&lt;ESC&gt;q</p>
<p>qm：表示进入recording模式，选择缓冲区m</p>
<p>$i:定位到行尾并进入插入模式</p>
<p>=1+1：表示插入的内容</p>
<p>&lt;ESC&gt;q：返回正常状态，并退出recording模式</p>
<p>最后将光标定位到第二行的行首，输入：@m</p>
<p>以下几行类似操作。</p>
<p>最后文本内容变为：</p>
<pre>
int a=1+1;
int b=1+1;
int c=1+1;
int d=1+1;
</pre>
<p>参考资料：<a href="http://hi.baidu.com/xiaowp/blog/item/c27b50543bb08a53574e0066.html">http://hi.baidu.com/xiaowp/blog/item/c27b50543bb08a53574e0066.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1302/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SMTP邮件服务器postfix配置与使用</title>
		<link>http://yaronspace.cn/blog/archives/1295</link>
		<comments>http://yaronspace.cn/blog/archives/1295#comments</comments>
		<pubDate>Wed, 01 Jun 2011 05:58:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[开源软件]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[sasl]]></category>
		<category><![CDATA[smtp服务器]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1295</guid>
		<description><![CDATA[最近要帮朋友配置一个SMTP服务器，需求就是每天需要向外发送上百万封邮件，google之，发现postfix邮件服务器比较靠谱, 能够发送外部邮件，于是就选它了 操作系统：CentOS 5 32bit postfix安装 可以通过源码安装最新的版本，但是为了方便，我直接使用yum安装 sudo yum install postfix 配置文件路径:/etc/postfix/main.cf postfix启动与停止命令： BASH CODEsudo /etc/init.d/postfix start &#160; sudo /etc/init.d/postfix stop &#160; sudo /etc/init.d/postfix restart postfix日志文件位置：/var/log/maillog 卸载sendmail 检查系统是否安装sendmail: BASH CODErpm –qa &#124;grep sendmail 如果存在，卸载之 BASH CODErpm -e sendmail --nodeps 安装cyrus-sasl-2.1.23 由于在centos 源中不存在，直接通过源码安装cyrus-sasl-2.1.23.tar.gz 下载地址 ./configure &#038;&#038;make &#038;&#038;make install 这个软件包的作用就是postfix邮件服务器的认证，因为如果转发外部的邮件，必须使用smtpd_recipient_restrictions选项的值check_relay_domains或者是reject_unauth_destination，二者必须选一个，而relay_damains手工来配置允许的邮件域太麻烦，所以就选用sasl认证 修改sasl配置:/etc/sysconfig/saslauthd为 # Directory in which to place]]></description>
			<content:encoded><![CDATA[<p>最近要帮朋友配置一个SMTP服务器，需求就是每天需要向外发送上百万封邮件，google之，发现postfix邮件服务器比较靠谱, 能够发送外部邮件，于是就选它了</p>
<p>操作系统：CentOS 5 32bit</p>
<h4>postfix安装</h4>
<p>可以通过源码安装最新的版本，但是为了方便，我直接使用yum安装</p>
<p>sudo yum install postfix</p>
<p>配置文件路径:/etc/postfix/main.cf</p>
<p>postfix启动与停止命令：</p>

<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>postfix start
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>postfix stop
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>postfix restart</pre></div></div>

<p>postfix日志文件位置：/var/log/maillog</p>
<p><strong>卸载sendmail</strong><br />
检查系统是否安装sendmail:</p>

<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;">rpm –qa <span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #c20cb9; font-weight: bold;">sendmail</span></pre></div></div>

<p>如果存在，卸载之</p>

<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;">rpm <span style="color: #660033;">-e</span> <span style="color: #c20cb9; font-weight: bold;">sendmail</span> <span style="color: #660033;">--nodeps</span></pre></div></div>

<h4>安装cyrus-sasl-2.1.23</h4>
<p>由于在centos 源中不存在，直接通过源码安装cyrus-sasl-2.1.23.tar.gz<br />
<a href="http://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-sasl-2.1.23.tar.gz">下载地址</a><br />
./configure &#038;&#038;make &#038;&#038;make install</p>
<p>这个软件包的作用就是postfix邮件服务器的认证，因为如果转发外部的邮件，必须使用smtpd_recipient_restrictions选项的值check_relay_domains或者是reject_unauth_destination，二者必须选一个，而relay_damains手工来配置允许的邮件域太麻烦，所以就选用sasl认证</p>
<p>修改sasl配置:/etc/sysconfig/saslauthd为</p>
<pre># Directory in which to place saslauthd's listening socket, pid file, and so
# on.  This directory must already exist.
START=yes
SOCKETDIR=/var/run/saslauthd

# Mechanism to use when checking passwords.  Run "saslauthd -v" to get a list
# of which mechanism your installation was compiled with the ablity to use.
#MECH="pam"
MECHANISMS="pam" #使用linux自身的用户认证

# Additional flags to pass to saslauthd on the command line.  See saslauthd(8)
# for the list of accepted flags.
#FLAGS=
</pre>
<p>然后重启saslauthd:</p>

<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>saslauthd restart</pre></div></div>

<p>测试saslauthd生效：</p>

<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>testsaslauthd <span style="color: #660033;">-u</span> liyg <span style="color: #660033;">-p</span> liyangguang</pre></div></div>

<h5>将sasl与postfix结合</h5>
<p>在main.cf文件中加入：</p>
<pre>#added by liyangguang
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
#smtpd_client_restrictions = permit_sasl_authenticated

smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
</pre>
<p>重启postfix ：sudo /etc/init.d/postfix restart。<br />
然后通过foxmail客户端配置smtp服务器地址，测试发送邮件是否成功</p>
<p>参考资料：</p>
<p>http://yahoon.blog.51cto.com/13184/40091</p>
<p>http://www.postfix.org/RESTRICTION_CLASS_README.html</p>
<p>http://publish.it168.com/2006/0221/20060221219401.shtml</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1295/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【编程之美】单链表是否存在环以及环入口的位置【转载】</title>
		<link>http://yaronspace.cn/blog/archives/1293</link>
		<comments>http://yaronspace.cn/blog/archives/1293#comments</comments>
		<pubDate>Thu, 26 May 2011 14:31:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[环位置]]></category>
		<category><![CDATA[编程之美]]></category>
		<category><![CDATA[链表环]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1293</guid>
		<description><![CDATA[原文地址：http://blog.csdn.net/ssfp8762/archive/2009/07/08/4331419.aspx 有一个单链表，其中可能有一个环，也就是某个节点的next指向的是链表中在它之前的节点，这样在链表的尾部形成一环。 1、如何判断一个链表是不是这类链表？ 2、如果链表为存在环，如果找到环的入口点？ 扩展：判断两个单链表是否相交，如果相交，给出相交的第一个点。 解答： 一、判断链表是否存在环，办法为： 设置两个指针(fast, slow)，初始值都指向头，slow每次前进一步，fast每次前进二步，如果链表存在环，则fast必定先进入环，而slow后进入环，两个指针必定相遇。 二、链表环入口的位置计算 当fast若与slow相遇时，slow肯定没有走遍历完链表，而fast已经在环内循环了n圈(1&#60;=n)。假设slow走了s步，则fast走了2s步（fast步数还等于s 加上在环上多转的n圈），设环长为r，则： 2s = s + nr s= nr 设整个链表长L，入口环与相遇点距离为x，起点到环入口点的距离为a。 a + x = nr a + x = (n – 1)r +r = (n-1)r + L &#8211; a a = (n-1)r + (L – a – x) (L – a – x)为相遇点到环入口点的距离，由此可知，从链表头到环入口点等于(n-1)循环内环+相遇点到环入口点，于是我们从链表头、与相遇点分别设一个指针，每次各走一步，两个指针必定相遇，且相遇第一点为环入口点。 扩展问题： 判断两个单链表是否相交，如果相交，给出相交的第一个点（两个链表都不存在环）。]]></description>
			<content:encoded><![CDATA[<p>原文地址：<a href="http://blog.csdn.net/ssfp8762/archive/2009/07/08/4331419.aspx">http://blog.csdn.net/ssfp8762/archive/2009/07/08/4331419.aspx</a></p>
<div>有一个单链表，其中可能有一个环，也就是某个节点的next指向的是链表中在它之前的节点，这样在链表的尾部形成一环。</div>
<div>1、如何判断一个链表是不是这类链表？</div>
<div>2、如果链表为存在环，如果找到环的入口点？</div>
<div>扩展：判断两个单链表是否相交，如果相交，给出相交的第一个点。</div>
<div></div>
<div>
<p>解答：</p>
<p><strong>一、判断链表是否存在环，办法为：</strong></p>
<p>设置两个指针(fast, slow)，初始值都指向头，slow每次前进一步，fast每次前进二步，如果链表存在环，则fast必定先进入环，而slow后进入环，两个指针必定相遇。</p>
<p><strong>二、链表环入口的位置计算</strong></p>
<p>当fast若与slow相遇时，slow肯定没有走遍历完链表，而fast已经在环内循环了n圈(1&lt;=n)。假设slow走了s步，则fast走了2s步（fast步数还等于s 加上在环上多转的n圈），设环长为r，则：</p>
<p>2s = s + nr<br />
s= nr</p>
<p>设整个链表长L，入口环与相遇点距离为x，起点到环入口点的距离为a。<br />
a + x = nr<br />
a + x = (n – 1)r +r = (n-1)r + L &#8211; a<br />
a = (n-1)r + (L – a – x)</p>
<p>(L – a – x)为相遇点到环入口点的距离，由此可知，从链表头到环入口点等于(n-1)循环内环+相遇点到环入口点，于是我们从链表头、与相遇点分别设一个指针，每次各走一步，两个指针必定相遇，且相遇第一点为环入口点。</p>
<p><strong>扩展问题：</strong></p>
<p>判断两个单链表是否相交，如果相交，给出相交的第一个点（两个链表都不存在环）。</p>
<p>比较好的方法有两个：</p>
<p>一、将其中一个链表首尾相连，检测另外一个链表是否存在环，如果存在，则两个链表相交，而检测出来的依赖环入口即为相交的第一个点。</p>
<p>二、如果两个链表相交，那个两个链表从相交点到链表结束都是相同的节点，我们可以先遍历一个链表，直到尾部，再遍历另外一个链表，如果也可以走到同样的结尾点，则两个链表相交。</p>
<p>这时我们记下两个链表length，再遍历一次，长链表节点先出发前进(lengthMax-lengthMin)步，之后两个链表同时前进，每次一步，相遇的第一点即为两个链表相交的第一个点。</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1293/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>socket编程中如何区分不同的网络连接</title>
		<link>http://yaronspace.cn/blog/archives/1290</link>
		<comments>http://yaronspace.cn/blog/archives/1290#comments</comments>
		<pubDate>Wed, 25 May 2011 03:38:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[socket编程]]></category>
		<category><![CDATA[网络连接]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1290</guid>
		<description><![CDATA[在网络编程中，服务器程序的代码结构一般如下： socket() -&#62; bind() -&#62; listen() -&#62; accept() 当有一个新的客户端连接时，accept建立一个新的socket，然后将sockfd返回，接下来数据的发送和接收就都在这个sockfd中进行 但是一直有一个问题我比较困惑：在服务器端，当有数据到达时，协议栈是如何将数据传递到正确的sockfd的呢（服务器端存在多个已连接的客户端）？因为不同的网络连接是使用同一个监听端口，如80端口，不可能为每一个建立的连接分配一个端口（事实也不是这样）； 上网搜寻一下，一个比较合理的解释：使用网络连接的源ip+源port来区分不同的数据连接，本身TCP协议中提供，而且可以唯一标识网络连接，因为不可能同一个客户端使用同一个端口进行来连接server的。]]></description>
			<content:encoded><![CDATA[<p>在网络编程中，服务器程序的代码结构一般如下：</p>
<p>socket() -&gt; bind() -&gt; listen() -&gt; accept()</p>
<p>当有一个新的客户端连接时，accept建立一个新的socket，然后将sockfd返回，接下来数据的发送和接收就都在这个sockfd中进行</p>
<p>但是一直有一个问题我比较困惑：在服务器端，当有数据到达时，协议栈是如何将数据传递到正确的sockfd的呢（服务器端存在多个已连接的客户端）？因为不同的网络连接是使用同一个监听端口，如80端口，不可能为每一个建立的连接分配一个端口（事实也不是这样）；</p>
<p>上网搜寻一下，一个比较合理的解释：使用网络连接的源ip+源port来区分不同的数据连接，本身TCP协议中提供，而且可以唯一标识网络连接，因为不可能同一个客户端使用同一个端口进行来连接server的。</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1290/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>平面中两点的最近距离与最远距离</title>
		<link>http://yaronspace.cn/blog/archives/1286</link>
		<comments>http://yaronspace.cn/blog/archives/1286#comments</comments>
		<pubDate>Mon, 23 May 2011 14:04:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[凸包算法]]></category>
		<category><![CDATA[旋转卡壳算法]]></category>
		<category><![CDATA[最近距离]]></category>
		<category><![CDATA[最远距离]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1286</guid>
		<description><![CDATA[今天看编程之美，看到求平面中两点的最近距离，书中给出了O(nlogn)算法，主要是采用分治的方法来做的，首先将平面的点按x坐标分为两部分，分别求最近点对，然后是合并；合并过程中对于两个点分别在两个区域的分析非常巧妙，有效地减少了需要比较的点对的个数。 在poj中对应的题目3714 然后又看到了扩展问题：如何求平面中最远的两个点的距离 这个就不能继续套用“最近距离点对”的分治策略，上网查了下，原来是使用凸包算法+旋转卡壳算法，poj中对应的题目是2187和3608 这里简单记录下，明天做下这两个题目 关于凸包算法和旋转卡壳算法的介绍： http://yishan.cc/blogs/gpww/archive/2011/02/16/graham-s-scan.aspx http://www.cppblog.com/staryjy/archive/2010/09/25/101412.html http://yishan.cc/blogs/gpww/archive/2011/02/15/1787.aspx ax操作的时间复杂度为]]></description>
			<content:encoded><![CDATA[<p>今天看编程之美，看到求平面中两点的最近距离，书中给出了O(nlogn)算法，主要是采用分治的方法来做的，首先将平面的点按x坐标分为两部分，分别求最近点对，然后是合并；合并过程中对于两个点分别在两个区域的分析非常巧妙，有效地减少了需要比较的点对的个数。</p>
<p>在poj中对应的题目3714</p>
<p>然后又看到了扩展问题：如何求平面中最远的两个点的距离</p>
<p>这个就不能继续套用“最近距离点对”的分治策略，上网查了下，原来是使用凸包算法+旋转卡壳算法，poj中对应的题目是2187和3608</p>
<p>这里简单记录下，明天做下这两个题目</p>
<p>关于凸包算法和旋转卡壳算法的介绍：</p>
<p>http://yishan.cc/blogs/gpww/archive/2011/02/16/graham-s-scan.aspx</p>
<p>http://www.cppblog.com/staryjy/archive/2010/09/25/101412.html</p>
<p>http://yishan.cc/blogs/gpww/archive/2011/02/15/1787.aspx</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 188px; width: 1px; height: 1px; overflow: hidden;"><em>ax</em><em>操作的时间复杂度为</em></div>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1286/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于编译器字节对齐的解释与原因</title>
		<link>http://yaronspace.cn/blog/archives/1280</link>
		<comments>http://yaronspace.cn/blog/archives/1280#comments</comments>
		<pubDate>Thu, 19 May 2011 14:17:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[字节对齐]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1280</guid>
		<description><![CDATA[百度百科解释的比较清楚，记录下 http://baike.baidu.com/view/1523557.htm]]></description>
			<content:encoded><![CDATA[<p>百度百科解释的比较清楚，记录下</p>
<p>http://baike.baidu.com/view/1523557.htm</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1280/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux中有关用户与组的命令小结</title>
		<link>http://yaronspace.cn/blog/archives/1278</link>
		<comments>http://yaronspace.cn/blog/archives/1278#comments</comments>
		<pubDate>Fri, 06 May 2011 06:26:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[命令]]></category>
		<category><![CDATA[用户与组]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1278</guid>
		<description><![CDATA[添加用户： BASH CODEadduser username #添加用户 passwd username #为用户设置密码 adduser -g groupname username #添加用户时也添加组 gpasswd -a usename groupname #将用户添加到组中 添加组： BASH CODEgroupadd groupname # 这里不知为何与adduser的命名方式不一样 锁定用户: BASH CODEpasswd username -l #锁定用户 passwd username -u #解锁用户 永久删除用户： BASH CODEdeluser username groupdel groupname gpasswd -d username groupname #从组groupname中删除用户username]]></description>
			<content:encoded><![CDATA[<p><strong>添加用户：</strong></p>

<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;">adduser username <span style="color: #666666; font-style: italic;">#添加用户</span>
<span style="color: #c20cb9; font-weight: bold;">passwd</span> username  <span style="color: #666666; font-style: italic;">#为用户设置密码</span>
adduser <span style="color: #660033;">-g</span> groupname username <span style="color: #666666; font-style: italic;">#添加用户时也添加组</span>
gpasswd <span style="color: #660033;">-a</span> usename groupname <span style="color: #666666; font-style: italic;">#将用户添加到组中</span></pre></div></div>

<p><strong>添加组：</strong></p>

<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;">groupadd groupname <span style="color: #666666; font-style: italic;"># 这里不知为何与adduser的命名方式不一样</span></pre></div></div>

<p><strong>锁定用户:</strong></p>

<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">passwd</span> username <span style="color: #660033;">-l</span>  <span style="color: #666666; font-style: italic;">#锁定用户</span>
<span style="color: #c20cb9; font-weight: bold;">passwd</span> username <span style="color: #660033;">-u</span> <span style="color: #666666; font-style: italic;">#解锁用户</span></pre></div></div>

<p><strong>永久删除用户：</strong></p>

<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;">deluser username
groupdel groupname
gpasswd <span style="color: #660033;">-d</span> username groupname <span style="color: #666666; font-style: italic;">#从组groupname中删除用户username</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1278/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++沉思录读书笔记：句柄类的实现</title>
		<link>http://yaronspace.cn/blog/archives/1275</link>
		<comments>http://yaronspace.cn/blog/archives/1275#comments</comments>
		<pubDate>Thu, 28 Apr 2011 13:21:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[编程语言与算法设计]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1275</guid>
		<description><![CDATA[对于某些类来说，能够避免复制是很有好处的，比如某些对象会很大，复制起来消耗太大，这时就可以通过 句柄（Handler）的类来实现，它允许在保持类的多态的行为的同时，还可以避免不必要的复制。 句柄类的实现方法 为了避免不必要的对象复制，也就是说允许多个句柄绑定到单个对象上，否则就很难把句柄作为参数传递函数，因为那要求复制句柄而不复制对象。因此我们必须了解有多少个句柄绑定在同一个对象上，只有这样才能确定应当在何时删除对象，通常使用“引用计数(use count)”来达到这个目的。 引用计数应该放到何处呢？ 1.不能作为句柄的一部分，因为这样的话，每个句柄都必须知道跟它一起被绑定到同一个对象的其他句柄的位置，唯有如此才能更新其他句柄的引用计数数据； 2.作为对象的一部分，这样就要求我们重写已经存在的对象类； 3.定义一个新的类，来保存对象和引用计数（可以考虑）； 4.在句柄类中保存引用计数的指针地址，绑定到同一个对象的句柄指向同一个引用计数值； 5.单独抽象出引用计数类，为句柄类提供接口（终极方案）； 使用句柄类时还必须关注一个问题，当对句柄所绑定的对象进行修改时，句柄的语义就分为值语义和指针语义： 值语义：修改句柄绑定的对象，但是不影响其他句柄 （使用写时复制copy-on-write） 指针语义：修改句柄绑定的对象，其他绑定到该对象的句柄也同样修改 （指针的作用） 具体实现请参考C++沉思录]]></description>
			<content:encoded><![CDATA[<p>对于某些类来说，能够避免复制是很有好处的，比如某些对象会很大，复制起来消耗太大，这时就可以通过 <strong>句柄</strong>（Handler）的类来实现，它允许在保持类的多态的行为的同时，还可以避免不必要的复制。</p>
<h5>句柄类的实现方法</h5>
<p>为了避免不必要的对象复制，也就是说允许多个句柄绑定到单个对象上，否则就很难把句柄作为参数传递函数，因为那要求复制句柄而不复制对象。因此我们必须了解有多少个句柄绑定在同一个对象上，只有这样才能确定应当在何时删除对象，通常使用“引用计数(use count)”来达到这个目的。</p>
<p>引用计数应该放到何处呢？</p>
<p>1.不能作为句柄的一部分，因为这样的话，每个句柄都必须知道跟它一起被绑定到同一个对象的其他句柄的位置，唯有如此才能更新其他句柄的引用计数数据；</p>
<p>2.作为对象的一部分，这样就要求我们重写已经存在的对象类；</p>
<p>3.定义一个新的类，来保存对象和引用计数（可以考虑）；</p>
<p>4.在句柄类中保存引用计数的指针地址，绑定到同一个对象的句柄指向同一个引用计数值；</p>
<p>5.单独抽象出引用计数类，为句柄类提供接口（终极方案）；</p>
<p>使用句柄类时还必须关注一个问题，当对句柄所绑定的对象进行修改时，句柄的语义就分为值语义和指针语义：</p>
<p>值语义：修改句柄绑定的对象，但是不影响其他句柄 （使用写时复制copy-on-write）</p>
<p>指针语义：修改句柄绑定的对象，其他绑定到该对象的句柄也同样修改 （指针的作用）</p>
<p>具体实现请参考C++沉思录</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1275/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++沉思录读书笔记：类设计者的核查表</title>
		<link>http://yaronspace.cn/blog/archives/1271</link>
		<comments>http://yaronspace.cn/blog/archives/1271#comments</comments>
		<pubDate>Tue, 26 Apr 2011 13:26:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[C++沉思录]]></category>
		<category><![CDATA[类设计准则]]></category>
		<category><![CDATA[读书笔记]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1271</guid>
		<description><![CDATA[每一个使用C++设计类时，都有必要将下面的14条准则烂熟于心： 1. 你的类需要一个构造函数吗？ 2. 你的数据成员是私有的吗？ 通常公有的数据成员不是什么好事 3. 你的类需要一个无参的构造函数吗？ 如果一个类已经有了构造函数，编译就不会提供默认的无参构造函数，如果需要必须显示地写一个无参的构造函数 4. 是不是每个构造函数初始化所有的数据成员？ 构造函数的用途就是用一种明确定义的状态来设置对象，而对象的状态由对象的数据成员进行反应，因此构造函数都要负责为所有的数据成员设置经过明确定义的值。当然也会有写例外，类会有一些数据成员，他们只在对象存在一定时间后才会有意义。 5. 类需要析构函数吗？ 应该确认类是否分配了资源，这些资源会不会由成员函数自动释放，特别那些构造函数中使用了new表达式的，通常需要在析构函数中使用delete表达式来显式地释放资源 6.类需要一个虚析构函数吗？ 任何虚函数只有在继承的情况下才会有用！ 7. 类需要复制构造函数吗？ 通常有析构函数的类也需要一个复制构造函数！ 8. 类需要一个赋值操作符吗？ 9. 赋值操作符能正确地将对象赋给对象本身吗？ CPP CODEString&#38; String::operator =&#40;const String&#38; s&#41; &#123; if &#40;&#38;s != this&#41; &#123; delete&#91;&#93; this; data = new char&#91;strlen&#40;s.data&#41; + 1&#93;; strcpy&#40;data, s.data&#41;; &#125; return *this; &#125; 10. 类需要定义关系操作符吗？ 11. 删除数组时请记住用delete[] 12.]]></description>
			<content:encoded><![CDATA[<p>每一个使用C++设计类时，都有必要将下面的14条准则烂熟于心：</p>
<p>1. 你的类需要一个构造函数吗？</p>
<p>2. 你的数据成员是私有的吗？</p>
<p>通常公有的数据成员不是什么好事</p>
<p>3. 你的类需要一个无参的构造函数吗？</p>
<p>如果一个类已经有了构造函数，编译就不会提供默认的无参构造函数，如果需要必须显示地写一个无参的构造函数</p>
<p>4. 是不是每个构造函数初始化所有的数据成员？</p>
<p>构造函数的用途就是用一种明确定义的状态来设置对象，而对象的状态由对象的数据成员进行反应，因此构造函数都要负责为所有的数据成员设置经过明确定义的值。当然也会有写例外，类会有一些数据成员，他们只在对象存在一定时间后才会有意义。</p>
<p>5. 类需要析构函数吗？</p>
<p>应该确认类是否分配了资源，这些资源会不会由成员函数自动释放，特别那些构造函数中使用了new表达式的，通常需要在析构函数中使用delete表达式来显式地释放资源</p>
<p>6.类需要一个虚析构函数吗？</p>
<p>任何虚函数只有在继承的情况下才会有用！</p>
<p>7. 类需要复制构造函数吗？</p>
<p>通常有析构函数的类也需要一个复制构造函数！</p>
<p>8. 类需要一个赋值操作符吗？</p>
<p>9. 赋值操作符能正确地将对象赋给对象本身吗？</p>

<div class="wp_syntax"><div class="code_title">CPP CODE</div><div class="code"><pre class="cpp" style="font-family:monospace;">String<span style="color: #000040;">&amp;</span> String<span style="color: #008080;">::</span><span style="color: #007788;">operator</span> <span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> String<span style="color: #000040;">&amp;</span> s<span style="color: #008000;">&#41;</span> 
<span style="color: #008000;">&#123;</span>
     <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>s <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">this</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
           <span style="color: #0000dd;">delete</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #0000dd;">this</span><span style="color: #008080;">;</span>
           data <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> <span style="color: #0000ff;">char</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">strlen</span><span style="color: #008000;">&#40;</span>s.<span style="color: #007788;">data</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
           <span style="color: #0000dd;">strcpy</span><span style="color: #008000;">&#40;</span>data, s.<span style="color: #007788;">data</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #000040;">*</span><span style="color: #0000dd;">this</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>10. 类需要定义关系操作符吗？<br />
11. 删除数组时请记住用delete[]<br />
12. 记得在复制构造函数和赋值操作符的参数类中加上const<br />
13. 如果函数有引用参数，它们应该是const引用吗？<br />
14. 记得适当地声明成员函数为const了吗？</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1271/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>redis中常用数据结构介绍</title>
		<link>http://yaronspace.cn/blog/archives/1263</link>
		<comments>http://yaronspace.cn/blog/archives/1263#comments</comments>
		<pubDate>Wed, 13 Apr 2011 02:56:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[分布式数据存储]]></category>
		<category><![CDATA[开源软件]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[内部数据结构]]></category>
		<category><![CDATA[源码分析]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1263</guid>
		<description><![CDATA[1. 常用数据结构 dict 在redis中最基本的三个数据结构是dict 、adlist和sds，其中dict是redis中最重要的数据结构了，其key-value的映射关系就是通过dict来实现的，dict的内部实现是hash table，这个哈希表的大小是动态增加或减少的，主要是依据哈希表中的元素个数；同时哈希表适用链接法来解决哈希冲突的，具体实现在dict.h和dict.c文件中； adlist adlist(a generic doubly linked list)双向链表，这个数据结构在redis中用的也比较多，包括像当前保存的客户端连接或者是value对应是list的实现等，都是用的adlist，这个应该来说比较简单，具体实现在adlist.h和adlist.c； sds 还有一个比较基本的数据结构就是sds(dynamic string)，对字符串处理的简单封装，具体细节实现在sds.h和sds.c中，有一篇文章是介绍sds的实现的，点击这里 2. 支持的数据类型实现 redis作为key-value数据库，value支持的类型比较多，如string, list, set, hash table, zset（有序的集合），下面简单的介绍下内部是如何实现的： string string就比较简单了，直接使用前面提到的sds即可，但是这里redis为了保证尽量减少内存的占用，当String代表整数值时，将其转化为long类型来存储，节约内存，具体实现请参考t_string.c文件； list list类型的实现使用了两种数据结构adlist和ziplist，所在文件t_list.c ziplist: 当list的数据量&#60; 配置文件list-max-ziplist-entries &#38;&#38; list中元素的大小 &#60;list-max-ziplist-value 时，list采用这种数据结构，这样做一方面为了节省内存，另一方面这种结构式顺序存储的结构，能够更好利用cpu local和预取策略，具体实现在ziplist.c中 adlist: 使用前文提到的双向链表结构，这里不再赘述 set set的实现也是使用两种类型的数据结构，所在文件t_set.c intset: 当集合中的元素为整数时，使用intset数据结构，内部实现就是一个整数数组，数组是有序的，具体实现请参考intset.h和intset.c文件 dict: 当集合中元素包括字符串时，必须将其转化为dict结构，key为元素值，value为NULL，这样即可在O(1)时间内判断集合中是否包含某个元素 hash table hash table的实现也会用到两种数据结构，所在文件t_hash.c zipmap: 使用这种结构的原因与ziplist的原因类似，节省内存，具体实现在zipmap.h和zipmap.c dict:  前面已经介绍过，不再赘述 zset zset有序集合，也会用到两种数据结构skip list 和dict，请参考我的上一篇blog]]></description>
			<content:encoded><![CDATA[<h5>1. 常用数据结构</h5>
<p><strong>dict</strong></p>
<p>在redis中最基本的三个数据结构是dict 、adlist和sds，其中dict是redis中最重要的数据结构了，其key-value的映射关系就是通过dict来实现的，dict的内部实现是hash table，这个哈希表的大小是动态增加或减少的，主要是依据哈希表中的元素个数；同时哈希表适用链接法来解决哈希冲突的，具体实现在dict.h和dict.c文件中；</p>
<p><strong>adlist</strong></p>
<p>adlist(a generic doubly linked list)双向链表，这个数据结构在redis中用的也比较多，包括像当前保存的客户端连接或者是value对应是list的实现等，都是用的adlist，这个应该来说比较简单，具体实现在adlist.h和adlist.c；</p>
<p><strong>sds</strong></p>
<p>还有一个比较基本的数据结构就是sds(dynamic string)，对字符串处理的简单封装，具体细节实现在sds.h和sds.c中，有一篇文章是介绍sds的实现的，<a title="sds" href="http://redis.io/topics/internals-sds" target="_blank">点击这里</a></p>
<h3><span id="more-1263"></span></h3>
<p><br/></p>
<h5><strong>2. 支持的数据类型</strong>实现</h5>
<p>redis作为key-value数据库，value支持的类型比较多，如string, list, set, hash table, zset（有序的集合），下面简单的介绍下内部是如何实现的：</p>
<p><strong>string</strong></p>
<p>string就比较简单了，直接使用前面提到的sds即可，但是这里redis为了保证尽量减少内存的占用，当String代表整数值时，将其转化为long类型来存储，节约内存，具体实现请参考t_string.c文件；</p>
<p><strong>list</strong></p>
<p>list类型的实现使用了两种数据结构adlist和ziplist，所在文件t_list.c</p>
<ul>
<li>ziplist: 当list的数据量&lt; 配置文件list-max-ziplist-entries &amp;&amp; list中元素的大小 &lt;list-max-ziplist-value 时，list采用这种数据结构，这样做一方面为了节省内存，另一方面这种结构式顺序存储的结构，能够更好利用cpu local和预取策略，具体实现在ziplist.c中</li>
<li>adlist: 使用前文提到的双向链表结构，这里不再赘述</li>
</ul>
<p><strong>set</strong></p>
<p>set的实现也是使用两种类型的数据结构，所在文件t_set.c</p>
<ul>
<li>intset: 当集合中的元素为整数时，使用intset数据结构，内部实现就是一个整数数组，数组是有序的，具体实现请参考intset.h和intset.c文件</li>
<li>dict: 当集合中元素包括字符串时，必须将其转化为dict结构，key为元素值，value为NULL，这样即可在O(1)时间内判断集合中是否包含某个元素</li>
</ul>
<p><strong>hash table</strong></p>
<p>hash table的实现也会用到两种数据结构，所在文件t_hash.c</p>
<ul>
<li>zipmap: 使用这种结构的原因与ziplist的原因类似，节省内存，具体实现在zipmap.h和zipmap.c</li>
<li>dict:  前面已经介绍过，不再赘述</li>
</ul>
<p><strong>zset</strong></p>
<p>zset有序集合，也会用到两种数据结构skip list 和dict，请参考我的<a href="http://www.yaronspace.cn/blog/index.php/archives/1259" target="_blank">上一篇blog</a> 实现在t_zset.c中</p>
<p>通过看redis源码，发现其在内存优化方面确实做了不少工作，有很多可以学习的地方的~先写到这里吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1263/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>redis中sorted set的实现原理</title>
		<link>http://yaronspace.cn/blog/archives/1259</link>
		<comments>http://yaronspace.cn/blog/archives/1259#comments</comments>
		<pubDate>Tue, 12 Apr 2011 09:38:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[分布式数据存储]]></category>
		<category><![CDATA[开源软件]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[sorted set]]></category>
		<category><![CDATA[源码分析]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1259</guid>
		<description><![CDATA[从redis 1.1版本，redis开始支持sorted set（有序集合），今天在看redis源码时，具体看了它的实现； 关于ZSET的具体用法：http://redis.io/commands#sorted_set ZSET的实现用到了两个数据结构：hash table 和 skip list(跳跃表)，其中hash table是具体使用redis中的dict来实现的，主要是为了保证查询效率为O(1) ，而skip list(跳跃表)主要是保证元素有序并能够保证INSERT和REMOVE操作是O(logn)的复杂度。 关于skip list这里简单介绍下：skip list是链表的一种特殊形式，对链表的一种优化；保证INSERT和REMOVE操作是O(logn)的负载读，而通用链表的复杂度为O(n); 关于skip list的详细介绍请参考下面这篇文章： http://blog.csdn.net/caoeryingzi/archive/2010/11/18/6018070.aspx sorted set的用途： 可以用作实时排名，例如微博用户的排名 还有TOPN问题等 http://wangyuanzju.blog.163.com/blog/static/1302920099311165490/]]></description>
			<content:encoded><![CDATA[<p>从redis 1.1版本，redis开始支持sorted set（有序集合），今天在看redis源码时，具体看了它的实现；</p>
<p>关于ZSET的具体用法：<a href="http://redis.io/commands#sorted_set" target="_blank">http://redis.io/commands#sorted_set</a></p>
<p>ZSET的实现用到了两个数据结构：hash table 和 skip list(跳跃表)，其中hash table是具体使用redis中的dict来实现的，主要是为了保证查询效率为O(1) ，而skip list(跳跃表)主要是保证元素有序并能够保证INSERT和REMOVE操作是O(logn)的复杂度。</p>
<p>关于skip list这里简单介绍下：skip list是链表的一种特殊形式，对链表的一种优化；保证INSERT和REMOVE操作是O(logn)的负载读，而通用链表的复杂度为O(n);</p>
<p><a href="http://www.yaronspace.cn/blog/wp-content/uploads/2011/04/470px-Skip_list.svg_.png"><img class="aligncenter size-full wp-image-1260" title="470px-Skip_list.svg" src="http://www.yaronspace.cn/blog/wp-content/uploads/2011/04/470px-Skip_list.svg_.png" alt="" width="470" height="110" /></a></p>
<p>关于skip list的详细介绍请参考下面这篇文章：</p>
<p><a href="http://blog.csdn.net/caoeryingzi/archive/2010/11/18/6018070.aspx" target="_blank">http://blog.csdn.net/caoeryingzi/archive/2010/11/18/6018070.aspx</a></p>
<p>sorted set的用途：</p>
<p>可以用作实时排名，例如微博用户的排名</p>
<p>还有TOPN问题等</p>
<p><a href="http://wangyuanzju.blog.163.com/blog/static/1302920099311165490/" target="_blank">http://wangyuanzju.blog.163.com/blog/static/1302920099311165490/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1259/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>redis源码分析资料</title>
		<link>http://yaronspace.cn/blog/archives/1254</link>
		<comments>http://yaronspace.cn/blog/archives/1254#comments</comments>
		<pubDate>Fri, 08 Apr 2011 15:51:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[分布式数据存储]]></category>
		<category><![CDATA[开源软件]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1254</guid>
		<description><![CDATA[最近闲来无事，看看redis源码，看看redis为何如此高效~ 下面是redis代码分析的资料，记录下： 比较全面但不太详细的分析：Redis: under the hood 简单的读和写的完整处理过程：More Redis internals: Tracing a GET &#38; SET (同时也是一个挺好的GDB调试研究源码的实例教程) 关于虚拟内存：Virtual memory 其它资料：http://redis.io/documentation 那就先从redis最原始的1.0版本开始看吧，这里需要说明下，一般学习开源软件代码，最初的版本代码量比较少，看起来不是很费劲，而且基本上能够体现软件的架构信息。 有关本站redis的内容请点击这里]]></description>
			<content:encoded><![CDATA[<p>最近闲来无事，看看redis源码，看看redis为何如此高效~<br />
下面是redis代码分析的资料，记录下：</p>
<p>比较全面但不太详细的分析：<a href="http://www.pauladamsmith.com/articles/redis_under_the_hood.html">Redis: under the hood</a></p>
<p>简单的读和写的完整处理过程：<a href="http://pauladamsmith.com/blog/2011/03/redis_get_set.html">More Redis internals: Tracing a GET &amp; SET </a> (同时也是一个挺好的GDB调试研究源码的实例教程)</p>
<p>关于虚拟内存：<a href="http://redis.io/topics/virtual-memory">Virtual memory</a></p>
<p>其它资料：http://redis.io/documentation</p>
<p>那就先从redis最原始的1.0版本开始看吧，这里需要说明下，一般学习开源软件代码，最初的版本代码量比较少，看起来不是很费劲，而且基本上能够体现软件的架构信息。</p>
<h6>有关本站redis的内容请点击<a href="http://www.yaronspace.cn/blog/?s=redis" target="_self">这里</a></h6>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1254/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++ Web编程</title>
		<link>http://yaronspace.cn/blog/archives/1251</link>
		<comments>http://yaronspace.cn/blog/archives/1251#comments</comments>
		<pubDate>Thu, 07 Apr 2011 13:56:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[LAMP与网站架构]]></category>
		<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[WebServer]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[cgi]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1251</guid>
		<description><![CDATA[C++ Web编程 译者 yaronli (http://www.yaronspace.cn/blog) 原文地址：http://www.tutorialspoint.com/cplusplus/cpp_web_programming.htm 什么是CGI CGI( Common Gateway Interface )，公共网关接口是一组标准，该标准定义了在 web server和普通脚本间是如何交换信息的。 Web浏览 (Web browsing) 为了更好的理解CGI的概念，我们看看当用户为了访问某个页面或者url点击链接时所发生的事情： 你的浏览器联系到HTTP 服务器，然后请求对应的URL，即对应的文件； Web服务器会解析这个URL，然后查找对应文件名。如果找到这个文件，Web服务器就会返回文件的内容给浏览器，否则 的话会返回一条错误信息； Web 浏览器从Web服务器获得响应信息，然后解析返回的文件内容或者是错误信息； 但是，可以这样设置HTTP服务器，当一个文件被请求时，不是将文件内容返回，而是将它作为程序来执行，并将程序产生的输出返回给你的浏览器来显示。 公共网关接口(CGI)就是这样一种协议，它使应用程序(叫做CGI程序或者是CGI脚本)能够与Web服务器交互。CGI程序可以使用Python、perl、Shell、C或者C++来编写。 CGI的架构图 下图展现了CGI的简单架构： Web服务器的配置 在你处理CGI程序之前，请确定你的Web服务器支持CGI程序并且它配置为支持能够处理CGI程序。所有的被HTTP服务器执行CGI程序都会预先配置在规定的目录，这个目录传统上被命名为/var/www/cgi-bin/，默认情况下cgi程序的扩展名为.cgi，尽管它们是C++可执行文件。 默认情况下，Apache Web服务器的CGI程序目录被配置在/var/www/cgi-bin/。如果你想更改目录，请修改在httpd.conf中下面的片段： AllowOverride None Options ExecCGI Order allow,deny Allow from all Options All 译者注(关于apache cgi的配置请参考http://lamp.linux.gov.cn/Apache/ApacheMenu/howto/cgi.html#page-header) 第一CGI程序 考虑下面的代码： CPP CODE#include &#60;iostream&#62; using namespace std; &#160; int]]></description>
			<content:encoded><![CDATA[<h2 style="text-align: center;">C++ Web编程</h2>
<p style="text-align: center;">译者 yaronli (http://www.yaronspace.cn/blog)</p>
<p>原文地址：<a href="http://www.tutorialspoint.com/cplusplus/cpp_web_programming.htm">http://www.tutorialspoint.com/cplusplus/cpp_web_programming.htm</a></p>
<p><strong>什么是</strong><strong>CGI</strong></p>
<p>CGI( Common Gateway Interface )，公共网关接口是一组标准，该标准定义了在 web server和普通脚本间是如何交换信息的。</p>
<p><strong>Web</strong><strong>浏览</strong><strong> (Web browsing)</strong></p>
<p>为了更好的理解CGI的概念，我们看看当用户为了访问某个页面或者url点击链接时所发生的事情：</p>
<ul>
<li> 你的浏览器联系到HTTP 服务器，然后请求对应的URL，即对应的文件；</li>
</ul>
<ul>
<li> Web服务器会解析这个URL，然后查找对应文件名。如果找到这个文件，Web服务器就会返回文件的内容给浏览器，否则 的话会返回一条错误信息；</li>
</ul>
<ul>
<li> Web 浏览器从Web服务器获得响应信息，然后解析返回的文件内容或者是错误信息；</li>
</ul>
<p>但是，可以这样设置HTTP服务器，当一个文件被请求时，不是将文件内容返回，而是将它作为程序来执行，并将程序产生的输出返回给你的浏览器来显示。</p>
<p>公共网关接口(CGI)就是这样一种协议，它使应用程序(叫做CGI程序或者是CGI脚本)能够与Web服务器交互。CGI程序可以使用Python、perl、Shell、C或者C++来编写。</p>
<p><strong>CGI</strong><strong>的架构图</strong><strong> </strong></p>
<p>下图展现了CGI的简单架构：</p>
<p><a href="http://www.yaronspace.cn/blog/wp-content/uploads/2011/04/cgiarch.gif"><img class="aligncenter size-full wp-image-1252" title="cgiarch" src="http://www.yaronspace.cn/blog/wp-content/uploads/2011/04/cgiarch.gif" alt="" width="307" height="199" /></a></p>
<p><strong>Web</strong><strong>服务器的配置</strong><strong> </strong></p>
<p>在你处理CGI程序之前，请确定你的Web服务器支持CGI程序并且它配置为支持能够处理CGI程序。所有的被HTTP服务器执行CGI程序都会预先配置在规定的目录，这个目录传统上被命名为/var/www/cgi-bin/，默认情况下cgi程序的扩展名为.cgi，尽管它们是C++可执行文件。</p>
<p><span id="more-1251"></span></p>
<p>默认情况下，Apache Web服务器的CGI程序目录被配置在/var/www/cgi-bin/。如果你想更改目录，请修改在httpd.conf中下面的片段：</p>
<pre>   AllowOverride None
   Options ExecCGI
   Order allow,deny
   Allow from all

Options All
</pre>
<p>译者注(关于apache cgi的配置请参考http://lamp.linux.gov.cn/Apache/ApacheMenu/howto/cgi.html#page-header)<br />
<strong><br />
</strong></p>
<h4><strong> 第一CGI程序</strong></h4>
<p>考虑下面的代码：</p>

<div class="wp_syntax"><div class="code_title">CPP CODE</div><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
&nbsp;
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Content-type:text/html<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;html&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;head&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;title&gt;Hello World - First CGI Program&lt;/title&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;/head&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;body&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;h2&gt;Hello World! This is my first CGI program&lt;/h2&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;/body&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;/html&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
&nbsp;
   <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>编译上面的代码并将其命名为cpluscplus.cgi，将这个文件放置到/var/www/cgi-bin/下，在运行该程序之前，确保你使用chmod 755 cplusplus.cgi 命令来修改文件权限。现在你可以点击下面的链接cplusplus.cgi然后就会生成如下的内容：</p>
<pre>Hello World! This is my first CGI program
</pre>
<p>面的C++程序简单将输出到STDOUT文件，在第一行输出Content-type:text/html\r\n\r\n一个额外的特点。这行被发送给浏览器并且指示在浏览器中显示的内容类型。你现在可能已经理解了CGI程序的概念了，现在你可以使用Python来编程更复杂的程序了。一个C++的CGI程序可以与外部的其他系统，如RDBM 交互信息。</p>
<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> <w:UseFELayout /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val=" " /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <mce:style><! /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt;} --> <!--[endif]--></p>
<p class="MsoNormal" style="text-align: left;"><strong><span style="font-size: 14pt;" lang="EN-US">HTTP</span></strong><strong><span style="font-size: 14pt; font-family: 宋体;">头</span></strong><strong> </strong></p>
<p class="MsoNormal" style="text-align: left;"><span style="font-family: 宋体;">行</span><strong><span lang="EN-US">Content-type:text/html\r\n\r\n </span></strong><span style="font-family: 宋体;">作为</span><span lang="EN-US">HTTP</span><span style="font-family: 宋体;">头的一部分被发送给浏览器；所有的</span><span lang="EN-US">HTTP</span><span style="font-family: 宋体;">头都是下面的形式：</span></p>
<pre>HTTP Field Name: Field Content

For Example
Content-type: text/html\r\n\r\n
</pre>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 1659px; width: 1px; height: 1px; overflow: hidden;">
<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> <w:UseFELayout /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val=" " /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:普通表格; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} table.MsoTableGrid 	{mso-style-name:网格型; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-priority:59; 	mso-style-unhide:no; 	border:solid black 1.0pt; 	mso-border-themecolor:text1; 	mso-border-alt:solid black .5pt; 	mso-border-themecolor:text1; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-border-insideh:.5pt solid black; 	mso-border-insideh-themecolor:text1; 	mso-border-insidev:.5pt solid black; 	mso-border-insidev-themecolor:text1; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} --> <!--[endif]--></p>
<p class="MsoNormal" style="text-align: left;"><span style="font-family: 宋体;">行</span><strong><span lang="EN-US">Content-type:text/html\r\n\r\n </span></strong><span style="font-family: 宋体;">作为</span><span lang="EN-US">HTTP</span><span style="font-family: 宋体;">头的一部分被发送给浏览器；所有的</span><span lang="EN-US">HTTP</span><span style="font-family: 宋体;">头都是下面的形式：</span></p>
<table class="MsoTableGrid" style="border-collapse: collapse; border: medium none;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 426.1pt; border: 1pt solid black; padding: 0cm 5.4pt;" width="568" valign="top">
<pre><span lang="EN-US">HTTP Field Name: Field Content</span></pre>
<pre><span lang="EN-US"> </span></pre>
<pre><span lang="EN-US">For Example</span></pre>
<pre><span lang="EN-US">Content-type: text/html\r\n\r\n</span></pre>
<p class="MsoNormal" style="text-align: left;"><span lang="EN-US"> </span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal" style="text-align: left;"><span style="font-family: 宋体;">下面的</span><span lang="EN-US">HTTP</span><span style="font-family: 宋体;">头部你可能会经常用到：</span></p>
</div>
<p>下面的HTTP头部你可能会经常用到：</p>
<table class="src" border="1" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<th width="30%">Header</th>
<th>Description</th>
</tr>
<tr>
<td>Content-type:</td>
<td>A MIME string defining the format of the file being returned. Example is Content-type:text/html</td>
</tr>
<tr>
<td>Expires: Date</td>
<td>The date the information becomes  invalid. This should be used by the browser to decide when a page needs  to be refreshed. A valid date string should be in the format 01 Jan 1998  12:00:00 GMT.</td>
</tr>
<tr>
<td>Location: URL</td>
<td>The URL that should be returned instead of the URL requested. You can use this filed to redirect a request to any file.</td>
</tr>
<tr>
<td>Last-modified: Date</td>
<td>The date of last modification of the resource.</td>
</tr>
<tr>
<td>Content-length: N</td>
<td>The length, in bytes, of the data being returned. The browser uses this value to report the estimated download time for a file.</td>
</tr>
<tr>
<td>Set-Cookie: String</td>
<td>Set the cookie passed through the <em>string</em></td>
</tr>
</tbody>
</table>
<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> <w:UseFELayout /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val=" " /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <mce:style><!<br />
/* Style Definitions */<br />
table.MsoNormalTable<br />
{mso-style-name:普通表格;<br />
mso-tstyle-rowband-size:0;<br />
mso-tstyle-colband-size:0;<br />
mso-style-noshow:yes;<br />
mso-style-priority:99;<br />
mso-style-qformat:yes;<br />
mso-style-parent:"";<br />
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;<br />
mso-para-margin:0cm;<br />
mso-para-margin-bottom:.0001pt;<br />
mso-pagination:widow-orphan;<br />
font-size:10.5pt;<br />
mso-bidi-font-size:11.0pt;<br />
font-family:"Calibri","sans-serif";<br />
mso-ascii-font-family:Calibri;<br />
mso-ascii-theme-font:minor-latin;<br />
mso-hansi-font-family:Calibri;<br />
mso-hansi-theme-font:minor-latin;<br />
mso-bidi-font-family:"Times New Roman";<br />
mso-bidi-theme-font:minor-bidi;<br />
mso-font-kerning:1.0pt;}<br />
--> <!--[endif]--></p>
<p class="MsoNormal" style="text-align: left;"><strong><span style="font-size: 14pt;" lang="EN-US">CGI</span></strong><strong><span style="font-size: 14pt; font-family: 宋体;">环境变量</span></strong></p>
<p class="MsoNormal" style="text-align: left;"><strong><span style="font-size: 14pt; font-family: 宋体;"><br />
</span></strong></p>
<p class="MsoNormal" style="text-align: left;"><span style="font-family: 宋体;">所有的</span><span lang="EN-US">CGI</span><span style="font-family: 宋体;">程序都可以访问到下面的环境变量，这些环境变量都写任何</span><span lang="EN-US">CGI</span><span style="font-family: 宋体;">程序都非常重要。</span></p>
<table class="src" border="1" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<th width="30%">Variable Name</th>
<th>Description</th>
</tr>
<tr>
<td>CONTENT_TYPE</td>
<td>The data type of the content. Used when the client is sending attached content to the server. For example file upload etc.</td>
</tr>
<tr>
<td>CONTENT_LENGTH</td>
<td>The length of the query information. It&#8217;s available only for POST requests</td>
</tr>
<tr>
<td>HTTP_COOKIE</td>
<td>Return the set cookies in the form of key &amp; value pair.</td>
</tr>
<tr>
<td>HTTP_USER_AGENT</td>
<td>The User-Agent request-header field  contains information about the user agent originating the request. Its  name of the web browser.</td>
</tr>
<tr>
<td>PATH_INFO</td>
<td>The path for the CGI script.</td>
</tr>
<tr>
<td>QUERY_STRING</td>
<td>The URL-encoded information that is sent with GET method request.</td>
</tr>
<tr>
<td>REMOTE_ADDR</td>
<td>The IP address of the remote host making the request. This can be useful for logging or for authentication purpose.</td>
</tr>
<tr>
<td>REMOTE_HOST</td>
<td>The fully qualified name of the host making  the request. If this information is not available then REMOTE_ADDR can  be used to get IR address.</td>
</tr>
<tr>
<td>REQUEST_METHOD</td>
<td>The method used to make the request. The most common methods are GET and POST.</td>
</tr>
<tr>
<td>SCRIPT_FILENAME</td>
<td>The full path to the CGI script.</td>
</tr>
<tr>
<td>SCRIPT_NAME</td>
<td>The name of the CGI script.</td>
</tr>
<tr>
<td>SERVER_NAME</td>
<td>The server&#8217;s hostname or IP Address</td>
</tr>
<tr>
<td>SERVER_SOFTWARE</td>
<td>The name and version of the software the server is running.</td>
</tr>
</tbody>
</table>
<p>下面的CGI程序就是显示出所有的CGI环境变量。</p>

<div class="wp_syntax"><div class="code_title">CPP CODE</div><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">const</span> string ENV<span style="color: #008000;">&#91;</span> <span style="color: #0000dd;">24</span> <span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span>                 
        <span style="color: #FF0000;">&quot;COMSPEC&quot;</span>, <span style="color: #FF0000;">&quot;DOCUMENT_ROOT&quot;</span>, <span style="color: #FF0000;">&quot;GATEWAY_INTERFACE&quot;</span>,   
        <span style="color: #FF0000;">&quot;HTTP_ACCEPT&quot;</span>, <span style="color: #FF0000;">&quot;HTTP_ACCEPT_ENCODING&quot;</span>,             
        <span style="color: #FF0000;">&quot;HTTP_ACCEPT_LANGUAGE&quot;</span>, <span style="color: #FF0000;">&quot;HTTP_CONNECTION&quot;</span>,         
        <span style="color: #FF0000;">&quot;HTTP_HOST&quot;</span>, <span style="color: #FF0000;">&quot;HTTP_USER_AGENT&quot;</span>, <span style="color: #FF0000;">&quot;PATH&quot;</span>,            
        <span style="color: #FF0000;">&quot;QUERY_STRING&quot;</span>, <span style="color: #FF0000;">&quot;REMOTE_ADDR&quot;</span>, <span style="color: #FF0000;">&quot;REMOTE_PORT&quot;</span>,      
        <span style="color: #FF0000;">&quot;REQUEST_METHOD&quot;</span>, <span style="color: #FF0000;">&quot;REQUEST_URI&quot;</span>, <span style="color: #FF0000;">&quot;SCRIPT_FILENAME&quot;</span>,
        <span style="color: #FF0000;">&quot;SCRIPT_NAME&quot;</span>, <span style="color: #FF0000;">&quot;SERVER_ADDR&quot;</span>, <span style="color: #FF0000;">&quot;SERVER_ADMIN&quot;</span>,      
        <span style="color: #FF0000;">&quot;SERVER_NAME&quot;</span>,<span style="color: #FF0000;">&quot;SERVER_PORT&quot;</span>,<span style="color: #FF0000;">&quot;SERVER_PROTOCOL&quot;</span>,     
        <span style="color: #FF0000;">&quot;SERVER_SIGNATURE&quot;</span>,<span style="color: #FF0000;">&quot;SERVER_SOFTWARE&quot;</span> <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>   
&nbsp;
<span style="color: #0000ff;">int</span> main <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
&nbsp;
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Content-type:text/html<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;html&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;head&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;title&gt;CGI Envrionment Variables&lt;/title&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;/head&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;body&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;table border = <span style="color: #000099; font-weight: bold;">\&quot;</span>0<span style="color: #000099; font-weight: bold;">\&quot;</span> cellspacing = <span style="color: #000099; font-weight: bold;">\&quot;</span>2<span style="color: #000099; font-weight: bold;">\&quot;</span>&gt;&quot;</span><span style="color: #008080;">;</span>
&nbsp;
   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">24</span><span style="color: #008080;">;</span> i<span style="color: #000040;">++</span> <span style="color: #008000;">&#41;</span>
   <span style="color: #008000;">&#123;</span>
       <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;tr&gt;&lt;td&gt;&quot;</span> <span style="color: #000080;">&lt;&lt;</span> ENV<span style="color: #008000;">&#91;</span> i <span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;/td&gt;&lt;td&gt;&quot;</span><span style="color: #008080;">;</span>
       <span style="color: #666666;">// attempt to retrieve value of environment variable</span>
       <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>value <span style="color: #000080;">=</span> <span style="color: #0000dd;">getenv</span><span style="color: #008000;">&#40;</span> ENV<span style="color: #008000;">&#91;</span> i <span style="color: #008000;">&#93;</span>.<span style="color: #007788;">c_str</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span> value <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span> <span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
         <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> value<span style="color: #008080;">;</span>                                 
       <span style="color: #008000;">&#125;</span><span style="color: #0000ff;">else</span><span style="color: #008000;">&#123;</span>
         <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Environment variable does not exist.&quot;</span><span style="color: #008080;">;</span>
       <span style="color: #008000;">&#125;</span>
       <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;/td&gt;&lt;/tr&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #008000;">&#125;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;/table&gt;&lt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;/body&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&lt;/html&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
&nbsp;
   <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<h4>C++ CGI库</h4>
<p>对于真实的例子，你需要通过你的CGI程序做很多操作，下面是针对C++开发来说的CGI库，ftp://ftp.gnu.org/gnu/cgicc/</p>

<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">$tar</span> xzf cgicc-X.X.X.tar.gz
<span style="color: #007800;">$cd</span> cgicc-X.X.X<span style="color: #000000; font-weight: bold;">/</span>
$.<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>usr
<span style="color: #007800;">$make</span>
<span style="color: #007800;">$make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p>下面内容是介绍如何是CGI库来提取GET和POST方法的参数信息和如何设置cookie的，通过参考程序很好理解，暂不翻译了。</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1251/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C中宏使用小贴士与小技巧[原创]</title>
		<link>http://yaronspace.cn/blog/archives/1248</link>
		<comments>http://yaronspace.cn/blog/archives/1248#comments</comments>
		<pubDate>Fri, 01 Apr 2011 14:12:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[macro]]></category>
		<category><![CDATA[宏使用]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1248</guid>
		<description><![CDATA[C中宏使用小贴士与小技巧 译者 yaronli(http://www.yaronspace.cn/blog) 英文地址：http://www.mikeash.com/pyblog/friday-qa-2010-12-31-c-macro-tips-and-tricks.html 预处理 VS 编译 为了理解C中的宏，首先需要理解一个C程序是怎么编译的。特别的，你必须知道在预处理阶段和编译阶段发生的事情的不同之处。 就像名字所说的，预处理首先执行。它会做一些简单的文本操作，比如： 去除注释 处理#include 指令，用include文件内容对它们进行替换 判断#if 和 #ifdef指令 评估#define指令 根据已经定义#define指令，扩展哪些在剩余代码中找到的宏 显然，最后两条与今天讨论的内容最相关。 可以看到，预处理器对它所处理的文本内容并不关心。对于这点也有例外，比如，它知道这是个字符串，并不会扩展里面的的宏： C CODE#define SOMETHING hello &#160; char *str = &#34;SOMETHING, world!&#34; // nope 同时它也可以计算括号的数目，所以它知道这个逗号不会传递给宏两个参数： C CODE#define ONEARG(x) NSLog x &#160; ONEARG&#40;&#40;@&#34;hello, %@&#34;, @&#34;world&#34;&#41;&#41;; 但是通常来说，预处理器对它所处理的内容并不了解。例如，你不能使用#if来判断一个类型是否已经定义： C CODE// makes no sense &#160; #ifndef MyInteger &#160; typedef int MyInteger &#160;]]></description>
			<content:encoded><![CDATA[<h3 style="text-align: center;">C中宏使用小贴士与小技巧</h3>
<p style="text-align: right;">译者  yaronli(http://www.yaronspace.cn/blog)</p>
<p>英文地址：<a href="http://www.mikeash.com/pyblog/friday-qa-2010-12-31-c-macro-tips-and-tricks.html">http://www.mikeash.com/pyblog/friday-qa-2010-12-31-c-macro-tips-and-tricks.html</a></p>
<p><strong>预处理 VS </strong><strong>编译</strong></p>
<p>为了理解C中的宏，首先需要理解一个C程序是怎么编译的。特别的，你必须知道在预处理阶段和编译阶段发生的事情的不同之处。</p>
<p>就像名字所说的，预处理首先执行。它会做一些简单的文本操作，比如：</p>
<ul>
<li> 去除注释</li>
<li> 处理#include 指令，用include文件内容对它们进行替换</li>
<li> 判断#if 和 #ifdef指令</li>
<li> 评估#define指令</li>
<li> 根据已经定义#define指令，扩展哪些在剩余代码中找到的宏</li>
</ul>
<p>显然，最后两条与今天讨论的内容最相关。</p>
<p>可以看到，预处理器对它所处理的文本内容并不关心。对于这点也有例外，比如，它知道这是个字符串，并不会扩展里面的的宏：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define SOMETHING hello</span>
&nbsp;
<span style="color: #993333;">char</span> <span style="color: #339933;">*</span>str <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;SOMETHING, world!&quot;</span> <span style="color: #666666; font-style: italic;">// nope</span></pre></div></div>

<p>同时它也可以计算括号的数目，所以它知道这个逗号不会传递给宏两个参数：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define ONEARG(x) NSLog x</span>
&nbsp;
ONEARG<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>@<span style="color: #ff0000;">&quot;hello, %@&quot;</span><span style="color: #339933;">,</span> @<span style="color: #ff0000;">&quot;world&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>但是通常来说，预处理器对它所处理的内容并不了解。例如，你不能使用#if来判断一个类型是否已经定义：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// makes no sense</span>
&nbsp;
<span style="color: #339933;">#ifndef MyInteger</span>
&nbsp;
<span style="color: #993333;">typedef</span> <span style="color: #993333;">int</span> MyInteger
&nbsp;
<span style="color: #339933;">#endif</span></pre></div></div>

<p>即使MyInteger类型已经定义，#ifndef也会返回true，类型定义发现在编译阶段，此时还未发生。</p>
<p>同样的，对于#define定义的内容也不需要是语法正确的。下面的定义是完全合法的，尽管这是定义宏的很不好的方式：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define STARTLOG NSLog(</span>
&nbsp;
<span style="color: #339933;">#define ENDLOG , &quot;testing&quot;);</span>
&nbsp;
STARTLOG <span style="color: #ff0000;">&quot;just %&quot;</span> ENDLOG</pre></div></div>

<p>预处理只是盲目地用它们定义的内容来替换STARTLOG和ENDLOG。到时编译器会使此段代码有意义，而且它确实是有意义的，完全可以编译成为有效地代码。<span id="more-1248"></span></p>
<p><strong>警告</strong></p>
<p>C语言中的宏利弊并存。它们的一些特点会使它变得很危险，所以需要小心对待。</p>
<p>C预处理器几乎是图灵完全的。用一个简单的驱动程序，可以使用使用预处理器来计算任何可计算的函数。然而，需要做到这一点是非常怪异的扭曲和困难，以至于使图灵完整的C++模板看起来比较简单的。（不太理解）</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define ADD(x, y) x+y</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// produces 14, not 20</span>
&nbsp;
ADD<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #339933;">#define MULT(x, y) x*y</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// produces 14, not 20</span>
&nbsp;
MULT<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">2</span> <span style="color: #339933;">+</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>必须小心的对所有可能需要括号的地方加括号，认真对待可能传递给宏的参数和宏可能出现的场景。计算宏参数多次同样可能导致不可期望的结果：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define MAX(x, y) ((x) &amp;gt; (y) ? (x) : (y))</span>
&nbsp;
<span style="color: #993333;">int</span> a <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> b <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> c <span style="color: #339933;">=</span> MAX<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">++,</span> b<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// now a = 1, c = 1, and b = 3!</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// (a++ &amp;gt; b++ ? a++ : b++)</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// b++ gets evaluated twice</span></pre></div></div>

<p>这种使用带参数的宏和调用函数的语法非常相似，但是不要太傻了。宏需要非常小心细节的。</p>
<p><strong>宏的调试</strong></p>
<p>宏像其它代码一样， 它们也会存在bug。宏的bug会在使用宏的地方以非常诡异的编译错误出现。这会极其让人困惑的。</p>
<p>为了降低迷惑，你就会想到看下预处理后的文件。这就意味着所有的宏都会展开，你会看到编译器所看到的原始的C代码，而不是仅仅扩展你的宏。由于扩展了所有的#include指令，结果文件会非常的大，但是你会在文件末尾找到你的代码。找到你宏使用的地方，弄明白宏是怎么错误的，并正确的修改。</p>
<p><strong>多语句宏</strong></p>
<p>写一个包含多条语句的宏是很普通的。例如：时间定义宏：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define TIME(name, lastTimeVariable) NSTimeInterval now = [[NSProcessInfo processInfo] systemUptime]; if(lastTimeVariable) NSLog(@&quot;%s: %f seconds&quot;, name, now - lastTimeVariable); lastTimeVariable = now</span></pre></div></div>

<p>你可以把它用在一些经常调用的函数中：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">-</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>calledALot
&nbsp;
<span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// do some work</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// time it</span>
&nbsp;
TIME<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;calledALot&quot;</span><span style="color: #339933;">,</span> _calledALotLastTimeIvar<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>这个定义工作地很好，但是把所有的语句写到一行是非常丑陋的。我们把它分成多行。通常#define 是在行尾结束的，但是你可以在行尾放置\ ，这样就可以使预处理器知道下一行也是定义。</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define TIME(name, lastTimeVariable) \
</span>
NSTimeInterval now <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#91;</span>NSProcessInfo processInfo<span style="color: #009900;">&#93;</span> systemUptime<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> \
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>lastTimeVariable<span style="color: #009900;">&#41;</span> \
&nbsp;
NSLog<span style="color: #009900;">&#40;</span>@<span style="color: #ff0000;">&quot;%s: %f seconds&quot;</span><span style="color: #339933;">,</span> name<span style="color: #339933;">,</span> now <span style="color: #339933;">-</span> lastTimeVariable<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> \
&nbsp;
lastTimeVariable <span style="color: #339933;">=</span> now</pre></div></div>

<p>这样工作更简单了。但是，这个宏存在瑕疵，考虑下面的例子：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">-</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>calledALot
&nbsp;
<span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>...<span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// only time some calls</span>
&nbsp;
TIME<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;calledALot&quot;</span><span style="color: #339933;">,</span> _calledALotLastTimeIvar<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>这个宏被展开为：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">-</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>calledALot
&nbsp;
<span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>...<span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// only time some calls</span>
&nbsp;
NSTimeInterval now <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#91;</span>NSProcessInfo processInfo<span style="color: #009900;">&#93;</span> systemUptime<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>_calledALotLastTimeIvar<span style="color: #009900;">&#41;</span>
&nbsp;
NSLog<span style="color: #009900;">&#40;</span>@<span style="color: #ff0000;">&quot;%s: %f seconds&quot;</span><span style="color: #339933;">,</span> name<span style="color: #339933;">,</span> now <span style="color: #339933;">-</span> _calledALotLastTimeIvar<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
_calledALotLastTimeIvar <span style="color: #339933;">=</span> now<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>这个将不会编译。将NSTimeInterval声明在if语句中是不合法的。即使能够工作，只有第一条语句是在if段中的，接下来的语句无论如何都会执行，不是我们想要的。</p>
<p>可以在宏定义的两端加入大括号来解决这个问题：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define TIME(name, lastTimeVariable) \
</span>
<span style="color: #009900;">&#123;</span> \
&nbsp;
NSTimeInterval now <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#91;</span>NSProcessInfo processInfo<span style="color: #009900;">&#93;</span> systemUptime<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> \
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>_calledALotLastTimeIvar<span style="color: #009900;">&#41;</span> \
&nbsp;
NSLog<span style="color: #009900;">&#40;</span>@<span style="color: #ff0000;">&quot;%s: %f seconds&quot;</span><span style="color: #339933;">,</span> name<span style="color: #339933;">,</span> now <span style="color: #339933;">-</span> _calledALotLastTimeIvar<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> \
&nbsp;
_calledALotLastTimeIvar <span style="color: #339933;">=</span> now<span style="color: #339933;">;</span> \
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>现在它展开后的样子是：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">-</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>calledALot
&nbsp;
<span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>...<span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// only time some calls</span>
&nbsp;
<span style="color: #009900;">&#123;</span>
&nbsp;
NSTimeInterval now <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#91;</span>NSProcessInfo processInfo<span style="color: #009900;">&#93;</span> systemUptime<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>lastTimeVariable<span style="color: #009900;">&#41;</span>
&nbsp;
NSLog<span style="color: #009900;">&#40;</span>@<span style="color: #ff0000;">&quot;%s: %f seconds&quot;</span><span style="color: #339933;">,</span> name<span style="color: #339933;">,</span> now <span style="color: #339933;">-</span> lastTimeVariable<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
lastTimeVariable <span style="color: #339933;">=</span> now<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>相当不错，除了在}后面的分号了，事实上这也是个问题，考虑如下情况：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">-</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>calledALot
&nbsp;
<span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>...<span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// only time some calls</span>
&nbsp;
TIME<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;calledALot&quot;</span><span style="color: #339933;">,</span> _calledALotLastTimeIvar<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">else</span> <span style="color: #666666; font-style: italic;">// otherwise do something else</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// stuff</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>展开后的样子是：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">-</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>calledALot
&nbsp;
<span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>...<span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// only time some calls</span>
&nbsp;
<span style="color: #009900;">&#123;</span>
&nbsp;
NSTimeInterval now <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#91;</span>NSProcessInfo processInfo<span style="color: #009900;">&#93;</span> systemUptime<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>_calledALotLastTimeIvar<span style="color: #009900;">&#41;</span>
&nbsp;
NSLog<span style="color: #009900;">&#40;</span>@<span style="color: #ff0000;">&quot;%s: %f seconds&quot;</span><span style="color: #339933;">,</span> name<span style="color: #339933;">,</span> now <span style="color: #339933;">-</span> _calledALotLastTimeIvar<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
_calledALotLastTimeIvar <span style="color: #339933;">=</span> now<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">else</span> <span style="color: #666666; font-style: italic;">// otherwise do something else</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// stuff</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>这个分号将导致语法错误。</p>
<p>现在你想可能想让用户使用该宏时，不要在后面加入分号。但是，这会很不自然而且对向代码自动对齐造成混乱的。</p>
<p>一个更好的解决方法是将代码块封装在do {…}while(0)中，这个结构需要在尾部加入一个分号，这正是我们所需要的。使用while(0)保证了这个循环永远不会执行循环，而且它的内容保证只执行一次。</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define TIME(name, lastTimeVariable) \
</span>
<span style="color: #b1b100;">do</span> <span style="color: #009900;">&#123;</span> \
&nbsp;
NSTimeInterval now <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#91;</span>NSProcessInfo processInfo<span style="color: #009900;">&#93;</span> systemUptime<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> \
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>lastTimeVariable<span style="color: #009900;">&#41;</span> \
&nbsp;
NSLog<span style="color: #009900;">&#40;</span>@<span style="color: #ff0000;">&quot;%s: %f seconds&quot;</span><span style="color: #339933;">,</span> name<span style="color: #339933;">,</span> now <span style="color: #339933;">-</span> lastTimeVariable<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> \
&nbsp;
lastTimeVariable <span style="color: #339933;">=</span> now<span style="color: #339933;">;</span> \
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>这个宏在if语句和其他情况下工作的很好。多语句宏通常使用do{…}while(0)封装就是这个原因。</p>
<p>这个宏定义了变量now，对于宏变量来说，这是不好的名字，因为可能会与外部引起冲突。考虑下面的代码:</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;">NSTimeInterval now<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// ivar</span>
&nbsp;
TIME<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;whatever&quot;</span><span style="color: #339933;">,</span> now<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>这个将不会工作，调试它也不是那么简单，因为这种错误太细微了。</p>
<p>很不幸，C语言并没有提供一个方法来生产唯一的变量名字，最好的方法就是加前缀，如下面代码：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define TIME(name, lastTimeVariable) \
</span>
<span style="color: #b1b100;">do</span> <span style="color: #009900;">&#123;</span> \
&nbsp;
NSTimeInterval MA_now <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#91;</span>NSProcessInfo processInfo<span style="color: #009900;">&#93;</span> systemUptime<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> \
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>lastTimeVariable<span style="color: #009900;">&#41;</span> \
&nbsp;
NSLog<span style="color: #009900;">&#40;</span>@<span style="color: #ff0000;">&quot;%s: %f seconds&quot;</span><span style="color: #339933;">,</span> name<span style="color: #339933;">,</span> MA_now <span style="color: #339933;">-</span> lastTimeVariable<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> \
&nbsp;
lastTimeVariable <span style="color: #339933;">=</span> MA_now<span style="color: #339933;">;</span> \
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>现在这个宏就非常安全了。</p>
<p><strong>字符串连接</strong></p>
<p>这个功能严格上来说并不是宏的一部分，但是它对创建宏很重要，所以值得在这里提一下。在C语言中，如果你在源代码中将两个字符串放到一起，它们将进行连接，这是一个少为人知的特点。</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>helloworld <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;hello, &quot;</span> <span style="color: #ff0000;">&quot;world!&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// equivalent to &quot;hello, world!&quot;</span></pre></div></div>

<p>你可以利用这点使用宏来讲宏参数与字符串常量进行连接：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define COM_URL(domain) [NSURL URLWithString: &quot;http://www.&quot; domain &quot;.com&quot;];</span>
&nbsp;
COM_URL<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;google&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// gives http://www.google.com</span>
&nbsp;
COM_URL<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;apple&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// gives http://www.apple.com</span></pre></div></div>

<p><strong>字符化</strong></p>
<p>通过在参数名字前加入#，预处理器会将这个参数的内容转化为C字符串，例如：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define TEST(condition) \
</span>
<span style="color: #b1b100;">do</span> <span style="color: #009900;">&#123;</span> \
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>condition<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> \
&nbsp;
NSLog<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Failed test: %s&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">#condition); \
</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
&nbsp;
TEST<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// logs: Failed test: 1 == 2</span></pre></div></div>

<p>但是，你需要非常小心地使用。如果参数中包括了宏，它将不会被扩展。例如：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define WITHIN(x, y, delta) (fabs((x) - (y)) &amp;lt; delta)</span>
&nbsp;
TEST<span style="color: #009900;">&#40;</span>WITHIN<span style="color: #009900;">&#40;</span><span style="color:#800080;">1.1</span><span style="color: #339933;">,</span> <span style="color:#800080;">1.2</span><span style="color: #339933;">,</span> <span style="color:#800080;">0.05</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// logs: Failed test: WITHIN(1.1, 1.2, 0.05)</span></pre></div></div>

<p><strong>Token Pasting</strong><strong>（不知怎么翻译）</strong></p>
<p>预处理器提供了##操作符来连接token。这就允许你在宏中build多个相关的item以降低冗余。a##b将生产新的token ab，如果a 或者b是宏参数，它们的内容将会被使用。一个没有意义的例子：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define NSify(x) NS ## x</span>
&nbsp;
NSify<span style="color: #009900;">&#40;</span>String<span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span>s<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// gives NSString</span></pre></div></div>

<p>关于使用，请参考我的另一篇文章：<a href="../index.php/archives/1216">http://www.yaronspace.cn/blog/index.php/archives/1216</a></p>
<p><strong>变量参数列表</strong></p>
<p>想像你想要写一个写日志的宏，如果全局变量被设置则记录日志：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define LOG(string) \
</span>
<span style="color: #b1b100;">do</span> <span style="color: #009900;">&#123;</span> \
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>gLoggingEnabled<span style="color: #009900;">&#41;</span> \
&nbsp;
NSLog<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Conditional log: %s&quot;</span><span style="color: #339933;">,</span> <span style="color: #993333;">string</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> \
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>这么调用:</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;">LOG<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;hello&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//输出：</span>
Conditional log<span style="color: #339933;">:</span> hello</pre></div></div>

<p>这个非常方便，但是太简单了。NSLog接收一个字符串format和变量列表，如果LOG能够这么工作，宏才会非常有用：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;">LOG<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;count: %d  name: %s&quot;</span><span style="color: #339933;">,</span> count<span style="color: #339933;">,</span> name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>如果使用原来的定义，会产生错误，宏只接收一个参数，而你确提供了三个参数。</p>
<p>将…置于宏参数列表的末尾，这个宏就会接受可变的参数。然后你就可以使用__VA_ARGS__标识符在宏体中使用，它会被可变参数，逗号所替代。代码如下：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define LOG(...) \
</span>
<span style="color: #b1b100;">do</span> <span style="color: #009900;">&#123;</span> \
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>gLoggingEnabled<span style="color: #009900;">&#41;</span> \
&nbsp;
NSLog<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Conditional log: &quot;</span> __VA_ARGS__<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> \
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>宏工作正常，但是在可变参数部分前面加一个固定的参数将会是非常有用的。例如，</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define LOG(fmt, ...) \
</span>
<span style="color: #b1b100;">do</span> <span style="color: #009900;">&#123;</span> \
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>gLoggingEnabled<span style="color: #009900;">&#41;</span> \
&nbsp;
NSLog<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Conditional log: --- &quot;</span> fmt <span style="color: #ff0000;">&quot; ---&quot;</span><span style="color: #339933;">,</span> __VA_ARGS__<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> \
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>这样会有一个问题，你不能仅仅提供一个参数，像LOG(“hello”)，展开后为：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;">NSLog<span style="color: #009900;">&#40;</span>@<span style="color: #ff0000;">&quot;Conditional log: --- &quot;</span> <span style="color: #ff0000;">&quot;hello&quot;</span> <span style="color: #ff0000;">&quot; ---&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>最后一个逗号会产生语法错误。</p>
<p>正确的方法是使用##，如果可变参数为空，预处理会删除最后的逗号。</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define LOG(fmt, ...) \
</span>
<span style="color: #b1b100;">do</span> <span style="color: #009900;">&#123;</span> \
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>gLoggingEnabled<span style="color: #009900;">&#41;</span> \
&nbsp;
NSLog<span style="color: #009900;">&#40;</span>@<span style="color: #ff0000;">&quot;Conditional log: --- &quot;</span> fmt <span style="color: #ff0000;">&quot; ---&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">## __VA_ARGS__); \
</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p><strong>特殊的标识符</strong></p>
<p><strong> </strong></p>
<p>C提供一些内置的标识符，在构建宏是非常有用：</p>
<ul>
<li> __LINE__:扩展为当前行号</li>
<li> __FILE__:扩展为当前的源码文件</li>
<li> __func__:扩展为当前执行的函数名称</li>
</ul>
<p>现在我们就可以这样定义日志宏：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define LOG(fmt, ...) NSLog(&quot;%s:%d (%s): &quot; fmt, __FILE__, __LINE__, __func__, ## __VA_ARGS__)</span></pre></div></div>

<p><strong>Typeof</strong></p>
<p>这是gcc一个扩展，不是标准C的，它提供表达式的类型。</p>
<p>使用 __typeof__, 这个宏可以这么定义:</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define MAX(x, y) (^{ \
</span>
__typeof__<span style="color: #009900;">&#40;</span>x<span style="color: #009900;">&#41;</span> my_localx <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>x<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> \
&nbsp;
__typeof__<span style="color: #009900;">&#40;</span>y<span style="color: #009900;">&#41;</span> my_localy <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>y<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> \
&nbsp;
<span style="color: #b1b100;">return</span> my_localx <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> my_localy <span style="color: #339933;">?</span> <span style="color: #009900;">&#40;</span>my_localx<span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #009900;">&#40;</span>my_localy<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> \
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p><strong>结论</strong></p>
<p>C宏复杂而强大。如果用它，一定要非常小心不要滥用。但是，在一些情况下，宏是非常有用的，利用这些小贴士和小技巧，使用宏可以使你的代码更容易些和阅读。</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1248/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pthreads并行编程之spin lock与mutex性能对比分析[zz]</title>
		<link>http://yaronspace.cn/blog/archives/1246</link>
		<comments>http://yaronspace.cn/blog/archives/1246#comments</comments>
		<pubDate>Tue, 29 Mar 2011 12:19:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[mutex]]></category>
		<category><![CDATA[pthread]]></category>
		<category><![CDATA[spinlock]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1246</guid>
		<description><![CDATA[原文地址：http://www.parallellabs.com/2010/01/31/pthreads-programming-spin-lock-vs-mutex-performance-analysis/ Pthreads提供的Mutex锁操作相关的API主要有： pthread_mutex_lock (pthread_mutex_t *mutex); pthread_mutex_trylock (pthread_mutex_t *mutex); pthread_mutex_unlock (pthread_mutex_t *mutex); Pthreads提供的与Spin Lock锁操作相关的API主要有： pthread_spin_lock (pthread_spinlock_t *lock); pthread_spin_trylock (pthread_spinlock_t *lock); pthread_spin_unlock (pthread_spinlock_t *lock); 从实现原理上来讲，Mutex属于sleep-waiting类型的锁。例如在一个双核的机器上有两个线程(线程A和线程B)，它们分别运行在 Core0和Core1上。假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁，而此时这个锁正被线程B所持有，那么线程 A就会被阻塞(blocking)，Core0 会在此时进行上下文切换(Context Switch)将线程A置于等待队列中，此时Core0就可以运行其他的任务(例如另一个线程C)而不必进行忙等待。而Spin lock则不然，它属于busy-waiting类型的锁，如果线程A是使用pthread_spin_lock操作去请求锁，那么线程A就会一直在 Core0上进行忙等待并不停的进行锁请求，直到得到这个锁为止。 详细信息请点击：这里]]></description>
			<content:encoded><![CDATA[<p>原文地址：<a href="http://www.parallellabs.com/2010/01/31/pthreads-programming-spin-lock-vs-mutex-performance-analysis/" target="_blank">http://www.parallellabs.com/2010/01/31/pthreads-programming-spin-lock-vs-mutex-performance-analysis/</a></p>
<p>Pthreads提供的Mutex锁操作相关的API主要有：<br />
<a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_mutex_lock.txt">pthread_mutex_lock (pthread_mutex_t *mutex);</a><br />
<a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_mutex_trylock.txt"> pthread_mutex_trylock (pthread_mutex_t *mutex);</a><br />
<a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_mutex_unlock.txt"> pthread_mutex_unlock (pthread_mutex_t *mutex);</a></p>
<p>Pthreads提供的与Spin Lock锁操作相关的API主要有：<br />
<a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_spin_lock.txt">pthread_spin_lock (pthread_spinlock_t *lock);</a><br />
<a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_spin_trylock.txt">pthread_spin_trylock (pthread_spinlock_t *lock);</a><br />
<a href="https://computing.llnl.gov/tutorials/pthreads/man/pthread_spin_unlock.txt">pthread_spin_unlock (pthread_spinlock_t *lock);</a></p>
<p>从实现原理上来讲，Mutex属于sleep-waiting类型的锁。例如在一个双核的机器上有两个线程(线程A和线程B)，它们分别运行在 Core0和Core1上。假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁，而此时这个锁正被线程B所持有，那么线程 A就会被阻塞(blocking)，Core0 会在此时进行上下文切换(Context  Switch)将线程A置于等待队列中，此时Core0就可以运行其他的任务(例如另一个线程C)而不必进行忙等待。而Spin  lock则不然，它属于busy-waiting类型的锁，如果线程A是使用pthread_spin_lock操作去请求锁，那么线程A就会一直在  Core0上进行忙等待并不停的进行锁请求，直到得到这个锁为止。</p>
<h3>详细信息请点击：<a href="http://www.parallellabs.com/2010/01/31/pthreads-programming-spin-lock-vs-mutex-performance-analysis/" target="_blank">这里</a></h3>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1246/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux下跨线程的越界访问hook方法</title>
		<link>http://yaronspace.cn/blog/archives/1241</link>
		<comments>http://yaronspace.cn/blog/archives/1241#comments</comments>
		<pubDate>Tue, 29 Mar 2011 03:03:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[线程越界访问]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1241</guid>
		<description><![CDATA[我们知道在linux下多线程之间，是共用同一片存储区域的，可以访问共享的全局变量等，但是能否访问线程内部的局部变量呢，会不会出现越界异常呢？今天笔者尝试了一下，发现可以在线程间越界访问！ 代码如下： BASH CODE/* * Author:yaronli &#60;jidalyg_8711@163.com&#62; * http://www.yaronspace.cn/blog * * File: hookpthread.c * Create Date: 2011-03-27 21:22:31 * */ #include &#60;stdio.h&#62; #include &#60;pthread.h&#62; void * fun&#40;void * i&#41; &#123; int a=20; printf&#40;&#34;fun: &#38;a:[%x]-----a:[%d]\n&#34;, &#38;a,a&#41;; sleep&#40;3&#41;; printf&#40;&#34;fun: &#38;a:[%x]-----a:[%d]\n&#34;, &#38;a,a&#41;; pthread_exit&#40;NULL&#41;; &#160; &#125; &#160; void * hook&#40;void * a&#41; &#123; int b=10; sleep&#40;1&#41;; printf&#40;&#34;hook: &#38;b:[%x]\n&#34;, &#38;b&#41;;]]></description>
			<content:encoded><![CDATA[<p>我们知道在linux下多线程之间，是共用同一片存储区域的，可以访问共享的全局变量等，但是能否访问线程内部的局部变量呢，会不会出现越界异常呢？今天笔者尝试了一下，发现可以在线程间越界访问！</p>
<p>代码如下：</p>

<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/*</span>
 <span style="color: #000000; font-weight: bold;">*</span> Author:yaronli <span style="color: #000000; font-weight: bold;">&lt;</span>jidalyg_8711<span style="color: #000000; font-weight: bold;">@</span>163.com<span style="color: #000000; font-weight: bold;">&gt;</span>
 <span style="color: #000000; font-weight: bold;">*</span> http:<span style="color: #000000; font-weight: bold;">//</span>www.yaronspace.cn<span style="color: #000000; font-weight: bold;">/</span>blog
 <span style="color: #000000; font-weight: bold;">*</span>
 <span style="color: #000000; font-weight: bold;">*</span> File: hookpthread.c
 <span style="color: #000000; font-weight: bold;">*</span> Create Date: <span style="color: #000000;">2011</span>-03-<span style="color: #000000;">27</span> <span style="color: #000000;">21</span>:<span style="color: #000000;">22</span>:<span style="color: #000000;">31</span>
 <span style="color: #000000; font-weight: bold;">*</span>
 <span style="color: #000000; font-weight: bold;">*/</span>
<span style="color: #666666; font-style: italic;">#include &lt;stdio.h&gt;</span>
<span style="color: #666666; font-style: italic;">#include &lt;pthread.h&gt;</span>
void <span style="color: #000000; font-weight: bold;">*</span> fun<span style="color: #7a0874; font-weight: bold;">&#40;</span>void <span style="color: #000000; font-weight: bold;">*</span> i<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
    int <span style="color: #007800;">a</span>=<span style="color: #000000;">20</span>;
    <span style="color: #7a0874; font-weight: bold;">printf</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;fun: &amp;a:[%x]-----a:[%d]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000000; font-weight: bold;">&amp;</span>a,a<span style="color: #7a0874; font-weight: bold;">&#41;</span>;
    <span style="color: #c20cb9; font-weight: bold;">sleep</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
    <span style="color: #7a0874; font-weight: bold;">printf</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;fun: &amp;a:[%x]-----a:[%d]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000000; font-weight: bold;">&amp;</span>a,a<span style="color: #7a0874; font-weight: bold;">&#41;</span>;
    pthread_exit<span style="color: #7a0874; font-weight: bold;">&#40;</span>NULL<span style="color: #7a0874; font-weight: bold;">&#41;</span>;
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
void <span style="color: #000000; font-weight: bold;">*</span> hook<span style="color: #7a0874; font-weight: bold;">&#40;</span>void <span style="color: #000000; font-weight: bold;">*</span> a<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
    int <span style="color: #007800;">b</span>=<span style="color: #000000;">10</span>;
    <span style="color: #c20cb9; font-weight: bold;">sleep</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
    <span style="color: #7a0874; font-weight: bold;">printf</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;hook: &amp;b:[%x]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000000; font-weight: bold;">&amp;</span>b<span style="color: #7a0874; font-weight: bold;">&#41;</span>;
    <span style="color: #7a0874; font-weight: bold;">printf</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;hook: &amp;a:[%d]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&amp;</span>b-<span style="color: #000000;">10489856</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">4</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
    <span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&amp;</span>b-<span style="color: #000000;">10489856</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">4</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>=<span style="color: #000000;">30</span>;
    pthread_exit<span style="color: #7a0874; font-weight: bold;">&#40;</span>NULL<span style="color: #7a0874; font-weight: bold;">&#41;</span>;
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
int main<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
    pthread_t pidfun,pidhook;
    pthread_create<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&amp;</span>pidfun, NULL, fun, NULL<span style="color: #7a0874; font-weight: bold;">&#41;</span>;
    pthread_create<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&amp;</span>pidhook, NULL, hook, NULL<span style="color: #7a0874; font-weight: bold;">&#41;</span>;
    <span style="color: #c20cb9; font-weight: bold;">sleep</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">5</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
    <span style="color: #7a0874; font-weight: bold;">return</span> <span style="color: #000000;">0</span>;
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #000000; font-weight: bold;">/*</span> <span style="color: #c20cb9; font-weight: bold;">vim</span>: <span style="color: #000000; font-weight: bold;">set</span> <span style="color: #007800;">ts</span>=<span style="color: #000000;">4</span> <span style="color: #007800;">sw</span>=<span style="color: #000000;">4</span>: <span style="color: #000000; font-weight: bold;">*/</span></pre></div></div>

<p>该程序首先是在启动两个线程，在fun线程中设置局部变量a=20并显示出来，在hook线程中尝试读取a的变量值并试图更改它，然后再次显示变量a的值<br />
<strong>在我的机器上的输出如下：</strong></p>
<pre>
fun: &#038;a:[419c512c]-----a:[20]
hook: &#038;b:[423c612c]
hook: &#038;a:[20]
fun: &#038;a:[419c512c]-----a:[30]
</pre>
<p>可以发现a的在值在线程hook中被修改成功了，并没有出现越界访问异常</p>
<p><strong>TIPS:</strong><br />
1. 10489856/4  关于这个值的获取是通过&#038;b和&#038;a的地址相减得到的，至于为什么除4，是因为&#038;b是int型的指针，而指针的加减法的单位是4个字节，所以需要除以4，这里我也是调试好半边才搞明白的.</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1241/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>drupal号称比wordpress更强大</title>
		<link>http://yaronspace.cn/blog/archives/1236</link>
		<comments>http://yaronspace.cn/blog/archives/1236#comments</comments>
		<pubDate>Mon, 28 Mar 2011 01:42:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[LAMP与网站架构]]></category>
		<category><![CDATA[开源软件]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[用途]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1236</guid>
		<description><![CDATA[drupal没有wordpress普及，但是功能应该比wordpress更强大，有以下8个用途： 项目主页：http://drupal.org 1. 文件存储分享站点 使用Drupal创建文件分享，你可以使用 CCK 和 Views ，也包括一些模块，比如Media Mover, Filebrowser 或者 Web File Manager。看看Box.net，你会非常感兴趣的^_^。 2. 社交网站 在社交网络能力方面，Drupal可能是最好的CMS。Drupal提供了强大的用户管理和权限管理系统。但是如果你想创建强大的社交网站，就需要一些模块，见http://drupal.org/node/206724。 你想看一些案例？Imbee 或者 GoingOn。 3. Twitter Clone 建议你不要尝试利用Drupal创建Twitter竞争产品，但是，如果你想整合Twitter功能到你的站点，Drupal的微博模块 可以帮到你。 4. 新闻News portal 如果你想创建新闻站点或杂志站点，Drupal的完美的选择。使用CCK 和 Views ，你可以创建所有的发布内容类型，并且可灵活列表。这样的新闻站点非常之多，比如New York Observer。 5. 博客网络 用Drupal创建博客网站，很轻松，甚至无需额外模块。看看 Wisebread吧。 6. 视频分享站点 这类站点太耗带宽了，如果你决定创建，那么Drupal来帮你实现吧。FlashVideo 模块提供了创建Youtube克隆的强大能力，它整合了CCK，转换视频到FLV，并有分享代码。另外你也可以尝试Media Mover 和 SWF Tools 。MTV UK 站点就是Drupal创建的。 7. 图片分享站点 Image module ，这个模块将派上用场，可让你创建类Flickr站点，很好很强大。MyFinePix]]></description>
			<content:encoded><![CDATA[<p>drupal没有wordpress普及，但是功能应该比wordpress更强大，有以下8个用途：</p>
<p>项目主页：<a href="http://drupal.org">http://drupal.org</a></p>
<p>1. 文件存储分享站点<br />
使用Drupal创建文件分享，你可以使用 CCK 和 Views ，也包括一些模块，比如Media Mover, Filebrowser 或者 Web File Manager。看看Box.net，你会非常感兴趣的^_^。</p>
<p>2. 社交网站<br />
在社交网络能力方面，Drupal可能是最好的CMS。Drupal提供了强大的用户管理和权限管理系统。但是如果你想创建强大的社交网站，就需要一些模块，见http://drupal.org/node/206724。<br />
你想看一些案例？Imbee 或者 GoingOn。</p>
<p>3. Twitter Clone<br />
建议你不要尝试利用Drupal创建Twitter竞争产品，但是，如果你想整合Twitter功能到你的站点，Drupal的微博模块 可以帮到你。</p>
<p>4. 新闻News portal<br />
如果你想创建新闻站点或杂志站点，Drupal的完美的选择。使用CCK 和 Views ，你可以创建所有的发布内容类型，并且可灵活列表。这样的新闻站点非常之多，比如New York Observer。</p>
<p>5. 博客网络<br />
用Drupal创建博客网站，很轻松，甚至无需额外模块。看看 Wisebread吧。</p>
<p>6. 视频分享站点<br />
这类站点太耗带宽了，如果你决定创建，那么Drupal来帮你实现吧。FlashVideo 模块提供了创建Youtube克隆的强大能力，它整合了CCK，转换视频到FLV，并有分享代码。另外你也可以尝试Media Mover 和 SWF Tools 。MTV UK 站点就是Drupal创建的。</p>
<p>7. 图片分享站点<br />
Image module ，这个模块将派上用场，可让你创建类Flickr站点，很好很强大。MyFinePix 就是Drupal创建的照片分享站点。</p>
<p>8. 类Digg-like news site<br />
感谢 Drigg module, 这个模块可帮助你快速建立Digg克隆站点。流行的设计社交新闻网Designbump在使用Drupal。</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1236/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux查看系统的启动时间和运行时间</title>
		<link>http://yaronspace.cn/blog/archives/1232</link>
		<comments>http://yaronspace.cn/blog/archives/1232#comments</comments>
		<pubDate>Thu, 17 Mar 2011 01:46:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[系统的启动时间]]></category>
		<category><![CDATA[系统的运行时间]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1232</guid>
		<description><![CDATA[1. uptime命令 输出：09:32:17 up  8:41,  1 user,  load average: 0.01, 0.00, 0.00 其中8:41代表系统已经运行8小时41分 2.查看/proc/uptime BASH CODE&#91;yangguang@sim124 ~&#93;$ cat /proc/uptime 31351.83 31341.94 #第一个数字代表已经运行的时间 &#160; #可以用date命令来计算出系统的启动时间 &#91;yangguang@sim124 ~&#93;$ date -d &#34;$(awk -F. '{print $1}' /proc/uptime) second ago&#34; +&#34;%Y-%m-%d %H:%M:%S&#34; &#160; 2011-03-17 00:50:51 &#160; #使用date命令计算系统的运行时间 &#91;yangguang@sim124 ~&#93;$ cat /proc/uptime&#124; awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1]]></description>
			<content:encoded><![CDATA[<p>1. uptime命令</p>
<p>输出：09:32:17 up  <strong>8:41</strong>,  1 user,  load average: 0.01, 0.00, 0.00</p>
<p>其中8:41代表系统已经运行8小时41分</p>
<p>2.查看/proc/uptime</p>

<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span>yangguang<span style="color: #000000; font-weight: bold;">@</span>sim124 ~<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ <span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">uptime</span> 
<span style="color: #000000;">31351.83</span>  <span style="color: #000000;">31341.94</span>
<span style="color: #666666; font-style: italic;">#第一个数字代表已经运行的时间</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#可以用date命令来计算出系统的启动时间</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span>yangguang<span style="color: #000000; font-weight: bold;">@</span>sim124 ~<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ <span style="color: #c20cb9; font-weight: bold;">date</span> <span style="color: #660033;">-d</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$(awk -F. '{print $1}' /proc/uptime)</span> second ago&quot;</span> +<span style="color: #ff0000;">&quot;%Y-%m-%d %H:%M:%S&quot;</span>
&nbsp;
<span style="color: #000000;">2011</span>-03-<span style="color: #000000;">17</span> 00:<span style="color: #000000;">50</span>:<span style="color: #000000;">51</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#使用date命令计算系统的运行时间</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span>yangguang<span style="color: #000000; font-weight: bold;">@</span>sim124 ~<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ <span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">uptime</span><span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> -F. <span style="color: #ff0000;">'{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf(&quot;系统已运行：%d天%d时%d分%d秒\n&quot;,run_days,run_hour,run_minute,run_second)}'</span>
&nbsp;
系统已运行：<span style="color: #000000;">0</span>天<span style="color: #000000;">8</span>时<span style="color: #000000;">45</span>分<span style="color: #000000;">27</span>秒</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1232/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>字符串的哈希算法hnv的介绍和实现</title>
		<link>http://yaronspace.cn/blog/archives/1228</link>
		<comments>http://yaronspace.cn/blog/archives/1228#comments</comments>
		<pubDate>Wed, 16 Mar 2011 09:35:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[hnv]]></category>
		<category><![CDATA[sheepdog]]></category>
		<category><![CDATA[哈希算法]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1228</guid>
		<description><![CDATA[fnv全称&#8221;Fowler/Noll/Vo&#8221;，特点是快速而且冲突率比较低，在url hostname或者ip的哈希有广泛的应用， 详细信息请点击这里 下面是fnv在Sheepdog中用法的实现，将任意字符串转化为uint64_t C CODE /* * 64 bit FNV-1a non-zero initial basis */ #define FNV1A_64_INIT ((uint64_t) 0xcbf29ce484222325ULL) &#160; /* * 64 bit Fowler/Noll/Vo FNV-1a hash code */ static inline uint64_t fnv_64a_buf&#40;void *buf, size_t len, uint64_t hval&#41; &#123; unsigned char *bp = &#40;unsigned char *&#41; buf; unsigned char *be = bp + len; while]]></description>
			<content:encoded><![CDATA[<p>fnv全称&#8221;Fowler/Noll/Vo&#8221;，特点是快速而且冲突率比较低，在url hostname或者ip的哈希有广泛的应用，  详细信息请点击<a title="fnv" href="http://isthe.com/chongo/tech/comp/fnv/" target="_blank">这里</a></p>
<p>下面是fnv在Sheepdog中用法的实现，将任意字符串转化为uint64_t</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;">  <span style="color: #808080; font-style: italic;">/*
   * 64 bit FNV-1a non-zero initial basis
   */</span>
  <span style="color: #339933;">#define FNV1A_64_INIT ((uint64_t) 0xcbf29ce484222325ULL)</span>
&nbsp;
  <span style="color: #808080; font-style: italic;">/*
   * 64 bit Fowler/Noll/Vo FNV-1a hash code
   */</span>
 <span style="color: #993333;">static</span> <span style="color: #000000; font-weight: bold;">inline</span> uint64_t fnv_64a_buf<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>buf<span style="color: #339933;">,</span> size_t len<span style="color: #339933;">,</span> uint64_t hval<span style="color: #009900;">&#41;</span>
 <span style="color: #009900;">&#123;</span>
     <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>bp <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> buf<span style="color: #339933;">;</span>
     <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>be <span style="color: #339933;">=</span> bp <span style="color: #339933;">+</span> len<span style="color: #339933;">;</span>
     <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>bp <span style="color: #339933;">&lt;</span> be<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
         hval <span style="color: #339933;">^=</span> <span style="color: #009900;">&#40;</span>uint64_t<span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span>bp<span style="color: #339933;">++;</span>
         hval <span style="color: #339933;">+=</span> <span style="color: #009900;">&#40;</span>hval <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>hval <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>hval <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span>
             <span style="color: #009900;">&#40;</span>hval <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">7</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>hval <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>hval <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">40</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span>
     <span style="color: #b1b100;">return</span> hval<span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1228/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sheepdog源码分析之关键模块介绍(一)</title>
		<link>http://yaronspace.cn/blog/archives/1223</link>
		<comments>http://yaronspace.cn/blog/archives/1223#comments</comments>
		<pubDate>Tue, 15 Mar 2011 09:37:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[分布式数据存储]]></category>
		<category><![CDATA[虚拟化技术KVM]]></category>
		<category><![CDATA[kvm]]></category>
		<category><![CDATA[sheepdog]]></category>
		<category><![CDATA[分布式镜像存储]]></category>
		<category><![CDATA[工作线程]]></category>
		<category><![CDATA[源码分析]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1223</guid>
		<description><![CDATA[1)   Worker工作线程模块 该模块是作为sheepdog工作线程模块，存在多个工作线程，默认NR_WORKER_THREAD =64个工作线程；线程的入口函数为worker_routine，同时struct work_queue中pending_list是双向链表，worker_routine从该链表中读取任务，然后执行，接着将执行过的任务放到struct worker_info中finished_list双向链表，然后向main thread发送一个信号，接着调用bs_thread_request_done来执行finished_list中任务的done函数，该函数的作用是发送响应信息。涉及的文件主要是worker.c和Worker.h struct  work_queue { int wq_state;  // int nr_active;  //当前活跃的任务数目 struct list_head pending_list;//待执行的任务列表 struct list_head blocked_list; //没有用处了 }; struct  worker_info { struct list_head  worker_info_siblings;//链表的连接器，目前只有一个worker_info int nr_threads;  //线程个数 pthread_mutex_t  finished_lock; // struct list_head  finished_list; /* wokers sleep on this and signaled by tgtd */ pthread_cond_t pending_cond; /* locked by tgtd]]></description>
			<content:encoded><![CDATA[<h3>1)   Worker工作线程模块</h3>
<p>该模块是作为sheepdog工作线程模块，存在多个工作线程，默认NR_WORKER_THREAD =64个工作线程；线程的入口函数为worker_routine，同时struct work_queue中pending_list是双向链表，worker_routine从该链表中读取任务，然后执行，接着将执行过的任务放到struct worker_info中finished_list双向链表，然后向main thread发送一个信号，接着调用bs_thread_request_done来执行finished_list中任务的done函数，该函数的作用是发送响应信息。涉及的文件主要是worker.c和Worker.h<br />
<a href="http://www.yaronspace.cn/blog/wp-content/uploads/2011/03/worker.jpg"><img class="aligncenter size-medium wp-image-1224" title="worker" src="http://www.yaronspace.cn/blog/wp-content/uploads/2011/03/worker-300x173.jpg" alt="" width="300" height="173" /></a></p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="568" valign="top">struct  work_queue {</p>
<p>int   wq_state;  //</p>
<p>int   nr_active;  //当前活跃的任务数目</p>
<p>struct   list_head pending_list;//待执行的任务列表</p>
<p>struct   list_head blocked_list; //没有用处了</p>
<p>};</p>
<p>struct  worker_info {</p>
<p>struct   list_head  worker_info_siblings;//链表的连接器，目前只有一个worker_info</p>
<p>int   nr_threads;  //线程个数</p>
<p>pthread_mutex_t    finished_lock; //</p>
<p>struct   list_head  finished_list;</p>
<p>/*   wokers sleep on this and signaled by tgtd */</p>
<p>pthread_cond_t   pending_cond;</p>
<p>/*   locked by tgtd and workers */</p>
<p>pthread_mutex_t    pending_lock;</p>
<p>/*   protected by pending_lock */</p>
<p>struct   work_queue  q;</p>
<p>pthread_mutex_t    startup_lock;</p>
<p>pthread_t    worker_thread[0]; //工作线程的数据结构</p>
<p>};</td>
</tr>
<tr>
<td width="568" valign="top"></td>
</tr>
</tbody>
</table>
<p>这里需要特殊说明的是，有关任务Worker的属性WORK_SIMPLE和WORK_ORDERED，及有关block相关的函数，在0.2版本中应该是没有用处的，当时我也迷惑一阵。</p>
<p>Sheepdog存在三类的工作任务：</p>
<ul>
<li> Request: 所有来自客户端或者其他sheep的请求</li>
<li> Recovery_work: 数据恢复任务</li>
<li> Delete_work: 删除vdi的任务</li>
<li>Cpg_event_work: 该任务作为cpg有关集群管理的任务，例如节点加入和send_message消息发送等，sheep保证当前系统只运行一个cpg_event_work任务，从sys-&gt;cpg_event_siblings中是未执行的任务。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1223/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sheepdog源码分析之关键数据结构介绍</title>
		<link>http://yaronspace.cn/blog/archives/1219</link>
		<comments>http://yaronspace.cn/blog/archives/1219#comments</comments>
		<pubDate>Tue, 15 Mar 2011 09:29:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[分布式数据存储]]></category>
		<category><![CDATA[虚拟化技术KVM]]></category>
		<category><![CDATA[kvm]]></category>
		<category><![CDATA[sheepdog]]></category>
		<category><![CDATA[virtual block store]]></category>
		<category><![CDATA[分布式镜像存储]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1219</guid>
		<description><![CDATA[关键数据结构的说明 1. struct  sd_req { uint8_t   proto_ver; uint8_t   opcode; //操作类型 uint16_t   flags;// uint32_t   epoch; uint32_t  id; uint32_t  data_length; uint32_t   opcode_specific[8]; }; struct  sd_rsp { uint8_t              proto_ver; uint8_t              opcode; uint16_t       flags; uint32_t       epoch; uint32_t     id; uint32_t      data_length; uint32_t      result; uint32_t        opcode_specific[7]; }; 这两个数据结构应该是作为抽象类，可以看出sizeof(struct sd_req) == sizeof(struct sd_rsp)，这个是设计者故意为之，因为在发送请求和接收响应时，客户端是使用同一片内存区域； 2. struct  sd_obj_req { uint8_t     proto_ver;]]></description>
			<content:encoded><![CDATA[<h3><strong>关键数据结构的说明</strong></h3>
<p>1.<strong><br />
</strong></p>
<table style="height: 284px;" border="1" cellspacing="0" cellpadding="0" width="609">
<tbody>
<tr>
<td width="284" valign="top">struct  <strong>sd_req </strong>{</p>
<p>uint8_t   proto_ver;</p>
<p>uint8_t   opcode; //操作类型</p>
<p>uint16_t    flags;//</p>
<p>uint32_t    epoch;</p>
<p>uint32_t  id;</p>
<p>uint32_t  data_length;</p>
<p>uint32_t    opcode_specific[8];</p>
<p>};</td>
<td width="284" valign="top">struct  <strong>sd_rsp </strong>{</p>
<p>uint8_t              proto_ver;</p>
<p>uint8_t              opcode;</p>
<p>uint16_t       flags;</p>
<p>uint32_t       epoch;</p>
<p>uint32_t     id;</p>
<p>uint32_t      data_length;</p>
<p>uint32_t      result;</p>
<p>uint32_t        opcode_specific[7];</p>
<p>};</td>
</tr>
<tr>
<td colspan="2" width="568" valign="top">这两个数据结构应该是作为抽象类，可以看出<strong>sizeof(struct sd_req) ==   sizeof(struct sd_rsp)</strong>，这个是设计者故意为之，<strong>因为在发送请求和接收响应时，客户端是使用同一片内存区域；</strong></td>
</tr>
</tbody>
</table>
<p>2.</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="307" valign="top">struct  <strong>sd_obj_req</strong> {</p>
<p>uint8_t     proto_ver;</p>
<p>uint8_t     opcode;</p>
<p>uint16_t    flags;</p>
<p>uint32_t    epoch;</p>
<p>uint32_t        id;</p>
<p>uint32_t        data_length;</p>
<p>uint64_t        oid;//object id</p>
<p>uint64_t        cow_oid;</p>
<p>uint32_t        copies;//副本个数</p>
<p>uint32_t        tgt_epoch;</p>
<p>uint64_t        offset;</p>
<p>};</td>
<td width="263" valign="top">struct  <strong>sd_obj_rsp </strong>{</p>
<p>uint8_t     proto_ver;</p>
<p>uint8_t     opcode;</p>
<p>uint16_t    flags;</p>
<p>uint32_t    epoch;</p>
<p>uint32_t        id;</p>
<p>uint32_t        data_length;</p>
<p>uint32_t        result;</p>
<p>uint32_t        copies;</p>
<p>uint32_t        pad[6];</p>
<p>};</td>
</tr>
<tr>
<td colspan="2" width="570" valign="top">对object进行请求及响应，这里需要说明的一点：object在Sheepdog中作为数据存储单元，分为data_object   和vdi_object，分别存储数据和vdi的元数据，即后面提到的sheepdog_inode的内容，分片大小为4M。不知作者为何分这么小的分片？</td>
</tr>
</tbody>
</table>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 128px; width: 1px; height: 1px; overflow: hidden;">
<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> <w:UseFELayout /> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val=" " /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:普通表格; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} table.MsoTableGrid 	{mso-style-name:网格型; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-priority:59; 	mso-style-unhide:no; 	border:solid black 1.0pt; 	mso-border-themecolor:text1; 	mso-border-alt:solid black .5pt; 	mso-border-themecolor:text1; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-border-insideh:.5pt solid black; 	mso-border-insideh-themecolor:text1; 	mso-border-insidev:.5pt solid black; 	mso-border-insidev-themecolor:text1; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} --> <!--[endif]--></p>
<table class="MsoTableGrid" style="background: none repeat scroll 0% 0% #dbe5f1; border-collapse: collapse; border: medium none;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 213.05pt; border: 1pt solid black; padding: 0cm 5.4pt;" width="284" valign="top">
<p class="MsoNormal"><span lang="EN-US"> struct  <strong>sd_vdi_req</strong> {</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t proto_ver;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t opcode;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint16_t flags;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t epoch;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t id;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t data_length;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint64_t vdi_size; //vdi</span><span style="font-family: 宋体;">的大小</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t base_vdi_id;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t copies;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t snapid;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t pad[3];</span></p>
<p class="MsoNormal"><span lang="EN-US"> };</span></p>
</td>
<td style="width: 213.05pt; padding: 0cm 5.4pt;" width="284" valign="top">
<p class="MsoNormal"><span lang="EN-US"> struct  <strong>sd_vdi_rsp</strong> {</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t proto_ver;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t opcode;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint16_t flags;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t epoch;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t id;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t data_length;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t result;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t rsvd;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t vdi_id;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t pad[5];</span></p>
<p class="MsoNormal"><span lang="EN-US"> };</span></p>
</td>
</tr>
<tr>
<td style="width: 426.1pt; padding: 0cm 5.4pt;" colspan="2" width="568" valign="top">
<p class="MsoNormal"><span style="font-family: 宋体;">对</span><span lang="EN-US">vdi</span><span style="font-family: 宋体;">进行有关操作的请求和响应</span></p>
</td>
</tr>
</tbody>
</table>
</div>
<p><span id="more-1219"></span></p>
<p>3.</p>
<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> <w:UseFELayout /> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val=" " /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:普通表格; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} table.MsoTableGrid 	{mso-style-name:网格型; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-priority:59; 	mso-style-unhide:no; 	border:solid black 1.0pt; 	mso-border-themecolor:text1; 	mso-border-alt:solid black .5pt; 	mso-border-themecolor:text1; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-border-insideh:.5pt solid black; 	mso-border-insideh-themecolor:text1; 	mso-border-insidev:.5pt solid black; 	mso-border-insidev-themecolor:text1; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} --> <!--[endif]--></p>
<table class="MsoTableGrid" style="background: none repeat scroll 0% 0% #dbe5f1; border-collapse: collapse; border: medium none;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 213.05pt; border: 1pt solid black; padding: 0cm 5.4pt;" width="284" valign="top">
<p class="MsoNormal"><span lang="EN-US"> struct  <strong>sd_vdi_req</strong> {</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t     proto_ver;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t     opcode;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint16_t    flags;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t    epoch;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        id;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        data_length;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint64_t    vdi_size; //vdi</span><span style="font-family: 宋体;">的大小</span><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        base_vdi_id;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t    copies;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        snapid;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        pad[3];</span></p>
<p class="MsoNormal"><span lang="EN-US"> };</span></p>
</td>
<td style="width: 213.05pt; padding: 0cm 5.4pt; border: 1pt 1pt 1pt medium solid solid solid none black black black -moz-use-text-color;" width="284" valign="top">
<p class="MsoNormal"><span lang="EN-US"> struct  <strong>sd_vdi_rsp</strong> {</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t     proto_ver;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t     opcode;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint16_t    flags;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t    epoch;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        id;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        data_length;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        result;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        rsvd;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        vdi_id;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        pad[5];</span></p>
<p class="MsoNormal"><span lang="EN-US"> };</span></p>
</td>
</tr>
<tr>
<td style="width: 426.1pt; padding: 0cm 5.4pt; border: medium 1pt 1pt none solid solid -moz-use-text-color black black;" colspan="2" width="568" valign="top">
<p class="MsoNormal"><span style="font-family: 宋体;">对</span><span lang="EN-US">vdi</span><span style="font-family: 宋体;">进行有关操作的请求和响应</span></p>
</td>
</tr>
</tbody>
</table>
<p>4</p>
<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> <w:UseFELayout /> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val=" " /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:普通表格; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} table.MsoTableGrid 	{mso-style-name:网格型; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-priority:59; 	mso-style-unhide:no; 	border:solid black 1.0pt; 	mso-border-themecolor:text1; 	mso-border-alt:solid black .5pt; 	mso-border-themecolor:text1; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-border-insideh:.5pt solid black; 	mso-border-insideh-themecolor:text1; 	mso-border-insidev:.5pt solid black; 	mso-border-insidev-themecolor:text1; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} --> <!--[endif]--></p>
<table class="MsoTableGrid" style="background: none repeat scroll 0% 0% #d9d9d9; border-collapse: collapse; border: medium none;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 213.05pt; border: 1pt solid black; padding: 0cm 5.4pt;" width="284" valign="top">
<p class="MsoNormal"><span lang="EN-US">struct  <strong>sd_so_req</strong> {</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t              proto_ver;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t              opcode;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint16_t   flags;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t   epoch;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        id;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        data_length;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint64_t   oid;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint64_t   ctime;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t   copies;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t   tag;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t   opcode_specific[2];</span></p>
<p class="MsoNormal"><span lang="EN-US">};</span></p>
</td>
<td style="width: 213.05pt; padding: 0cm 5.4pt; border: 1pt 1pt 1pt medium solid solid solid none black black black -moz-use-text-color;" width="284" valign="top">
<p class="MsoNormal"><span lang="EN-US">struct  <strong>sd_so_rsp</strong> {</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t              proto_ver;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t              opcode;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint16_t   flags;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t   epoch;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        id;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        data_length;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        result;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t   copies;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint64_t   ctime;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint64_t   oid;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t   opcode_specific[2];</span></p>
<p class="MsoNormal"><span lang="EN-US">};</span></p>
</td>
</tr>
<tr>
<td style="width: 426.1pt; padding: 0cm 5.4pt; border: medium 1pt 1pt none solid solid -moz-use-text-color black black;" colspan="2" width="568" valign="top">
<p class="MsoNormal"><span style="font-family: 宋体;">这对请求和响应的数据结构，对应的</span><span lang="EN-US">opcode</span><span style="font-family: 宋体;">为</span><span lang="EN-US">SD_OP_MAKE_FS</span><span style="font-family: 宋体;">，对整个集群进行</span><span lang="EN-US">format</span><span style="font-family: 宋体;">，并提供</span><span lang="EN-US">copies</span><span style="font-family: 宋体;">参数，指定默认的副本的个数；</span></p>
</td>
</tr>
</tbody>
</table>
<p>5</p>
<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> <w:UseFELayout /> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val=" " /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:普通表格; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} table.MsoTableGrid 	{mso-style-name:网格型; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-priority:59; 	mso-style-unhide:no; 	border:solid black 1.0pt; 	mso-border-themecolor:text1; 	mso-border-alt:solid black .5pt; 	mso-border-themecolor:text1; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-border-insideh:.5pt solid black; 	mso-border-insideh-themecolor:text1; 	mso-border-insidev:.5pt solid black; 	mso-border-insidev-themecolor:text1; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} --> <!--[endif]--></p>
<table class="MsoTableGrid" style="background: none repeat scroll 0% 0% #dbe5f1; border-collapse: collapse; border: medium none;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 213.05pt; border: 1pt solid black; padding: 0cm 5.4pt;" width="284" valign="top">
<p class="MsoNormal"><span lang="EN-US">struct  <strong>sd_list_req</strong> {</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t              proto_ver;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t              opcode;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint16_t       flags;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t       epoch;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t     id;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t     data_length;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint64_t     start; //start_hval</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint64_t     end; //end_hval</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t     tgt_epoch;   //epoch</span><span style="font-family: 宋体;">参数</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t     pad[3];</span></p>
<p class="MsoNormal"><span lang="EN-US">};</span></p>
</td>
<td style="width: 213.05pt; padding: 0cm 5.4pt; border: 1pt 1pt 1pt medium solid solid solid none black black black -moz-use-text-color;" width="284" valign="top">
<p class="MsoNormal"><span lang="EN-US">struct  <strong>sd_list_rsp </strong>{</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t              proto_ver;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t              opcode;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint16_t   flags;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t   epoch;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        id;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        data_length;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        result;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        rsvd;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint64_t        next;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        pad[4];</span></p>
<p class="MsoNormal"><span lang="EN-US">};</span></p>
</td>
</tr>
<tr>
<td style="width: 426.1pt; padding: 0cm 5.4pt; border: medium 1pt 1pt none solid solid -moz-use-text-color black black;" colspan="2" width="568" valign="top">
<p class="MsoNormal"><span style="font-family: 宋体;">主要用于</span><span lang="EN-US">SD_OP_GET_OBJ_LIST</span><span style="font-family: 宋体;">操作，获得对应区间上</span><span lang="EN-US">node</span><span style="font-family: 宋体;">节点上的</span><span lang="EN-US">object list</span></p>
</td>
</tr>
</tbody>
</table>
<p>6</p>
<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> <w:UseFELayout /> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val=" " /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:普通表格; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} table.MsoTableGrid 	{mso-style-name:网格型; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-priority:59; 	mso-style-unhide:no; 	border:solid black 1.0pt; 	mso-border-themecolor:text1; 	mso-border-alt:solid black .5pt; 	mso-border-themecolor:text1; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-border-insideh:.5pt solid black; 	mso-border-insideh-themecolor:text1; 	mso-border-insidev:.5pt solid black; 	mso-border-insidev-themecolor:text1; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} --> <!--[endif]--></p>
<table class="MsoTableGrid" style="background: none repeat scroll 0% 0% #d9d9d9; border-collapse: collapse; border: medium none;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 213.05pt; border: 1pt solid black; padding: 0cm 5.4pt;" width="284" valign="top">
<p class="MsoNormal"><span lang="EN-US">struct  <strong>sd_node_req</strong> {</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t              proto_ver;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t              opcode;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint16_t       flags;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t       epoch;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t     id;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t     data_length;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t       request_ver;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t       pad[7];</span></p>
<p class="MsoNormal"><span lang="EN-US">};</span></p>
</td>
<td style="width: 213.05pt; padding: 0cm 5.4pt; border: 1pt 1pt 1pt medium solid solid solid none black black black -moz-use-text-color;" width="284" valign="top">
<p class="MsoNormal"><span lang="EN-US">struct  <strong>sd_node_rsp</strong> {</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t              proto_ver;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t              opcode;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint16_t       flags;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t       epoch;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        id;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        data_length;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        result;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        nr_nodes;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        local_idx;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t        master_idx;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint64_t        store_size;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint64_t        store_free;</span></p>
<p class="MsoNormal"><span lang="EN-US">};</span></p>
</td>
</tr>
<tr>
<td style="width: 426.1pt; padding: 0cm 5.4pt; border: medium 1pt 1pt none solid solid -moz-use-text-color black black;" colspan="2" width="568" valign="top">
<p class="MsoNormal"><span style="font-family: 宋体;">针对</span><span lang="EN-US">SD_OP_STAT_SHEEP</span><span style="font-family: 宋体;">和</span><span lang="EN-US">SD_OP_GET_NODE_LIST</span><span style="font-family: 宋体;">操作，获得</span><span lang="EN-US">node </span><span style="font-family: 宋体;">详细信息，包括</span><span lang="EN-US">store_size store_free</span><span style="font-family: 宋体;">等，或者是获得</span><span lang="EN-US">node list.</span></p>
</td>
</tr>
</tbody>
</table>
<p>7</p>
<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> <w:UseFELayout /> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val=" " /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:普通表格; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} table.MsoTableGrid 	{mso-style-name:网格型; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-priority:59; 	mso-style-unhide:no; 	border:solid black 1.0pt; 	mso-border-themecolor:text1; 	mso-border-alt:solid black .5pt; 	mso-border-themecolor:text1; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-border-insideh:.5pt solid black; 	mso-border-insideh-themecolor:text1; 	mso-border-insidev:.5pt solid black; 	mso-border-insidev-themecolor:text1; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} --> <!--[endif]--></p>
<table class="MsoTableGrid" style="background: none repeat scroll 0% 0% #a6a6a6; border-collapse: collapse; border: medium none;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 426.1pt; border: 1pt solid black; padding: 0cm 5.4pt;" width="568" valign="top">
<p class="MsoNormal"><span lang="EN-US">struct  <strong>sheepdog_inode</strong> {</span></p>
<p class="MsoNormal"><span lang="EN-US"> char   name[SD_MAX_VDI_LEN];  //vdi</span><span style="font-family: 宋体;">的名字</span></p>
<p class="MsoNormal"><span lang="EN-US"> char   tag[SD_MAX_VDI_TAG_LEN]; //tag</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint64_t   ctime; // create time</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint64_t   snap_ctime; //snapshot time</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint64_t   vm_clock_nsec;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint64_t   vdi_size; //vdi size</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint64_t   vm_state_size;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint16_t   copy_policy;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t  nr_copies; //</span><span style="font-family: 宋体;">副本的个数</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint8_t  block_size_shift; //data object size</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t   snap_id; //snapshot of this vdi </span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t   vdi_id; //vdi id</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t   parent_vdi_id;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t   child_vdi_id[MAX_CHILDREN];</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t   data_vdi_id[MAX_DATA_OBJS]; //data object id array</span></p>
<p class="MsoNormal"><span lang="EN-US">};</span></p>
</td>
</tr>
<tr>
<td style="width: 426.1pt; padding: 0cm 5.4pt; border: medium 1pt 1pt none solid solid -moz-use-text-color black black;" width="568" valign="top">
<p class="MsoNormal"><span lang="EN-US">sheepdog_inode</span><span style="font-family: 宋体;">相当于</span><span lang="EN-US">sheep</span><span style="font-family: 宋体;">中存储一个镜像文件，都会存在这个结构与之对应，该结构中保存了数据</span><span lang="EN-US">object</span><span style="font-family: 宋体;">的</span><span lang="EN-US">id</span><span style="font-family: 宋体;">数组，相当与镜像文件的元数据，同时该结构会持久化保存到</span><span lang="EN-US">vid object</span><span style="font-family: 宋体;">中；</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
</td>
</tr>
</tbody>
</table>
<p>8</p>
<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> <w:UseFELayout /> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val=" " /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:普通表格; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} table.MsoTableGrid 	{mso-style-name:网格型; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-priority:59; 	mso-style-unhide:no; 	border:solid black 1.0pt; 	mso-border-themecolor:text1; 	mso-border-alt:solid black .5pt; 	mso-border-themecolor:text1; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-border-insideh:.5pt solid black; 	mso-border-insideh-themecolor:text1; 	mso-border-insidev:.5pt solid black; 	mso-border-insidev-themecolor:text1; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} --> <!--[endif]--></p>
<table class="MsoTableGrid" style="background: none repeat scroll 0% 0% #dbe5f1; border-collapse: collapse; border: medium none;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 426.1pt; border: 1pt solid black; padding: 0cm 5.4pt;" width="568" valign="top">
<p class="MsoNormal"><span lang="EN-US">enum  <strong>conn_state</strong> {</span></p>
<p class="MsoNormal"><span lang="EN-US"> C_IO_HEADER   = 0,</span></p>
<p class="MsoNormal"><span lang="EN-US"> C_IO_DATA_INIT,</span></p>
<p class="MsoNormal"><span lang="EN-US"> C_IO_DATA,</span></p>
<p class="MsoNormal"><span lang="EN-US"> C_IO_END,</span></p>
<p class="MsoNormal"><span lang="EN-US"> C_IO_CLOSED,</span></p>
<p class="MsoNormal"><span lang="EN-US">};</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">struct  <strong>connection</strong> {</span></p>
<p class="MsoNormal"><span lang="EN-US"> int   fd;   //sockfd</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US"> enum   conn_state  c_rx_state; //</span><span style="font-family: 宋体;">当前</span><span lang="EN-US">receive</span><span style="font-family: 宋体;">状态</span></p>
<p class="MsoNormal"><span lang="EN-US"> int   rx_length;</span></p>
<p class="MsoNormal"><span lang="EN-US"> void   *rx_buf;</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   sd_req  rx_hdr;</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US"> enum   conn_state  c_tx_state; //</span><span style="font-family: 宋体;">当前</span><span lang="EN-US">transfer</span><span style="font-family: 宋体;">状态</span></p>
<p class="MsoNormal"><span lang="EN-US"> int   tx_length;</span></p>
<p class="MsoNormal"><span lang="EN-US"> void   *tx_buf;</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   sd_rsp  tx_hdr;</span></p>
<p class="MsoNormal"><span lang="EN-US">};</span></p>
</td>
</tr>
<tr>
<td style="width: 426.1pt; padding: 0cm 5.4pt; border: medium 1pt 1pt none solid solid -moz-use-text-color black black;" width="568" valign="top">
<p class="MsoNormal"><span lang="EN-US">struct connection</span><span style="font-family: 宋体;">结构存储</span><span lang="EN-US">socket</span><span style="font-family: 宋体;">连接的状态信息</span></p>
</td>
</tr>
</tbody>
</table>
<p>9</p>
<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> <w:UseFELayout /> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val=" " /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:普通表格; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} table.MsoTableGrid 	{mso-style-name:网格型; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-priority:59; 	mso-style-unhide:no; 	border:solid black 1.0pt; 	mso-border-themecolor:text1; 	mso-border-alt:solid black .5pt; 	mso-border-themecolor:text1; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-border-insideh:.5pt solid black; 	mso-border-insideh-themecolor:text1; 	mso-border-insidev:.5pt solid black; 	mso-border-insidev-themecolor:text1; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} --> <!--[endif]--></p>
<table class="MsoTableGrid" style="background: none repeat scroll 0% 0% #d9d9d9; border-collapse: collapse; border: medium none;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 426.1pt; border: 1pt solid black; padding: 0cm 5.4pt;" width="568" valign="top">
<p class="MsoNormal"><span lang="EN-US">struct  <strong>client_info </strong>{</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   connection conn;  //conn state</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   request *rx_req;  //current rx_req</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   request *tx_req;  //current tx_req</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   list_head  reqs;  //client </span><span style="font-family: 宋体;">已经收到的</span><span lang="EN-US">request</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   list_head done_reqs; //</span><span style="font-family: 宋体;">已经处理完的</span><span lang="EN-US">request</span><span style="font-family: 宋体;">，待发送</span><span lang="EN-US">response</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US"> int    refcnt;  //</span><span style="font-family: 宋体;">引用计数，</span><span lang="EN-US">request </span><span style="font-family: 宋体;">的个数</span></p>
<p class="MsoNormal"><span lang="EN-US">};</span></p>
</td>
</tr>
<tr>
<td style="width: 426.1pt; padding: 0cm 5.4pt; border: medium 1pt 1pt none solid solid -moz-use-text-color black black;" width="568" valign="top">
<p class="MsoNormal"><span style="font-family: 宋体;">作为</span><span lang="EN-US">client</span><span style="font-family: 宋体;">保存信息，其中</span><span lang="EN-US">conn</span><span style="font-family: 宋体;">保存连接状态，</span><span lang="EN-US">reqs</span><span style="font-family: 宋体;">代表已经收到的</span><span lang="EN-US">request</span><span style="font-family: 宋体;">，</span><span lang="EN-US">done_reqs</span><span style="font-family: 宋体;">代表待发送响应的</span><span lang="EN-US">request.</span></p>
</td>
</tr>
</tbody>
</table>
<p>10</p>
<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> <w:UseFELayout /> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val=" " /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:普通表格; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} table.MsoTableGrid 	{mso-style-name:网格型; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-priority:59; 	mso-style-unhide:no; 	border:solid black 1.0pt; 	mso-border-themecolor:text1; 	mso-border-alt:solid black .5pt; 	mso-border-themecolor:text1; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-border-insideh:.5pt solid black; 	mso-border-insideh-themecolor:text1; 	mso-border-insidev:.5pt solid black; 	mso-border-insidev-themecolor:text1; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} --> <!--[endif]--></p>
<table class="MsoTableGrid" style="background: none repeat scroll 0% 0% #dbe5f1; border-collapse: collapse; border: medium none;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 426.1pt; border: 1pt solid black; padding: 0cm 5.4pt;" width="568" valign="top">
<p class="MsoNormal"><span lang="EN-US">enum cpg_event_type {</span></p>
<p class="MsoNormal"><span lang="EN-US"> CPG_EVENT_CONCHG,</span></p>
<p class="MsoNormal"><span lang="EN-US"> CPG_EVENT_DELIVER,</span></p>
<p class="MsoNormal"><span lang="EN-US"> CPG_EVENT_REQUEST,</span></p>
<p class="MsoNormal"><span lang="EN-US">};</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">struct cpg_event {</span></p>
<p class="MsoNormal"><span lang="EN-US"> enum   cpg_event_type ctype;</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   list_head cpg_event_list;</span></p>
<p class="MsoNormal"><span lang="EN-US"> unsigned   int skip;</span></p>
<p class="MsoNormal"><span lang="EN-US">};</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">typedef void (*req_end_t) (struct request   *);</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">struct  <strong>request</strong> {</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   cpg_event cev;</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   sd_req rq;</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   sd_rsp rp;</span></p>
<p class="MsoNormal"><span lang="EN-US"> void   *data;</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   client_info *ci;</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   list_head  r_siblings;  //client_info-&gt;reqs</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   list_head  r_wlist;    //client_info-&gt;done_reqs</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   list_head  pending_list;   //sys-&gt;pending_list</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint64_t   local_oid[2];</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   sheepdog_node_list_entry  entry[SD_MAX_NODES];</span></p>
<p class="MsoNormal"><span lang="EN-US"> int    nr_nodes;</span></p>
<p class="MsoNormal"><span lang="EN-US"> int    check_consistency;</span></p>
<p class="MsoNormal"><span lang="EN-US"> req_end_t    done;</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   work  work;</span></p>
<p class="MsoNormal"><span lang="EN-US">};</span></p>
</td>
</tr>
<tr>
<td style="width: 426.1pt; padding: 0cm 5.4pt; border: medium 1pt 1pt none solid solid -moz-use-text-color black black;" width="568" valign="top">
<p class="MsoNormal"><span lang="EN-US"> </span><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> <w:UseFELayout /> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val=" " /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:普通表格; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} --> <!--[endif]--><span style="font-size: 10.5pt; font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;" lang="EN-US">Server</span><span style="font-size: 10.5pt; font-family: 宋体;">端</span><span style="font-size: 10.5pt; font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;"> </span><span style="font-size: 10.5pt; font-family: 宋体;">请求的详细信息</span></p>
</td>
</tr>
</tbody>
</table>
<p>11</p>
<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL /> <w:BalanceSingleByteDoubleByteWidth /> <w:DoNotLeaveBackslashAlone /> <w:ULTrailSpace /> <w:DoNotExpandShiftReturn /> <w:AdjustLineHeightInTable /> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> <w:UseFELayout /> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val=" " /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:普通表格; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} table.MsoTableGrid 	{mso-style-name:网格型; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-priority:59; 	mso-style-unhide:no; 	border:solid black 1.0pt; 	mso-border-themecolor:text1; 	mso-border-alt:solid black .5pt; 	mso-border-themecolor:text1; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-border-insideh:.5pt solid black; 	mso-border-insideh-themecolor:text1; 	mso-border-insidev:.5pt solid black; 	mso-border-insidev-themecolor:text1; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} --> <!--[endif]--></p>
<table class="MsoTableGrid" style="background: none repeat scroll 0% 0% #d9d9d9; border-collapse: collapse; border: medium none;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 426.1pt; border: 1pt solid black; padding: 0cm 5.4pt;" width="568" valign="top">
<p class="MsoNormal"><span lang="EN-US">struct cluster_info {</span></p>
<p class="MsoNormal"><span lang="EN-US"> cpg_handle_t   handle;</span></p>
<p class="MsoNormal"><span lang="EN-US"> /*   set after finishing the JOIN procedure */</span></p>
<p class="MsoNormal"><span lang="EN-US"> int   join_finished;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t   this_nodeid;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t   this_pid;</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   sheepdog_node_list_entry  <strong>this_node</strong>;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t   epoch;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t   status;</span></p>
<p class="MsoNormal"><span lang="EN-US"> /*</span></p>
<p class="MsoNormal"><span lang="EN-US"> * we add a node to cpg_node_list in confchg   then move it to</span></p>
<p class="MsoNormal"><span lang="EN-US"> * sd_node_list when the node joins sheepdog.</span></p>
<p class="MsoNormal"><span lang="EN-US"> */</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   list_head  cpg_node_list;</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   list_head  sd_node_list;</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   list_head  pending_list;   //</span><span style="font-family: 宋体;">未收到响应的</span><span lang="EN-US">request</span></p>
<p class="MsoNormal"><span lang="EN-US"> DECLARE_BITMAP(vdi_inuse,   SD_NR_VDIS);</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   list_head  outstanding_req_list;</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   list_head  req_wait_for_obj_list;</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   list_head  consistent_obj_list;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t    nr_sobjs;  //</span><span style="font-family: 宋体;">副本个数</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   list_head  cpg_event_siblings;</span></p>
<p class="MsoNormal"><span lang="EN-US"> struct   cpg_event  *cur_cevent;</span></p>
<p class="MsoNormal"><span lang="EN-US"> unsigned   long  cpg_event_work_flags;</span></p>
<p class="MsoNormal"><span lang="EN-US"> int    nr_outstanding_io;</span></p>
<p class="MsoNormal"><span lang="EN-US"> int    nr_outstanding_reqs;</span></p>
<p class="MsoNormal"><span lang="EN-US"> uint32_t    recovered_epoch;</span></p>
<p class="MsoNormal"><span lang="EN-US">};</span></p>
<p class="MsoNormal"><span lang="EN-US">extern struct cluster_info *sys;</span></p>
</td>
</tr>
<tr>
<td style="width: 426.1pt; padding: 0cm 5.4pt; border: medium 1pt 1pt none solid solid -moz-use-text-color black black;" width="568" valign="top">
<p class="MsoNormal"><span style="font-family: 宋体;">整个集群的信息</span></p>
</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1219/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C语言中宏定义的##连接符和#转换符的用法介绍</title>
		<link>http://yaronspace.cn/blog/archives/1216</link>
		<comments>http://yaronspace.cn/blog/archives/1216#comments</comments>
		<pubDate>Fri, 11 Mar 2011 03:41:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[可变参数]]></category>
		<category><![CDATA[宏定义]]></category>
		<category><![CDATA[连接符]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1216</guid>
		<description><![CDATA[1. ##连接符的用法 在C语言中，## 连接符号由两个井号组成，其功能是在带参数的宏定义中将两个子串(token)联接起来，从而形成一个新的子串，一般跟在宏定义参数的前面。 2.#转换符的用法 #转化符是将传递的参数作为字符串来进行处理。 例如定义如下宏: C CODE#define pasrse( i ) printf( &#34;token&#34; #i &#34; = %d&#34;, token##i ) //同时定义如下的变量 int token1 = 1; 则调用parse(1)的打印结果为： #宏展开: printf("token" "1" "= %d", token1); token1=1 3.宏定义的可变参数 在宏定义中使用可变参数，只需在参数后面加入&#8221;&#8230;&#8221;，然后使用##连接即可 例如下面的例子： C CODE #define LOG_INFO(fmt, args...) \ do { \ log_write(&#34;LOG_INFO&#34;, __func__, __FILE__, __LINE__, fmt, ##args); \ }while(0) //其中log_write的原型为： void]]></description>
			<content:encoded><![CDATA[<p><strong>1. ##连接符的用法</strong></p>
<p>在C语言中，## 连接符号由两个井号组成，其功能是在带参数的宏定义中将两个子串(token)联接起来，从而形成一个新的子串，一般跟在宏定义参数的前面。</p>
<p><strong>2.#转换符的用法</strong><br />
   #转化符是将传递的参数作为字符串来进行处理。<br />
例如定义如下宏:</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define pasrse( i ) printf( &quot;token&quot; #i &quot; = %d&quot;, token##i ) </span>
<span style="color: #666666; font-style: italic;">//同时定义如下的变量</span>
<span style="color: #993333;">int</span> token1 <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span></pre></div></div>

<p>则调用parse(1)的打印结果为：</p>
<pre>
#宏展开: printf("token" "1" "= %d", token1);
token1=1
</pre>
<p><strong>3.宏定义的可变参数</strong><br />
   在宏定义中使用可变参数，只需在参数后面加入&#8221;&#8230;&#8221;，然后使用##连接即可<br />
例如下面的例子：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;">  <span style="color: #339933;">#define LOG_INFO(fmt, args...) \
      do {                       \
          log_write(&quot;LOG_INFO&quot;, __func__, __FILE__, __LINE__, fmt, ##args); \
      }while(0)</span>
<span style="color: #666666; font-style: italic;">//其中log_write的原型为：</span>
  <span style="color: #993333;">void</span> log_write<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>level<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>func<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>file<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> line<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>fmt<span style="color: #339933;">,</span>
          ...<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1216/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sheepdog源码学习二之代码目录结构介绍</title>
		<link>http://yaronspace.cn/blog/archives/1209</link>
		<comments>http://yaronspace.cn/blog/archives/1209#comments</comments>
		<pubDate>Wed, 09 Mar 2011 09:19:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[分布式数据存储]]></category>
		<category><![CDATA[虚拟化技术KVM]]></category>
		<category><![CDATA[sheepdog]]></category>
		<category><![CDATA[源码分析]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1209</guid>
		<description><![CDATA[目录结构 include/ config.h: 定义公共的宏 bitops.h: 有关的位操作，主要是针对oid的使用情况 util.h: 公用操作的实现 list.h: 双向链表的实现，主要是参考linux内核代码的实现 event.h: epoll异步事件模型 logger.h: 日志操作 net.h: socket网络IO sheepdog_proto.h: sheepdog中用到的操作类型及数据结构的定义： sheep.h: Sheep本身需要的数据结构和操作类型，与sheedog_proto.h为何分开定义暂不清楚 lib/ logger.c: 有关日志文件的操作的实现 net.c: 有关socket网络IO的实现 event.c: 事件模型的有关实现 sheep/ sheep_priv.h: 定义相关数据结构和声明相关函数 work.h: 定义工作队列对外提供的数据结构和API work.c: 实现工作线程 sdnet.c: 对网络IO的进一步封装，包括回调函数的定义 group.c: 利用corosync对组进行管理 store.c:  sheepdog有关数据存储、epoch和日志的操作 vdi.c:    sheepdog中vdi的相关操作 sheep.c:  sheep的main函数入口 collie/ treeview.h: vdi tree的有关操作 treeview.c: vdi tree的实现 collie.c: 对sheep进行管理实现]]></description>
			<content:encoded><![CDATA[<h2>目录结构</h2>
<p><strong>include/</strong></p>
<ul>
<li>config.h: 定义公共的宏</li>
<li>bitops.h: 有关的位操作，主要是针对oid的使用情况</li>
<li>util.h: 公用操作的实现</li>
<li>list.h: 双向链表的实现，主要是参考linux内核代码的实现</li>
<li>event.h: epoll异步事件模型</li>
<li>logger.h: 日志操作</li>
<li>net.h: socket网络IO</li>
<li>sheepdog_proto.h: sheepdog中用到的操作类型及数据结构的定义：</li>
<li>sheep.h: Sheep本身需要的数据结构和操作类型，与sheedog_proto.h为何分开定义暂不清楚</li>
</ul>
<p><strong>lib/</strong></p>
<ul>
<li>logger.c: 有关日志文件的操作的实现</li>
<li>net.c: 有关socket网络IO的实现</li>
<li>event.c: 事件模型的有关实现</li>
</ul>
<p><strong>sheep/</strong></p>
<ul>
<li>sheep_priv.h: 定义相关数据结构和声明相关函数</li>
<li>work.h: 定义工作队列对外提供的数据结构和API</li>
<li>work.c: 实现工作线程</li>
<li>sdnet.c: 对网络IO的进一步封装，包括回调函数的定义</li>
<li>group.c: 利用corosync对组进行管理</li>
<li>store.c:  sheepdog有关数据存储、epoch和日志的操作</li>
<li>vdi.c:    sheepdog中vdi的相关操作</li>
<li>sheep.c:  sheep的main函数入口</li>
</ul>
<p><strong>collie/</strong></p>
<ul>
<li>treeview.h: vdi tree的有关操作</li>
<li>treeview.c: vdi tree的实现</li>
<li>collie.c: 对sheep进行管理实现</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1209/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vim纵向编辑模式的用法</title>
		<link>http://yaronspace.cn/blog/archives/1205</link>
		<comments>http://yaronspace.cn/blog/archives/1205#comments</comments>
		<pubDate>Mon, 07 Mar 2011 01:58:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[visual block]]></category>
		<category><![CDATA[块编辑模式]]></category>
		<category><![CDATA[纵向编辑模式]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1205</guid>
		<description><![CDATA[启动方法 在 Vim 命令模式下，移动游标定位于某一个位置，键入 ctrl-v后状态栏上出现 VISUAL BLOCK 字样，即进入纵向编辑模式。移动游标以按需选择待编辑的区域 我们将下面的例子来说明三种用法，序列 10.60.1.191 10.60.1.192 10.60.1.193 修改为序列： ping -c 4 10.60.5.191 &#62;&#62; resultso ping -c 4 10.60.5.192 &#62;&#62; resultso ping -c 4 10.60.5.193 &#62;&#62; resultso 用法 1. 修改选中的列:将ip字段中的1修改为5 1&#62;crtl &#8211; v 进入列编辑模式 2&#62; G  移动光标至最后一行，选中所要编辑的列 3&#62; r  进入修改模式 4&#62; 输入数字5，并按esc退出输入模式 结果如下： 10.60.5.191 10.60.5.192 10.60.5.193 2. 前向添加： 添加字符串ping -c 4]]></description>
			<content:encoded><![CDATA[<h3><strong>启动方法</strong></h3>
<p>在 Vim 命令模式下，移动游标定位于某一个位置，键入<strong> <code>ctrl-v</code></strong>后状态栏上出现 VISUAL BLOCK 字样，即进入纵向编辑模式。移动游标以按需选择待编辑的区域</p>
<p>我们将下面的例子来说明三种用法，序列</p>
<pre>10.60.1.191
10.60.1.192
10.60.1.193
</pre>
<p>修改为序列：</p>
<pre><strong>ping -c 4</strong> 10.60.<strong>5</strong>.191 <strong>&gt;&gt; resultso</strong>
<strong>ping -c 4</strong> 10.60.<strong>5</strong>.192 <strong>&gt;&gt; resultso</strong>
<strong>ping -c 4</strong> 10.60.<strong>5</strong>.193 <strong>&gt;&gt; resultso</strong>
</pre>
<h3><strong>用法</strong></h3>
<h4>1. 修改选中的列:将ip字段中的1修改为5</h4>
<p>1&gt;crtl &#8211; v 进入列编辑模式</p>
<p>2&gt; G  移动光标至最后一行，选中所要编辑的列</p>
<p><strong> 3&gt; r  进入修改模式</strong></p>
<p>4&gt; 输入数字5，并按esc退出输入模式</p>
<p>结果如下：</p>
<pre>10.60.<strong>5</strong>.191
10.60.<strong>5</strong>.192
10.60.<strong>5</strong>.193</pre>
<h4>2. 前向添加： 添加字符串ping -c 4</h4>
<p>1&gt;crtl &#8211; v 进入列编辑模式</p>
<p>2&gt; G 移动光标至最后一行，可视块覆盖了第一列</p>
<p><strong> 3&gt; I  进入行首插入模式</strong></p>
<p>4&gt; ping -c 4，并按esc退出输入模式</p>
<p>结果如下：</p>
<pre><strong>ping -c 4</strong> 10.60.<strong>5</strong>.191
<strong>ping -c 4</strong> 10.60.<strong>5</strong>.192
<strong>ping -c 4</strong> 10.60.<strong>5</strong>.193<strong></strong></pre>
<h4>3. 后添加模式：尾部追加 &gt;&gt; result</h4>
<p>1&gt;crtl &#8211; v 进入列编辑模式</p>
<p>2&gt;G  移动光标至最后一行，可视块覆盖了最后一列</p>
<p><strong>3&gt; A  进入行尾插入模式</strong></p>
<p>4&gt; &lt;&lt;result，并按esc退出输入模式</p>
<p>搞定&#8230;.</p>
<p>参考资料：<a href="http://www.ibm.com/developerworks/cn/linux/l-cn-vimcolumn/index.html?ca=drs-" target="_blank">http://www.ibm.com/developerworks/cn/linux/l-cn-vimcolumn/index.html?ca=drs-</a></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1205/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sheepdog源码学习笔记一</title>
		<link>http://yaronspace.cn/blog/archives/1194</link>
		<comments>http://yaronspace.cn/blog/archives/1194#comments</comments>
		<pubDate>Fri, 04 Mar 2011 14:05:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[分布式数据存储]]></category>
		<category><![CDATA[虚拟化技术KVM]]></category>
		<category><![CDATA[corosync]]></category>
		<category><![CDATA[kvm]]></category>
		<category><![CDATA[sheepdog]]></category>
		<category><![CDATA[源码分析]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1194</guid>
		<description><![CDATA[最近这两天一直在看sheepdog的源码，有关sheepdog的用法，请参考我的另一篇博客：KVM分布式共享存储解决方案-sheepdog 总的来说,sheepdog的代码量不是很大，在一万行左右，比起其他的分布式文件系统如kfs,ceph等还是比较轻量级的，而且定位也是针对qemu/kvm等volume的解决方案. sheepdog原理介绍 1. sheepdog是作为虚拟机kvm的volume使用的，是非普通的文件系统，这点和Amazon的EBS(Elastic Block Store)比较类似 2. sheepdog是一种对称(symmetric)的结构，各个节点的地位相同，没有中心节点，没有meta-server，使用Corosync 对物理节点进行管理 3. sheepdog中的对象存储分为两类，其一是One reader One Writer 其二是No writer multiple reader 而且对象是4M大小分片的，使用“一致性哈希”算法来确定对象存储位置，多副本存储 sheepdog的代码结构 ./collie/treeview.c ./collie/collie.c ./sheep/vdi.c ./sheep/store.c ./sheep/sdnet.c ./sheep/work.c ./sheep/sheep.c ./sheep/group.c ./lib/logger.c ./lib/event.c ./lib/net.c sheep目录下是有关sheepdog的大部分逻辑的处理，部署在各个节点上 collie目录是作为管理管理sheep的代码 lib目录下是关于网络、日志和事件等处理模型 &#8230;.. 今天暂时写到这里&#8230;&#8230;待续]]></description>
			<content:encoded><![CDATA[<p>最近这两天一直在看sheepdog的源码，有关sheepdog的用法，请参考我的另一篇博客：<a href="http://www.yaronspace.cn/blog/index.php/archives/1065" target="_blank">KVM分布式共享存储解决方案-sheepdog</a> 总的来说,sheepdog的代码量不是很大，在一万行左右，比起其他的分布式文件系统如kfs,ceph等还是比较轻量级的，而且定位也是针对qemu/kvm等volume的解决方案.</p>
<h2><strong>sheepdog原理介绍</strong></h2>
<p>1. sheepdog是作为虚拟机kvm的volume使用的，是非普通的文件系统，这点和Amazon的EBS(Elastic Block Store)比较类似</p>
<p>2. sheepdog是一种对称(symmetric)的结构，各个节点的地位相同，没有中心节点，没有meta-server，使用<a href="http://www.corosync.org">Corosync</a> 对物理节点进行管理</p>
<p>3. sheepdog中的对象存储分为两类，其一是One reader One Writer 其二是No writer multiple reader 而且对象是4M大小分片的，使用“一致性哈希”算法来确定对象存储位置，多副本存储</p>
<p><a href="http://www.yaronspace.cn/blog/wp-content/uploads/2011/03/sheepdog1.png"><img src="http://www.yaronspace.cn/blog/wp-content/uploads/2011/03/sheepdog1-300x203.png" alt="" title="sheepdog1" width="300" height="203" class="aligncenter size-medium wp-image-1196" /></a></p>
<h2><strong>sheepdog的代码结构</strong></h2>
<pre>
./collie/treeview.c
./collie/collie.c
./sheep/vdi.c
./sheep/store.c
./sheep/sdnet.c
./sheep/work.c
./sheep/sheep.c
./sheep/group.c
./lib/logger.c
./lib/event.c
./lib/net.c
</pre>
<p>sheep目录下是有关sheepdog的大部分逻辑的处理，部署在各个节点上<br />
collie目录是作为管理管理sheep的代码<br />
lib目录下是关于网络、日志和事件等处理模型<br />
&#8230;..<br />
今天暂时写到这里&#8230;&#8230;待续</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1194/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>编程之美的wiki页面链接</title>
		<link>http://yaronspace.cn/blog/archives/1192</link>
		<comments>http://yaronspace.cn/blog/archives/1192#comments</comments>
		<pubDate>Thu, 03 Mar 2011 14:00:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[编程语言与算法设计]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1192</guid>
		<description><![CDATA[下半年就找工作了，先把这个收藏了，抽时间好好研读下~ http://bop1.wikispaces.com/]]></description>
			<content:encoded><![CDATA[<p>下半年就找工作了，先把这个收藏了，抽时间好好研读下~</p>
<p><a href="http://bop1.wikispaces.com/">http://bop1.wikispaces.com/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1192/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux中读写锁的rwlock介绍</title>
		<link>http://yaronspace.cn/blog/archives/1135</link>
		<comments>http://yaronspace.cn/blog/archives/1135#comments</comments>
		<pubDate>Mon, 28 Feb 2011 11:38:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[用法介绍]]></category>
		<category><![CDATA[读写锁]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1135</guid>
		<description><![CDATA[读写锁比mutex有更高的适用性，可以多个线程同时占用读模式的读写锁，但是只能一个线程占用写模式的读写锁； 1，当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞. 2，当读写锁在读加锁状态时, 所有试图以读模式对它进行加锁的线程都可以得到访问权，但是以写模式对它进行枷锁的线程将阻塞； 3，当读写锁在读模式锁状态时, 如果有另外线程试图以写模式加锁, 读写锁通常会阻塞随后的读模式锁请求, 这样可以避免读模式锁长期占用, 而等待的写模式锁请求长期阻塞; 这种锁适用对数据结构进行读的次数比写的次数多的情况下，因为可以进行读锁共享。 API接口说明： 1)初始化和销毁 C CODE#include &#60;pthread.h&#62; &#160; int pthread_rwlock_init&#40;pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr&#41;; int pthread_rwlock_destroy&#40;pthread_rwlock_t *rwlock&#41;; &#160; 成功则返回0, 出错则返回错误编号. 2)读加锁和写加锁 获取锁的两个函数是阻塞操作 C CODE#include &#60;pthread.h&#62; &#160; int pthread_rwlock_rdlock&#40;pthread_rwlock_t *rwlock&#41;; int pthread_rwlock_wrlock&#40;pthread_rwlock_t *rwlock&#41;; int pthread_rwlock_unlock&#40;pthread_rwlock_t *rwlock&#41;; &#160; 成功则返回0, 出错则返回错误编号. 3)非阻塞获得读锁和写锁 非阻塞的获取锁操作, 如果可以获取则返回0, 否则返回错误的EBUSY. C]]></description>
			<content:encoded><![CDATA[<p>读写锁比mutex有更高的适用性，可以多个线程同时占用读模式的读写锁，但是只能一个线程占用写模式的读写锁；</p>
<p>1，当读写锁是<strong>写加锁状态</strong>时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞.</p>
<p>2，当读写锁在<strong>读加锁状态</strong>时, 所有试图以读模式对它进行加锁的线程都可以得到访问权，但是以写模式对它进行枷锁的线程将阻塞；</p>
<p>3，当读写锁在<strong>读模式锁状态</strong>时, 如果有另外线程试图以<strong>写模式加锁</strong>, <strong>读写锁通常会阻塞随后的读模式锁请求</strong>, 这样可以避免读模式锁长期占用, 而等待的写模式锁请求长期阻塞;</p>
<p>这种锁适用对数据结构进行读的次数比写的次数多的情况下，因为可以进行读锁共享。</p>
<p><strong>API接口说明：</strong><br />
1)初始化和销毁</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;pthread.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> pthread_rwlock_init<span style="color: #009900;">&#40;</span>pthread_rwlock_t <span style="color: #339933;">*</span>restrict rwlock<span style="color: #339933;">,</span> <span style="color: #993333;">const</span> pthread_rwlockattr_t <span style="color: #339933;">*</span>restrict attr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> pthread_rwlock_destroy<span style="color: #009900;">&#40;</span>pthread_rwlock_t <span style="color: #339933;">*</span>rwlock<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
成功则返回<span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> 出错则返回错误编号.</pre></div></div>

<p>2)读加锁和写加锁<br />
获取锁的两个函数是阻塞操作</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;pthread.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> pthread_rwlock_rdlock<span style="color: #009900;">&#40;</span>pthread_rwlock_t <span style="color: #339933;">*</span>rwlock<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> pthread_rwlock_wrlock<span style="color: #009900;">&#40;</span>pthread_rwlock_t <span style="color: #339933;">*</span>rwlock<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> pthread_rwlock_unlock<span style="color: #009900;">&#40;</span>pthread_rwlock_t <span style="color: #339933;">*</span>rwlock<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
成功则返回<span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> 出错则返回错误编号.</pre></div></div>

<p>3)非阻塞获得读锁和写锁<br />
非阻塞的获取锁操作, 如果可以获取则返回0, 否则返回错误的EBUSY.</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;pthread.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> pthread_rwlock_tryrdlock<span style="color: #009900;">&#40;</span>pthread_rwlock_t <span style="color: #339933;">*</span>rwlock<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> pthread_rwlock_trywrlock<span style="color: #009900;">&#40;</span>pthread_rwlock_t <span style="color: #339933;">*</span>rwlock<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
成功则返回<span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> 出错则返回错误编号.
<span style="color: #666666; font-style: italic;">//</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1135/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web开发人员必备的20款超赞的jQuery插件【CSDN】</title>
		<link>http://yaronspace.cn/blog/archives/1133</link>
		<comments>http://yaronspace.cn/blog/archives/1133#comments</comments>
		<pubDate>Fri, 25 Feb 2011 13:14:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[前端技术相关]]></category>
		<category><![CDATA[20款]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[插件]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1133</guid>
		<description><![CDATA[原文地址：http://sd.csdn.net/a/20110218/292102.html 收藏了 Creative Radical Web Typography Lettering.js是一个轻量经的、易于使用的jQuery插件，可创造出极具个性的网页排版，是2010年最佳jQuery插件之一。 New FancyMoves Jquery Product Slider Jquery Product Slider是一款效果很不错的产品幻灯片插件。 Jquery Space Gallery Jquery Space Gallery是一款很有空间感的图片库插件。 Fancy Thumbnail Hover Effect 这是一款非常不错的Hover效果插件。 Jquery Inline Form Validation 这是一款表单验证插件。 Site Switcher 这是一款站点切换插件。 AnythingSlider 这是一款效果很棒的幻灯片插件。 Jquery Tooltip Coda Bubble 这是一款简洁的jQuery信息提示插件。 Jquery Upload and Crop Image 这是一款图片上传和裁剪插件。 jQuery Carts 这是一款jQuery图表插件。 Twitter-like login box 这是一款类似Twitter登陆框效果的插件。 File]]></description>
			<content:encoded><![CDATA[<p>原文地址：<a href="http://sd.csdn.net/a/20110218/292102.html" target="_blank">http://sd.csdn.net/a/20110218/292102.html</a></p>
<p>收藏了</p>
<h2>Creative Radical Web Typography</h2>
<p>Lettering.js是一个轻量经的、易于使用的jQuery插件，可创造出极具个性的网页排版，是2010年最佳jQuery插件之一。</p>
<p><a href="http://blog.karachicorner.com/2010/10/creative-radical-web-typography-with-jquery-lettering-js/" target="_blank"><img title="17" src="http://articles.csdn.net/uploads/allimg/110218/0K0051401-0.jpg" alt="" width="574" height="333" /></a></p>
<h2><span id="more-1133"></span>New FancyMoves Jquery Product Slider</h2>
<p>Jquery Product Slider是一款效果很不错的产品幻灯片插件。</p>
<p><a href="http://blog.karachicorner.com/2010/12/new-fancymoves-jquery-product-slider/" target="_blank"><img title="15" src="http://articles.csdn.net/uploads/allimg/110218/0K0051602-1.jpg" alt="" width="574" height="382" /></a></p>
<h2>Jquery Space Gallery</h2>
<p>Jquery Space Gallery是一款很有空间感的图片库插件。</p>
<p><a href="http://eyecon.ro/spacegallery/#about" target="_blank"><img title="9" src="http://articles.csdn.net/uploads/allimg/110218/0K00562C-2.jpg" alt="" width="575" height="268" /></a></p>
<h2>Fancy Thumbnail Hover Effect</h2>
<p>这是一款非常不错的Hover效果插件。</p>
<p><a href="http://www.sohtanaka.com/web-design/fancy-thumbnail-hover-effect-w-jquery/" target="_blank"><img title="12" src="http://articles.csdn.net/uploads/allimg/110218/0K0055M8-3.png" alt="" width="576" height="247" /></a></p>
<h2>Jquery Inline Form Validation</h2>
<p>这是一款表单验证插件。</p>
<p><a href="http://www.position-absolute.com/articles/jquery-form-validator-because-form-validation-is-a-mess/" target="_blank"><img title="5" src="http://articles.csdn.net/uploads/allimg/110218/0K005D29-4.jpg" alt="" width="575" height="442" /></a></p>
<h2>Site Switcher</h2>
<p>这是一款站点切换插件。</p>
<p><a href="http://net.tutsplus.com/tutorials/javascript-ajax/jquery-animations-a-7-step-program/" target="_blank"><img title="1" src="http://articles.csdn.net/uploads/allimg/110218/0K00555W-5.jpg" alt="" width="575" height="337" /></a></p>
<h2>AnythingSlider</h2>
<p>这是一款效果很棒的幻灯片插件。</p>
<p><a href="http://css-tricks.com/examples/AnythingSlider/#panel1-6" target="_blank"><img title="2" src="http://articles.csdn.net/uploads/allimg/110218/0K0056164-6.jpg" alt="" width="575" height="288" /></a></p>
<h2>Jquery Tooltip Coda Bubble</h2>
<p>这是一款简洁的jQuery信息提示插件。</p>
<p><a href="http://jqueryfordesigners.com/demo/coda-bubble.html" target="_blank"><img title="10" src="http://articles.csdn.net/uploads/allimg/110218/0K0054061-7.jpg" alt="" width="575" height="261" /></a></p>
<h2>Jquery Upload and Crop Image</h2>
<p>这是一款图片上传和裁剪插件。</p>
<p><a href="http://www.webmotionuk.co.uk/php-jquery-image-upload-and-crop/" target="_blank"><img title="6" src="http://articles.csdn.net/uploads/allimg/110218/0K0055360-8.jpg" alt="" width="575" height="332" /></a></p>
<h2>jQuery Carts</h2>
<p>这是一款jQuery图表插件。</p>
<p><a href="http://shinylittlething.com/workshop/flot_intro/" target="_blank"><img title="13" src="http://articles.csdn.net/uploads/allimg/110218/0K0056336-9.png" alt="" width="574" height="164" /></a></p>
<h2>Twitter-like login box</h2>
<p>这是一款类似Twitter登陆框效果的插件。</p>
<p><a href="http://aext.net/2009/08/perfect-sign-in-dropdown-box-likes-twitter-with-jquery/" target="_blank"><img title="7" src="http://articles.csdn.net/uploads/allimg/110218/0K0053212-10.jpg" alt="" width="575" height="261" /></a></p>
<h2>File Download</h2>
<p>这是一款文件下载插件。</p>
<p><a href="http://blog.karachicorner.com/2010/11/file-download-jquery-plugin-jdownload/" target="_blank"><img title="16" src="http://articles.csdn.net/uploads/allimg/110218/0K0056044-11.jpg" alt="" width="575" height="304" /></a></p>
<h2>Polaroid Photo Viewer</h2>
<p>这是一款宝丽莱效果图片浏览插件。</p>
<p><a href="http://www.marcofolio.net/webdesign/creating_a_polaroid_photo_viewer_with_css3_and_jquery.html" target="_blank"><img title="3" src="http://articles.csdn.net/uploads/allimg/110218/0K00529A-12.jpg" alt="" width="575" height="295" /></a></p>
<h2>jquery Hover Sub Tag Cloud</h2>
<p>这是一款子标签云显示插件。</p>
<p><a href="http://www.noupe.com/ajax/jquery-hover-sub-tag-cloud.html" target="_blank"><img title="8" src="http://articles.csdn.net/uploads/allimg/110218/0K005I50-13.jpg" alt="" width="575" height="268" /></a></p>
<h2>Graph Visualization</h2>
<p>这是一款图标可视化插件。</p>
<p><a href="http://blog.karachicorner.com/2011/01/arbor-js-graph-visualization-library-using-web-workers-jquery/" target="_blank"><img title="20" src="http://articles.csdn.net/uploads/allimg/110218/0K005A93-14.jpg" alt="" width="574" height="230" /></a></p>
<h2>Show/Hide Jquery Panel</h2>
<p>这是一款控制面板显示和隐藏的插件。</p>
<p><a href="http://web-kreation.com/tutorials/nice-clean-sliding-login-panel-built-with-jquery/" target="_blank"><img title="4" src="http://articles.csdn.net/uploads/allimg/110218/0K0052Z8-15.jpg" alt="" width="575" height="233" /></a></p>
<h2>Drop Down with CSS and jQuery</h2>
<p>这是一款下拉菜单插件。</p>
<p><a href="http://www.jankoatwarpspeed.com/post/2009/07/28/reinventing-drop-down-with-css-jquery.aspx" target="_blank"><img title="11" src="http://articles.csdn.net/uploads/allimg/110218/0K0052130-16.jpg" alt="" width="575" height="230" /></a></p>
<h2>Quick &amp; Easy Zooming With jQuery – Zoomy</h2>
<p>这是一款非常好用的缩放插件。</p>
<p><a href="http://blog.karachicorner.com/2011/01/quick-easy-zooming-with-jquery-%E2%80%93-zoomy/" target="_blank"><img title="14" src="http://articles.csdn.net/uploads/allimg/110218/0K0055M8-17.jpg" alt="" width="575" height="312" /></a></p>
<h2>Horizontal Accordions</h2>
<p>这是一款横向手风琴效果插件。</p>
<p><a href="http://blog.karachicorner.com/2010/10/jquery-horizontal-accordions-jquery-plugin-for-easy-accordion/" target="_blank"><img title="18" src="http://articles.csdn.net/uploads/allimg/110218/0K00521G-18.jpg" alt="" width="574" height="224" /></a></p>
<h2>Flexible Rating</h2>
<p>这是一款非常灵活的评分插件。</p>
<p><a href="http://blog.karachicorner.com/2011/01/jrating-flexible-jquery-ajax-rating-plugin/" target="_blank"><img title="19" src="http://articles.csdn.net/uploads/allimg/110218/0K0052509-19.jpg" alt="" width="574" height="253" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1133/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>json_encode的php实现</title>
		<link>http://yaronspace.cn/blog/archives/1128</link>
		<comments>http://yaronspace.cn/blog/archives/1128#comments</comments>
		<pubDate>Fri, 25 Feb 2011 09:53:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Php|Python]]></category>
		<category><![CDATA[5.1.6]]></category>
		<category><![CDATA[json_encode]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1128</guid>
		<description><![CDATA[今天coding时，需要将php中的变量返回给第三方，第一个想到就是使用json格式，方便易用。于是用了json_encode，但是发现居然报语法错误，查了手册才发现，json_enode 是在5.2.0才作为标准扩展加入php的，而我们的机器上php的版本是5.1.6，原来该扩展还未加进来。由于这个应用比较小，而且本人赖得升级php的版本，而且再手工安装这个扩展也比较麻烦，所以想到了使用php实现json_encode，原理上应该不难，找到一段代码，共享之~ 代码如下： PHP CODE&#60;?php function __json_encode&#40; $data &#41; &#123; if&#40; is_array&#40;$data&#41; &#124;&#124; is_object&#40;$data&#41; &#41; &#123; $islist = is_array&#40;$data&#41; &#38;&#38; &#40; empty&#40;$data&#41; &#124;&#124; array_keys&#40;$data&#41; === range&#40;0,count&#40;$data&#41;-1&#41; &#41;; &#160; if&#40; $islist &#41; &#123; $json = '[' . implode&#40;',', array_map&#40;'__json_encode', $data&#41; &#41; . ']'; &#125; else &#123; $items = Array&#40;&#41;; foreach&#40; $data as $key =&#62; $value &#41;]]></description>
			<content:encoded><![CDATA[<p><br/><br />
今天coding时，需要将php中的变量返回给第三方，第一个想到就是使用json格式，方便易用。于是用了json_encode，但是发现居然报语法错误，查了手册才发现，json_enode 是在5.2.0才作为标准扩展加入php的，而我们的机器上php的版本是5.1.6，原来该扩展还未加进来。由于这个应用比较小，而且本人赖得升级php的版本，而且再手工安装这个扩展也比较麻烦，所以想到了使用php实现json_encode，原理上应该不难，找到一段代码，共享之~<br />
<span id="more-1128"></span><br />
代码如下：</p>

<div class="wp_syntax"><div class="code_title">PHP CODE</div><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">function</span> __json_encode<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$data</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>           
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #990000;">is_object</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$islist</span> <span style="color: #339933;">=</span> <span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #990000;">array_keys</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #990000;">range</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$islist</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$json</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'['</span> <span style="color: #339933;">.</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">','</span><span style="color: #339933;">,</span> <span style="color: #990000;">array_map</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'__json_encode'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">']'</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$items</span> <span style="color: #339933;">=</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$data</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$items</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> __json_encode<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$key</span>&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">':'</span> <span style="color: #339933;">.</span> __json_encode<span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #000088;">$json</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'{'</span> <span style="color: #339933;">.</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">','</span><span style="color: #339933;">,</span> <span style="color: #000088;">$items</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'}'</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">elseif</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">is_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;"># Escape non-printable or Non-ASCII characters.
</span>        <span style="color: #666666; font-style: italic;"># I also put the \\ character first, as suggested in comments on the 'addclashes' page.
</span>        <span style="color: #000088;">$string</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'&quot;'</span> <span style="color: #339933;">.</span> <span style="color: #990000;">addcslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\\</span><span style="color: #000099; font-weight: bold;">\&quot;</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\t</span>/&quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">chr</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">chr</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&quot;'</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$json</span>    <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$len</span>    <span style="color: #339933;">=</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$string</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;"># Convert UTF-8 to Hexadecimal Codepoints.
</span>        <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$len</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
            <span style="color: #000088;">$char</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$string</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$c1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$char</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #666666; font-style: italic;"># Single byte;
</span>            <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$c1</span> <span style="color: #339933;">&lt;</span><span style="color: #cc66cc;">128</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$json</span> <span style="color: #339933;">.=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$c1</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">31</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$char</span> <span style="color: #339933;">:</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>u<span style="color: #009933; font-weight: bold;">%04x</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            <span style="color: #666666; font-style: italic;"># Double byte
</span>            <span style="color: #000088;">$c2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$string</span><span style="color: #009900;">&#91;</span><span style="color: #339933;">++</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$c1</span> <span style="color: #339933;">&amp;</span> <span style="color: #cc66cc;">32</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$json</span> <span style="color: #339933;">.=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>u<span style="color: #009933; font-weight: bold;">%04x</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$c1</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">192</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">64</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$c2</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">128</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            <span style="color: #666666; font-style: italic;"># Triple
</span>            <span style="color: #000088;">$c3</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$string</span><span style="color: #009900;">&#91;</span><span style="color: #339933;">++</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$c1</span> <span style="color: #339933;">&amp;</span> <span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$json</span> <span style="color: #339933;">.=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>u<span style="color: #009933; font-weight: bold;">%04x</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c1</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">224</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c2</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">128</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$c3</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">128</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            <span style="color: #666666; font-style: italic;"># Quadruple
</span>            <span style="color: #000088;">$c4</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$string</span><span style="color: #009900;">&#91;</span><span style="color: #339933;">++</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$c1</span> <span style="color: #339933;">&amp;</span> <span style="color: #cc66cc;">8</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$u</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c1</span> <span style="color: #339933;">&amp;</span> <span style="color: #cc66cc;">15</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c2</span><span style="color: #339933;">&gt;&gt;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #000088;">$w1</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">54</span><span style="color: #339933;">&lt;&lt;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$u</span><span style="color: #339933;">&lt;&lt;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c2</span> <span style="color: #339933;">&amp;</span> <span style="color: #cc66cc;">15</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c3</span><span style="color: #339933;">&gt;&gt;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$w2</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">55</span><span style="color: #339933;">&lt;&lt;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c3</span> <span style="color: #339933;">&amp;</span> <span style="color: #cc66cc;">15</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;&lt;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$c4</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">128</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$json</span> <span style="color: #339933;">.=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>u<span style="color: #009933; font-weight: bold;">%04x</span><span style="color: #000099; font-weight: bold;">\\</span>u<span style="color: #009933; font-weight: bold;">%04x</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$w1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$w2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;"># int, floats, bools, null
</span>        <span style="color: #000088;">$json</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">var_export</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$data</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$json</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1128/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>信息分析工具之—$APPEALES【转】</title>
		<link>http://yaronspace.cn/blog/archives/1126</link>
		<comments>http://yaronspace.cn/blog/archives/1126#comments</comments>
		<pubDate>Wed, 23 Feb 2011 07:10:07 +0000</pubDate>
		<dc:creator>Yvonne</dc:creator>
				<category><![CDATA[Project Management]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1126</guid>
		<description><![CDATA[$APPEALS 是一种市场需求和收集的方法，一般是使用在市场规划和产品规划的细分市场中，因为可以从多个维度，不同的权重来分析需求，所有$APPEALS一定会联系到细分市场，联系到竞争对手，涉及到差异化分析和蓝海的价值创新(减少，增加，剔除，创新)。差异化可以说是理解市场和分析市场中的一个重要内容，只有清楚了差异化才能够树立自己产品的核心竞争力。 $APPEALS方法是IBM在IPD总结和分析出来的客户需求分析的一种方法。它从8个方面对产品进行客户需求定义和产品定位。具体如下： $-产品价格（Price）； A-可获得性（Availability）； P-包装（Packaging）； P-性能（Performance）； E-易用性（Easy to use）； A-保证程度（Assurances）； L-生命周期成本（Life cycle of cost）； S-社会接受程度（Social acceptance）。 使用客户$APPEALS框架来确定客户的欲望与需要，建立针对每一个细分市场的产品包对应图。客户$APPEALS框架的目的主要包括以下方面的内容: 处理目标细分市场的全部客户欲望与需要 建立客户驱动的需求集，作为投资的重点 确定要想在所选细分市场获得成功必须达到的主要分界标准 确定促使客户选择公司产品的主要差异 $价格 这个要素反映了客户为一个满意的产品/交付希望支付的价格。用这个标准来要求供应商时，要从实际和感觉这两方面来考虑客户能接受的购买价格。将包括以下的数据评估：技术、低成本制造、物料、人力成本、制造费用、经验、自动化程度、简易性、可生产性等。 A保证 这个要素通常反映了在可靠性、安全和质量方面的保证。用这个标准来要求供应商时，要考虑客户在可预测的环境下关于减少他/她关注确定的性能方面如何评价整个产品?这可以包括保证、鉴定、冗余度和强度。 P性能 这个要素描述了对这个交付期望的功能和特性。用这个标准来要求供应商时，要从实际和感觉这两方面来考虑有关功能和特性的产品性能。产品工作得怎样？产品是否具备所有的必须的和理想的特性？它是否提供更高的性能？从客户角度来衡量，如速度、功率、容量等。 P包装 这 个要素描述了期望的设计质量、特性和外观等视觉特征。就软件而言它描述了交付或提供的功能包。用这个标准来要求供应商时，要考虑客户对外形、设计等意见， 还有这些属性对交付的期望的贡献程度。关于包装的考虑应该包括样式、模块性、集成性、结构、颜色、图形、工艺设计等方面。 E易用 这个要素描述了交付的易用属性。用这个标准来要求供应商时，要考虑客户对产品的舒适、学习、文档、支持、人性化显示、感觉的输入/输出、接口、直观性等方面的考虑意见。 A可获得性 这个要素描述了客户在容易和有效两方面的购买过程(例如：让客户有他自己的方式)。用这个标准来要求供应商时，要考虑在整个购买过程的优秀程度，包括预售的技术支持和示范、购买渠道/供应商选择、交付时间、客户定制能力等。 L生命周期成本 这个要素描述了所有者在使用的整个生命周期的成本，用这个要素来要求供应商时，要考虑安装成本、培训、服务、供应、能源效率、价值折旧、处理成本等。 S社会接受程度 这个要素描述了影响购买决定的其他影响。用这个要素来要求供应商时，要考虑口头言论，第三方评价、顾问的报告、形象、政府或行业的标准、法规、社会认可、法律关系、产品义务等对购买决定起了怎样的促进作用。 对 于$APPEALS方法里面涉及到很多内容，首先是要通过用户调查收集具体的用户最关心哪个维度的问题，根据这些调查数据来确定每个维度的权重；其次是要 分析自己公司和竞争对手公司的产品在先阶段各个维度的评分，然后是画出相应的雷达图进行差异化分析。根据公司的战略目标和市场策略，应该重点关注哪些核心 功能和核心需求，如何减少自己的弱势并提升自我优势以体现差异化，如何进行价值创新等。]]></description>
			<content:encoded><![CDATA[<p>$APPEALS 是一种市场需求和收集的方法，一般是使用在市场规划和产品规划的细分市场中，因为可以从多个维度，不同的权重来分析需求，所有$APPEALS一定会联系到细分市场，联系到竞争对手，涉及到差异化分析和蓝海的价值创新(减少，增加，剔除，创新)。<span style="color: #ff0000;">差异化</span>可以说是理解市场和分析市场中的一个重要内容，只有清楚了差异化才能够树立自己产品的核心竞争力。</p>
<div id="postmessage_32930">
$APPEALS方法是IBM在IPD总结和分析出来的客户需求分析的一种方法。它从8个方面对产品进行客户需求定义和产品定位。具体如下：</p>
<ul>
<li>$-产品价格（Price）；</li>
<li>A-可获得性（Availability）；</li>
<li>P-包装（Packaging）；</li>
<li>P-性能（Performance）；</li>
<li>E-易用性（Easy to use）；</li>
<li>A-保证程度（Assurances）；</li>
<li>L-生命周期成本（Life cycle of cost）；</li>
<li>S-社会接受程度（Social acceptance）。</li>
</ul>
<p>使用客户$APPEALS框架来确定客户的欲望与需要，建立针对每一个细分市场的产品包对应图。客户$APPEALS框架的目的主要包括以下方面的内容:</p>
<ul>
<li>处理目标细分市场的全部客户欲望与需要</li>
<li>建立客户驱动的需求集，作为投资的重点</li>
<li>确定要想在所选细分市场获得成功必须达到的主要分界标准</li>
<li>确定促使客户选择公司产品的主要差异</li>
</ul>
<p><strong>$价格</strong><br />
这个要素反映了客户为一个满意的产品/交付希望支付的价格。用这个标准来要求供应商时，要从实际和感觉这两方面来考虑客户能接受的购买价格。将包括以下的数据评估：技术、低成本制造、物料、人力成本、制造费用、经验、自动化程度、简易性、可生产性等。</p>
<p><strong>A保证</strong><br />
这个要素通常反映了在可靠性、安全和质量方面的保证。用这个标准来要求供应商时，要考虑客户在可预测的环境下关于减少他/她关注确定的性能方面如何评价整个产品?这可以包括保证、鉴定、冗余度和强度。</p>
<p><strong>P性能</strong><br />
这个要素描述了对这个交付期望的功能和特性。用这个标准来要求供应商时，要从实际和感觉这两方面来考虑有关功能和特性的产品性能。产品工作得怎样？产品是否具备所有的必须的和理想的特性？它是否提供更高的性能？从客户角度来衡量，如速度、功率、容量等。</p>
<p><strong>P包装</strong><br />
这 个要素描述了期望的设计质量、特性和外观等视觉特征。就软件而言它描述了交付或提供的功能包。用这个标准来要求供应商时，要考虑客户对外形、设计等意见， 还有这些属性对交付的期望的贡献程度。关于包装的考虑应该包括样式、模块性、集成性、结构、颜色、图形、工艺设计等方面。</p>
<p><strong>E易用</strong><br />
这个要素描述了交付的易用属性。用这个标准来要求供应商时，要考虑客户对产品的舒适、学习、文档、支持、人性化显示、感觉的输入/输出、接口、直观性等方面的考虑意见。</p>
<p><strong>A可获得性 </strong><br />
这个要素描述了客户在容易和有效两方面的购买过程(例如：让客户有他自己的方式)。用这个标准来要求供应商时，要考虑在整个购买过程的优秀程度，包括预售的技术支持和示范、购买渠道/供应商选择、交付时间、客户定制能力等。</p>
<p><strong>L生命周期成本 </strong><br />
这个要素描述了所有者在使用的整个生命周期的成本，用这个要素来要求供应商时，要考虑安装成本、培训、服务、供应、能源效率、价值折旧、处理成本等。</p>
<p><strong>S社会接受程度 </strong><br />
这个要素描述了影响购买决定的其他影响。用这个要素来要求供应商时，要考虑口头言论，第三方评价、顾问的报告、形象、政府或行业的标准、法规、社会认可、法律关系、产品义务等对购买决定起了怎样的促进作用。</p>
<p>对 于$APPEALS方法里面涉及到很多内容，首先是要通过用户调查收集具体的用户最关心哪个维度的问题，根据这些调查数据来确定每个维度的权重；其次是要 分析自己公司和竞争对手公司的产品在先阶段各个维度的评分，然后是画出相应的雷达图进行差异化分析。根据公司的战略目标和市场策略，应该重点关注哪些核心 功能和核心需求，如何减少自己的弱势并提升自我优势以体现差异化，如何进行价值创新等。</p></div>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1126/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>提高编程技能最有效的方法[转载]</title>
		<link>http://yaronspace.cn/blog/archives/1124</link>
		<comments>http://yaronspace.cn/blog/archives/1124#comments</comments>
		<pubDate>Wed, 23 Feb 2011 03:38:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[编程语言与算法设计]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1124</guid>
		<description><![CDATA[看到这篇文章，感觉写的挺不错的，转载下 原文地址：http://coolshell.cn/articles/3698.html StackExchange.com上有两个贴子（贴子一，贴子二）， 贴子名叫“What is the single most effective thing you did to improve your programming skills?” – 对你的编程技术提高最有效的一件事是什么？回复的人中给了很多很不错的建议，我把他们总结了一下，十条，相信一定会对你有用。（注意：顺序是我自己按我的 个人经验排的） 和比自己聪明的能力比自己强的人工作。学习他们的代码，他们的做事方法，看一看那些人是怎么处理错误的。 总是倾听别人怎么说，无论那个的资历和职位是什么样的。 实践，实践，实践，总是不满意于一开始出来的事。 多问问自己，现在在写什么代码？为什么要这样写成这样？还有没有更好的方法？ 学习多样的技术，多多比较他们，并一定要了解各种技术的优缺点。 总是问别人问好的问题。 多回头看看走过的路，做过的事，写过的程序，感觉一下他们有多烂。 多读读那些大师写的书。 不要总坐在电脑前编程序，多做做运动，多到户外走走，和非技术人多接触，向他们学习。 把你的想法说出去，看看别人怎么回应的。从别人的回应中学习。 除了这些，下面是我个人想给你的建议—— 可能只能算精神，不能算方法。我以前也写过一篇《五个方法成为更好的程序员》，《十条不错的编程观点》，还有《优秀程序员的十个习惯》这几篇文章也能给你一些启发。 热情。对编程充满热情。这种热情会导致强烈地专研精神，和努力的精神。专研精神相当重要，它是畏难情绪的天敌。 知道。学习技术要“知其道，明其理”，而不仅仅只是了解知识。举例，为什么C++有“初始化例表”而Java却没有？为什么Java的没有多重继承？为会有了TCP还要UDP？对于一个事物，什么是好的，什么是不好的。不但要了解其表面，还要了解其思想。只有了解原始的初衷和目的，你才能真正“知道”。 犯错。不犯错误永远没有经验，从自己的错误和别人的错误中学习，只有自己犯了错，才会真正明白。犯错不可怕，可怕的是不会总结只有真正的摸爬滚打过的人才是强人。技能和经验总是用错误去换来的。 回顾。要多去回顾过去，看看 历史上发生过的事。这样你才能明白事物的发展规律，从面才能了解未来的路。举例：单机 -&#62; Client/Server -&#62; 中间应用层 -&#62; 多层结构 -&#62; 分布式结构。 C -&#62; C++ -&#62; Java，等等，等等。未来其实就在回顾过去之中。 质疑。质疑精神很重要。质疑通常会导致不同意见甚至反对意见。也许你会质疑错，也许你会被质疑，但是你的认知也会因为不同的观点而变得完整。有所同有所不同（“同”为同意及相同），观点因为不同才能迸发出火花，事物也此而发展，世界因为不同而精彩。]]></description>
			<content:encoded><![CDATA[<p>看到这篇文章，感觉写的挺不错的，转载下</p>
<p>原文地址：<a href="http://coolshell.cn/articles/3698.html" target="_blank">http://coolshell.cn/articles/3698.html</a></p>
<p>StackExchange.com上有两个贴子（<a href="http://programmers.stackexchange.com/questions/3089/what-is-the-single-most-effective-thing-you-did-to-improve-your-programming-skill" target="_blank">贴子一</a>，<a href="http://programmers.stackexchange.com/questions/44177/what-is-the-single-most-effective-thing-you-did-to-improve-your-programming-skill" target="_blank">贴子二</a>）， 贴子名叫“What is the single most effective thing you did to improve your  programming skills?” –  对你的编程技术提高最有效的一件事是什么？回复的人中给了很多很不错的建议，我把他们总结了一下，十条，相信一定会对你有用。（注意：顺序是我自己按我的 个人经验排的）</p>
<ul>
<li>和比自己聪明的能力比自己强的人工作。学习他们的代码，他们的做事方法，看一看那些人是怎么处理错误的。</li>
</ul>
<ul>
<li>总是倾听别人怎么说，无论那个的资历和职位是什么样的。</li>
</ul>
<ul>
<li>实践，实践，实践，总是不满意于一开始出来的事。</li>
</ul>
<ul>
<li>多问问自己，现在在写什么代码？为什么要这样写成这样？还有没有更好的方法？</li>
</ul>
<ul>
<li>学习多样的技术，多多比较他们，并一定要了解各种技术的优缺点。</li>
</ul>
<ul>
<li>总是问别人问好的问题。</li>
</ul>
<ul>
<li>多回头看看走过的路，做过的事，写过的程序，感觉一下他们有多烂。</li>
</ul>
<ul>
<li>多读读那些大师写的书。</li>
</ul>
<ul>
<li>不要总坐在电脑前编程序，多做做运动，多到户外走走，和非技术人多接触，向他们学习。</li>
</ul>
<ul>
<li>把你的想法说出去，看看别人怎么回应的。从别人的回应中学习。</li>
</ul>
<p>除了这些，下面是我个人想给你的建议——<br />
可能只能算精神，不能算方法。我以前也写过一篇《<a rel="bookmark" href="http://coolshell.cn/articles/2606.html" target="_blank">五个方法成为更好的程序员</a>》，《<a rel="bookmark" href="http://coolshell.cn/articles/2424.html" target="_blank">十条不错的编程观点</a>》，还有《<a rel="bookmark" href="http://coolshell.cn/articles/222.html" target="_blank">优秀程序员的十个习惯</a>》这几篇文章也能给你一些启发。</p>
<ul>
<li><strong>热情</strong>。对编程充满热情。这种热情会导致强烈地专研精神，和努力的精神。<strong>专研精神相当重要，它是畏难情绪的天敌</strong>。</li>
</ul>
<ul>
<li><strong>知道</strong>。学习技术要“知其道，明其理”，而不仅仅只是了解知识。举例，为什么C++有“初始化例表”而Java却没有？为什么Java的没有多重继承？为会有了TCP还要UDP？对于一个事物，什么是好的，什么是不好的。不但要了解其表面，还要了解其思想。<strong>只有了解原始的初衷和目的，你才能真正“知道”</strong>。</li>
</ul>
<ul>
<li><strong>犯错</strong>。不犯错误永远没有经验，从自己的错误和别人的错误中学习，只有自己犯了错，才会真正明白。犯错不可怕，可怕的是不会总结只有真正的摸爬滚打过的人才是强人。<strong>技能和经验总是用错误去换来的</strong>。</li>
</ul>
<ul>
<li><strong>回顾</strong>。要多去回顾过去，看看 历史上发生过的事。这样你才能明白事物的发展规律，从面才能了解未来的路。举例：单机 -&gt; Client/Server -&gt; 中间应用层  -&gt; 多层结构 -&gt; 分布式结构。 C -&gt; C++ -&gt; Java，等等，等等。<strong>未来其实就在回顾过去之中</strong>。</li>
</ul>
<ul>
<li><strong>质疑</strong>。质疑精神很重要。质疑通常会导致不同意见甚至反对意见。也许你会质疑错，也许你会被质疑，但是你的认知也会因为不同的观点而变得完整。有所同有所不同（“同”为同意及相同），<strong>观点因为不同才能迸发出火花，事物也此而发展，世界因为不同而精彩</strong>。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1124/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++中extern &#8220;c&#8221;深层含义</title>
		<link>http://yaronspace.cn/blog/archives/1121</link>
		<comments>http://yaronspace.cn/blog/archives/1121#comments</comments>
		<pubDate>Tue, 22 Feb 2011 09:22:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[extern "C"]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1121</guid>
		<description><![CDATA[extern &#8220;C&#8221; 代表双重含义：从字面意思上看，一被修饰的目标是extern,二被修饰的目标是C。 1，首先被extern &#8220;C&#8221;限定的函数或变量是extern类型的， extern是C/C++语言中表明函数和全局变量作用范围（可见性）的关键字，该关键字告诉编译器，其声明的函数和变量可以在本模块或其它模块中使用。 2，被extern &#8220;C&#8221;修饰的变量和函数是按照C语言方式编译和连接的； 也就是说C和C++对于编译器来说编译的方式是不同的，作为面向对象程序语言，C++支持函数重载，而C语言不支持函数重载，即某个函数被C++编译器编译后和被C编译器编译后的名字是不同的。例如，函数的原型为： void foo(int, int); 假如C++编译后的名字为：_foo_int_int C编译后的名字为：_foo_ 如果在C++中使用C语言提供的库函数时，在引用完头文件后，在链接时，可以无法再目标代码中找到_foo_int_int类似的函数，只能找到_foo_函数，所以会出现函数未定义的错误。 总的来说一句话：extern &#8220;C&#8221;的存在时为了C和C++能够进行混合编程。 关于extern &#8220;C&#8221; 的用途，请参看我的另一篇文章 C语言调用C++库接口的方法概述 参考资料： http://www.cppblog.com/Macaulish/archive/2008/06/17/53689.html]]></description>
			<content:encoded><![CDATA[<p>extern &#8220;C&#8221; 代表双重含义：从字面意思上看，一被修饰的目标是extern,二被修饰的目标是C。</p>
<p>1，首先被extern &#8220;C&#8221;限定的函数或变量是extern类型的，<br />
extern是C/C++语言中表明函数和全局变量作用范围（可见性）的关键字，该关键字告诉编译器，其声明的函数和变量可以在本模块或其它模块中使用。</p>
<p>2，被extern &#8220;C&#8221;修饰的变量和函数是按照C语言方式编译和连接的；</p>
<p>也就是说C和C++对于编译器来说编译的方式是不同的，作为面向对象程序语言，C++支持函数重载，而C语言不支持函数重载，即某个函数被C++编译器编译后和被C编译器编译后的名字是不同的。例如，函数的原型为：</p>
<p>void foo(int, int);</p>
<p>假如C++编译后的名字为：_foo_int_int</p>
<p>C编译后的名字为：_foo_</p>
<p>如果在C++中使用C语言提供的库函数时，在引用完头文件后，在链接时，可以无法再目标代码中找到_foo_int_int类似的函数，只能找到_foo_函数，所以会出现函数未定义的错误。</p>
<p>总的来说一句话：extern &#8220;C&#8221;的存在时为了C和C++能够进行混合编程。</p>
<p>关于extern &#8220;C&#8221; 的用途，请参看我的另一篇文章</p>
<h3><a title="C语言调用C++库接口的方法概述" href="http://www.yaronspace.cn/blog/index.php/archives/1046" target="_blank">C语言调用C++库接口的方法概述</a></h3>
<p>参考资料：</p>
<p><a href="http://www.cppblog.com/Macaulish/archive/2008/06/17/53689.html">http://www.cppblog.com/Macaulish/archive/2008/06/17/53689.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1121/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Makefile学习笔记-wildcard notdir patsubst用法</title>
		<link>http://yaronspace.cn/blog/archives/1119</link>
		<comments>http://yaronspace.cn/blog/archives/1119#comments</comments>
		<pubDate>Tue, 22 Feb 2011 08:56:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[makefile]]></category>
		<category><![CDATA[notdir]]></category>
		<category><![CDATA[patsubst]]></category>
		<category><![CDATA[wildcard]]></category>
		<category><![CDATA[用法]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1119</guid>
		<description><![CDATA[在手写Makefile时，用上这三个函数非常方便，减少了很多人力劳动哈 用法介绍： wildcard:  扩展通配符 例如将* 进行匹配 notdir:  去除目录 类似于basename的用法 patsubst: 替换通配符 说起来比较费劲，直接看例子的话，比较好理解 例子介绍： 在test目录下a.cpp和b.cpp，sub目录下c.cpp和d.cpp 建立一个简单的Makefile文件： MAKE CODEsrc=$&#40;wildcard *.c ./sub/*.c&#41; dir=$&#40;notdir $&#40;src&#41;&#41; obj=$&#40;patsubst %.c，%.o，$&#40;dir&#41; &#41; &#160; all: @echo $&#40;src&#41; @echo $&#40;dir&#41; @echo $&#40;obj&#41; @echo &#34;end&#34; 输出结果为： #wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开 a.cpp b.cpp ./sub/c.cpp ./sub/d.cpp #notdir把展开的文件去除掉路径信息 a.cpp b.cpp c.cpp d.cpp #patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o a.o b.o c.o d.o]]></description>
			<content:encoded><![CDATA[<p>在手写Makefile时，用上这三个函数非常方便，减少了很多人力劳动哈</p>
<p><strong>用法介绍：</strong></p>
<p>wildcard:  扩展通配符 例如将* 进行匹配</p>
<p>notdir:  去除目录 类似于basename的用法</p>
<p>patsubst: 替换通配符</p>
<p>说起来比较费劲，直接看例子的话，比较好理解</p>
<p><strong>例子介绍：</strong></p>
<p>在test目录下a.cpp和b.cpp，sub目录下c.cpp和d.cpp</p>
<p>建立一个简单的Makefile文件：</p>

<div class="wp_syntax"><div class="code_title">MAKE CODE</div><div class="code"><pre class="make" style="font-family:monospace;">src<span style="color: #004400;">=$</span><span style="color: #004400;">&#40;</span><span style="color: #0000CC; font-weight: bold;">wildcard</span> <span style="color: #004400;">*.</span>c <span style="color: #004400;">./</span>sub<span style="color: #004400;">/*.</span>c<span style="color: #004400;">&#41;</span>
dir<span style="color: #004400;">=$</span><span style="color: #004400;">&#40;</span><span style="color: #0000CC; font-weight: bold;">notdir</span> <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">src</span><span style="color: #004400;">&#41;</span><span style="color: #004400;">&#41;</span>
obj<span style="color: #004400;">=$</span><span style="color: #004400;">&#40;</span><span style="color: #0000CC; font-weight: bold;">patsubst</span> <span style="color: #004400;">%.</span>c，<span style="color: #004400;">%.</span>o，<span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #0000CC; font-weight: bold;">dir</span><span style="color: #004400;">&#41;</span> <span style="color: #004400;">&#41;</span>
&nbsp;
all<span style="color: #004400;">:</span>
 <span style="color: #004400;">@</span>echo <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">src</span><span style="color: #004400;">&#41;</span>
 <span style="color: #004400;">@</span>echo <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #0000CC; font-weight: bold;">dir</span><span style="color: #004400;">&#41;</span>
 <span style="color: #004400;">@</span>echo <span style="color: #004400;">$</span><span style="color: #004400;">&#40;</span><span style="color: #000088;">obj</span><span style="color: #004400;">&#41;</span>
 <span style="color: #004400;">@</span>echo <span style="color: #CC2200;">&quot;end&quot;</span></pre></div></div>

<p>输出结果为：</p>
<pre>
#wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开
a.cpp b.cpp ./sub/c.cpp ./sub/d.cpp
#notdir把展开的文件去除掉路径信息
a.cpp b.cpp c.cpp d.cpp
#patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o
a.o b.o c.o d.o
</pre>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1119/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sscanf函数的高级用法[转载]</title>
		<link>http://yaronspace.cn/blog/archives/1112</link>
		<comments>http://yaronspace.cn/blog/archives/1112#comments</comments>
		<pubDate>Sat, 19 Feb 2011 09:47:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[sscanf用法]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1112</guid>
		<description><![CDATA[原文地址：http://blog.csdn.net/eroswang/archive/2007/08/20/1751444.aspx 大家都知道sscanf是一个很好用的函数，利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单，特别对于整数和浮点数来说。但新手可能并不知道处理字符串时的一些高级用法，这里做个简要说明吧。 名称: sscanf() &#8211; 从一个字符串中读进与指定格式相符的数据. 函数原型: Int sscanf( string str, string fmt, mixed var1, mixed var2 &#8230; ); int scanf( const char *format [,argument]&#8230; ); 说明： sscanf与scanf类似，都是用于输入的，只是后者以屏幕(stdin)为输入源，前者以固定字符串为输入源。 其中的format可以是一个或多个 {%[*] [width] [{h &#124; l &#124; I64 &#124; L}]type &#124; &#8216; &#8216; &#124; &#8216;\t&#8217; &#124; &#8216;\n&#8217; &#124; 非%符号} 注： 1、 * 亦可用于格式中, (即 %*d 和 %*s)]]></description>
			<content:encoded><![CDATA[<p>原文地址：<a href="http://blog.csdn.net/eroswang/archive/2007/08/20/1751444.aspx">http://blog.csdn.net/eroswang/archive/2007/08/20/1751444.aspx</a></p>
<p><span style="font-size: small;">大家都知道<span style="font-family: Times New Roman;">sscanf</span>是一个很好用的函数，利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单，特别对于整数和浮点数来说。但新手可能并不知道处理字符串时的一些高级用法，这里做个简要说明吧。</span><br />
<strong>名称:</strong></p>
<p>sscanf() &#8211; 从一个字符串中读进与指定格式相符的数据.</p>
<p><strong>函数原型</strong><strong>:</strong></p>
<p>Int  sscanf( string str, string fmt, mixed var1, mixed var2 &#8230; );</p>
<p>int scanf( const char *format [,argument]&#8230; );</p>
<p><strong>说明：</strong></p>
<p>sscanf与scanf类似，都是用于输入的，只是后者以屏幕(stdin)为输入源，前者以固定字符串为输入源。<br />
其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | &#8216; &#8216; | &#8216;\t&#8217; | &#8216;\n&#8217; | 非%符号}</p>
<p><strong>注：</strong></p>
<p>1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)</p>
<p>2、{a|b|c}表示a,b,c中选一，[d],表示可以有d也可以没有d。</p>
<p>3、width表示读取宽度。</p>
<p>4、{h | l | I64 | L}:参数的size,通常h表示单字节size，I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。</p>
<p>5、type :这就很多了，就是%s,%d之类。</p>
<p>6、特别的：%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉，不会向目标参数中写入值</p>
<p>支持集合操作：</p>
<p>%[a-z] 表示匹配a到z中任意字符，贪婪性(尽可能多的匹配)</p>
<p>%[aB'] 匹配a、B、&#8217;中一员，贪婪性</p>
<p>%[^a] 匹配非a的任意字符，贪婪性<br />
<br/><br />
<strong><span style="font-family: Times New Roman;"><span style="font-size: small;">1.</span> </span></strong><strong><span style="font-size: small;">常见用法。</span></strong></p>
<table border="1" cellspacing="0" cellpadding="0" bgcolor="#cccccc">
<tbody>
<tr>
<td width="568" valign="top"><span style="font-family: Times New Roman;">char str[512] = {0};</span></p>
<p><span style="font-family: Times New Roman;"> sscanf(&#8220;123456 &#8220;, &#8220;%s&#8221;, str);</span></p>
<p><span style="font-family: Times New Roman;"> printf(&#8220;str=%s\n&#8221;, str);</span></td>
</tr>
</tbody>
</table>
<p><span style="font-size: small;"><span style="font-family: Times New Roman;"> </span></span></p>
<p><span style="font-family: Times New Roman;"><span style="font-size: small;">2.</span> </span><span style="font-size: small;"><strong>取指定长度的字符串。</strong>如在下例中，取最大长度为<span style="font-family: Times New Roman;">4</span>字节的字符串。</span></p>
<table border="1" cellspacing="0" cellpadding="0" bgcolor="#cccccc">
<tbody>
<tr>
<td width="568" valign="top"><span style="font-family: Times New Roman;"> sscanf(&#8220;123456 &#8220;, &#8220;%4s&#8221;, str);</span></p>
<p><span style="font-family: Times New Roman;"> printf(&#8220;str=%s\n&#8221;, str);</span></td>
</tr>
</tbody>
</table>
<p><span style="font-size: small;"><span style="font-family: Times New Roman;"> </span></span></p>
<h2><span id="more-1112"></span></h2>
<p><span style="font-family: Times New Roman;"><span style="font-size: small;">3.</span> </span><span style="font-size: small;"><strong>取到指定字符为止的字符串。</strong>如在下例中，取遇到空格为止字符串。</span></p>
<table border="1" cellspacing="0" cellpadding="0" bgcolor="#cccccc">
<tbody>
<tr>
<td width="568" valign="top"><span style="font-family: Times New Roman;"> sscanf(&#8220;123456 abcdedf&#8221;, &#8220;%[^ ]&#8220;, str);</span></p>
<p><span style="font-family: Times New Roman;"> printf(&#8220;str=%s\n&#8221;, str);</span></td>
</tr>
</tbody>
</table>
<p><span style="font-size: small;"><span style="font-family: Times New Roman;"> </span></span></p>
<p><span style="font-family: Times New Roman;"><span style="font-size: small;">4.</span> </span><span style="font-size: small;"><strong>取仅包含指定字符集的字符串。</strong>如在下例中，取仅包含<span style="font-family: Times New Roman;">1</span>到<span style="font-family: Times New Roman;">9</span>和小写字母的字符串。</span></p>
<table border="1" cellspacing="0" cellpadding="0" bgcolor="#cccccc">
<tbody>
<tr>
<td width="568" valign="top"><span style="font-family: Times New Roman;"> sscanf(&#8220;123456abcdedfBCDEF&#8221;, &#8220;%[1-9a-z]&#8220;, str);</span></p>
<p><span style="font-family: Times New Roman;"> printf(&#8220;str=%s\n&#8221;, str);</span></td>
</tr>
</tbody>
</table>
<p><span style="font-size: small;"><span style="font-family: Times New Roman;"> </span></span></p>
<p><span style="font-family: Times New Roman;"><span style="font-size: small;">5.</span> </span><span style="font-size: small;"><strong>取到指定字符集为止的字符串。</strong>如在下例中，取遇到大写字母为止的字符串。</span></p>
<table border="1" cellspacing="0" cellpadding="0" bgcolor="#cccccc">
<tbody>
<tr>
<td width="568" valign="top"><span style="font-family: Times New Roman;"> sscanf(&#8220;123456abcdedfBCDEF&#8221;, &#8220;%[^A-Z]&#8220;, str);</span></p>
<p><span style="font-family: Times New Roman;"> printf(&#8220;str=%s\n&#8221;, str);</span></td>
</tr>
</tbody>
</table>
<p><span style="color: #ff0000; font-size: medium;"><strong>不是以空格作为分割符的话，多数是用5,6,7这种用法</strong></span></p>
<p><strong><span style="color: #ff0000; font-size: medium;">因为，字符串匹配到空格为止</span></strong></p>
<p>6、给定一个字符串<span style="font-family: Times New Roman;">iios/12DDWDFF@122</span>，获取<span style="font-family: Times New Roman;"> / </span>和<span style="font-family: Times New Roman;"> @ </span>之间的字符串，先将<span style="font-family: Times New Roman;"> &#8220;iios/&#8221;</span>过滤掉，再将非<span style="font-family: Times New Roman;">&#8216;@&#8217;</span>的一串内容送到<span style="font-family: Times New Roman;">buf</span>中</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="568" valign="top">sscanf(&#8220;<span style="font-family: Times New Roman;">iios/12DDWDFF@122</span>&#8220;, &#8220;%*[^/]/%[^@]&#8220;, buf);</p>
<p>printf(&#8220;%s\n&#8221;, buf);</p>
<p><span style="font-family: Times New Roman;"> </span></p>
<p>结果为：<span style="font-family: Times New Roman;">12DDWDFF</span></td>
</tr>
</tbody>
</table>
<p>7、给定一个字符串“<span style="font-family: Times New Roman;">“hello, world</span>”，仅保留world。（注意：“，”之后有一空格）</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="568" valign="top"><span style="font-family: Times New Roman;">sscanf(“hello, world”,  &#8221;%*s %s&#8221;,  buf); </span></p>
<p>printf(&#8220;%s\n&#8221;, buf);</p>
<p><span style="font-family: Times New Roman;"> </span></p>
<p>结果为：<span style="font-family: Times New Roman;">world</span></p>
<p><span style="font-family: Times New Roman;"> </span></p>
<p><span style="font-family: Times New Roman;">%*s</span>表示第一个匹配到的<span style="font-family: Times New Roman;">%s</span>被过滤掉，即<span style="font-family: Times New Roman;">hello</span>被过滤了</p>
<p><span style="font-family: Times New Roman;"> </span></p>
<p>如果没有空格则结果为<span style="font-family: Times New Roman;">NULL</span>。</td>
</tr>
</tbody>
</table>
<div>
<p>sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式.</p>
<p>下面示例显示如何使用 sscanf() C 运行时库函数来读取内部缓冲区分隔带有逗号 (,) 字段。 密钥是用于格式是 sscanf() 函数中括号。 格式将是 % ['、'] 它告诉函数以从缓冲区读取， 直到到达逗号 (,) ^,。</p>
<p><strong>示例代码</strong></p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/* The following sample illustrates the use of brackets and the
caret (^) with sscanf().
Compile options needed: none
*/</span>
<span style="color: #339933;">#include &lt;math.h&gt;</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #993333;">char</span> <span style="color: #339933;">*</span>tokenstring <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;first,25.5,second,15&quot;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> result<span style="color: #339933;">,</span> i<span style="color: #339933;">;</span>
<span style="color: #993333;">double</span> fp<span style="color: #339933;">;</span>
<span style="color: #993333;">char</span> o<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> f<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> s<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> t<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
result <span style="color: #339933;">=</span> sscanf<span style="color: #009900;">&#40;</span>tokenstring<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%[^','],%[^','],%[^','],%s&quot;</span><span style="color: #339933;">,</span> o<span style="color: #339933;">,</span> s<span style="color: #339933;">,</span> t<span style="color: #339933;">,</span> f<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
fp <span style="color: #339933;">=</span> atof<span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
i  <span style="color: #339933;">=</span> atoi<span style="color: #009900;">&#40;</span>f<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span> %lf<span style="color: #000099; font-weight: bold;">\n</span> %s<span style="color: #000099; font-weight: bold;">\n</span> %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> o<span style="color: #339933;">,</span> fp<span style="color: #339933;">,</span> t<span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<pre>有一些小体会：
对于sscanf的格式化串，规律为
1.%前面的字符为跳过的字符，如果要跳过多个字符，应全部放在%之前；
2.^为读取的字符串，后面所跟字符为截至字符；
3.^须用[]括起，所以一定要核对[]符号的数量</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1112/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gdb调试程序之调试宏的方法[六]</title>
		<link>http://yaronspace.cn/blog/archives/1110</link>
		<comments>http://yaronspace.cn/blog/archives/1110#comments</comments>
		<pubDate>Thu, 17 Feb 2011 09:52:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[macro]]></category>
		<category><![CDATA[宏的调试]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1110</guid>
		<description><![CDATA[在GCC编译程序的时候，加上-ggdb3参数，这样，你就可以调试宏了。 另外，你可以使用下述的GDB的宏调试命令 来查看相关的宏。 info macro_name – 查看这个宏在哪些文件里被引用了，以及宏定义是什么样的。 macro_name –       查看宏展开的样子。]]></description>
			<content:encoded><![CDATA[<p>在GCC编译程序的时候，加上<strong>-ggdb3</strong>参数，这样，你就可以调试宏了。</p>
<p>另外，你可以使用下述的GDB的宏调试命令 来查看相关的宏。</p>
<ul>
<li>info macro_name – 查看这个宏在哪些文件里被引用了，以及宏定义是什么样的。</li>
<li>macro_name –       查看宏展开的样子。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1110/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>KVM可扩展性测试报告</title>
		<link>http://yaronspace.cn/blog/archives/1102</link>
		<comments>http://yaronspace.cn/blog/archives/1102#comments</comments>
		<pubDate>Wed, 16 Feb 2011 09:21:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[虚拟化技术KVM]]></category>
		<category><![CDATA[kvm]]></category>
		<category><![CDATA[扩展性]]></category>
		<category><![CDATA[测试报告]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1102</guid>
		<description><![CDATA[KVM可扩展性测试报告 by yaonli(http://www.yaronspace.cn/blog) 测试设计 对KVM虚拟机可扩展性测试，主要是指随着虚拟机的数量的增加，虚拟机的在CPU利用率、内存使用、磁盘IO和网络IO的性能是否表现良好，最后能够给出在物理机一定硬件条件下，可运行的虚拟机的数目的最佳指标。 在具体的设计方案上，在物理机上分别启动1到16个虚拟机，然后从CPU利用率、磁盘IO和网络IO三个方面进行分析，这里需要说明下没有测试内存使用的情况的原因：针对KVM来说，分配给虚拟机的内存大小是事先指定，加入分配512M内存，则虚拟机的物理内存就是512M内存，分析意义不大； 1，  CPU利用率测试上 在测试虚拟机CPU利用率方面，主要是CPU密集型的软件进行测试，计算最终的执行时间；例如内核的编译或者bzip2对大文件进行压缩，都是CPU计算性。本次测试选用bzip2 对1.8G的镜像文件进行压缩，计算最终的执行时间。 date+%s.%N &#38;&#38; bzip2 –9 windows_2003_server.img &#38;&#38; date +%s.%N 2，  磁盘IO测试 测试磁盘IO的话，我选择用的是Bonnie++ 软件，并发地从虚拟机1台到16台的进行测试，执行命令如下： ./bonnie++ -d ~/test –s 1000 3，  网络IO测试 鉴于如果使用网卡类型如rtl8139或者e1000，效率非常低，所以本次测试网卡类型都是基于virtio网卡类型，然后并发地从物理机到1到16台虚拟机进行并发通信，主要是利用nertperf软件进行测试. 测试环境 物理主机硬件配置 1，  8核Intel(R) Xeon(R) CPU           E5410  @ 2.33GHz 2，  16G内存 3，  1.4T硬盘 4，  千兆以太网卡 物理主机的软件配置 1，64Bit CentOS 5.3  2.6.18-128.el5 2，kvm-88 虚拟机分配的硬件配置 1，  单核CPU 2， ]]></description>
			<content:encoded><![CDATA[<h2 style="text-align: center;"><strong>KVM</strong><strong>可扩展性测试报告</strong></h2>
<p style="text-align: right;">by yaonli(http://www.yaronspace.cn/blog)</p>
<h2><strong>测试设计</strong></h2>
<p>对KVM虚拟机可扩展性测试，主要是指随着虚拟机的数量的增加，虚拟机的在CPU利用率、内存使用、磁盘IO和网络IO的性能是否表现良好，最后能够给出在物理机一定硬件条件下，可运行的虚拟机的数目的最佳指标。</p>
<p>在具体的设计方案上，在物理机上分别启动1到16个虚拟机，然后从CPU利用率、磁盘IO和网络IO三个方面进行分析，这里需要说明下没有测试内存使用的情况的原因：针对KVM来说，分配给虚拟机的内存大小是事先指定，加入分配512M内存，则虚拟机的物理内存就是512M内存，分析意义不大；</p>
<p>1，  CPU利用率测试上</p>
<p>在测试虚拟机CPU利用率方面，主要是CPU密集型的软件进行测试，计算最终的执行时间；例如内核的编译或者bzip2对大文件进行压缩，都是CPU计算性。本次测试选用bzip2 对1.8G的镜像文件进行压缩，计算最终的执行时间。</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="516" valign="top">date+%s.%N   &amp;&amp; bzip2 –9 windows_2003_server.img &amp;&amp; date +%s.%N</td>
</tr>
</tbody>
</table>
<p>2，  磁盘IO测试</p>
<p>测试磁盘IO的话，我选择用的是Bonnie++ 软件，并发地从虚拟机1台到16台的进行测试，执行命令如下：</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="568" valign="top">./bonnie++ -d ~/test –s 1000</td>
</tr>
</tbody>
</table>
<p>3，  网络IO测试</p>
<p>鉴于如果使用网卡类型如rtl8139或者e1000，效率非常低，所以本次测试网卡类型都是基于virtio网卡类型，然后并发地从物理机到1到16台虚拟机进行并发通信，主要是利用nertperf软件进行测试.</p>
<h2><strong>测试环境</strong></h2>
<p>物理主机硬件配置</p>
<p>1，  8核Intel(R) Xeon(R) CPU           E5410  @ 2.33GHz</p>
<p>2，  16G内存</p>
<p>3，  1.4T硬盘</p>
<p>4，  千兆以太网卡</p>
<p>物理主机的软件配置</p>
<p>1，64Bit CentOS 5.3  2.6.18-128.el5</p>
<p>2，kvm-88</p>
<p>虚拟机分配的硬件配置</p>
<p>1，  单核CPU</p>
<p>2，  512M内存</p>
<p>3，  Virtio 网卡</p>
<p>4，  qcow2 format 增量镜像</p>
<p>虚拟机的软件配置</p>
<p>1，8.04 ubuntu系统</p>
<h2><span id="more-1102"></span></h2>
<h2><strong>测试数据</strong></h2>
<p><strong>1， </strong><strong>CPU</strong><strong>执行时间</strong></p>
<p><strong><a href="http://www.yaronspace.cn/blog/wp-content/uploads/2011/02/1.png"><img class="alignnone size-medium wp-image-1103" title="1" src="http://www.yaronspace.cn/blog/wp-content/uploads/2011/02/1-300x196.png" alt="" width="300" height="196" /></a></strong></p>
<p>上面这图例说明，随着虚拟机数目的增加，CPU执行时间在5-9虚拟机时呈现一种稳定的状态，但是当虚拟机达到10个时，CPU执行时间呈现较大的增长，然后在10-12个虚拟机时呈现稳定装填，当虚拟机数目到达13以上，CPU时间呈增长趋势。</p>
<p><a href="http://www.yaronspace.cn/blog/wp-content/uploads/2011/02/2.png"><img class="alignnone size-medium wp-image-1104" title="2" src="http://www.yaronspace.cn/blog/wp-content/uploads/2011/02/2-300x186.png" alt="" width="300" height="186" /></a></p>
<p><a href="http://www.yaronspace.cn/blog/wp-content/uploads/2011/02/3.png"><img class="alignnone size-medium wp-image-1105" title="3" src="http://www.yaronspace.cn/blog/wp-content/uploads/2011/02/3-300x158.png" alt="" width="300" height="158" /></a></p>
<p>第一个这个图例说明，在虚拟机的数目达到8个时，执行bzip命令的时间基本上是相同的，也就是说在CPU调度方面达到了均衡，平均分配CPU时间；但是在虚拟机的数目达到9个时，每个虚拟机的CPU执行时间出现了波动，有的执行的时间长，有的执行时间短，CPU没有达到调度平衡。</p>
<p><strong>2</strong><strong>，网络</strong><strong>IO</strong><strong>数据</strong></p>
<p><strong><a href="http://www.yaronspace.cn/blog/wp-content/uploads/2011/02/4.png"><img class="alignnone size-medium wp-image-1106" title="4" src="http://www.yaronspace.cn/blog/wp-content/uploads/2011/02/4-300x179.png" alt="" width="300" height="179" /></a></strong></p>
<p>由实验数据可知，使用virtio技术，虚拟机的网络吞吐，随着虚拟机数量的增加，实际网络IO基本达到理想的网络IO的水平，即如果物理网卡是千兆网卡，虚拟机的网络IO吞吐为100M/n，n代表同一台物理机上虚拟机的数量.</p>
<p><strong>3</strong><strong>，磁盘</strong><strong>IO</strong><strong>数据</strong></p>
<p><strong><a href="http://www.yaronspace.cn/blog/wp-content/uploads/2011/02/5.png"><img class="alignnone size-medium wp-image-1107" title="5" src="http://www.yaronspace.cn/blog/wp-content/uploads/2011/02/5-300x180.png" alt="" width="300" height="180" /></a></strong></p>
<p><strong><a href="http://www.yaronspace.cn/blog/wp-content/uploads/2011/02/6.png"><img class="alignnone size-medium wp-image-1108" title="6" src="http://www.yaronspace.cn/blog/wp-content/uploads/2011/02/6-300x177.png" alt="" width="300" height="177" /></a></strong></p>
<p>上面两个图分别代表对虚拟机进行磁盘的Block Read Write操作的结果，由图可知，磁盘的并发写操作的效率随着虚拟机数目的增加下降的快，而并发读操作下降的不是很明显，当虚拟机的数目达到10时，磁盘的并发读操作急剧下降，可以作为分隔点 (Bonnie++ 软件把字符和块测试放到一起，这里我只列出了block读写的数据，测试数据是否准确有待进一步验证)。</p>
<h2><strong>结论</strong></h2>
<p>通过对虚拟机的CPU执行时间、网络IO和磁盘IO的测试，在现有硬件条件支持下，KVM虚拟机的数量在维持在8-10个是较稳定的状态，各个虚拟机的衡量指标达到比较稳定的值。</p>
<p>在这种物理主机硬件配置条件下</p>
<p>1，  8核Intel(R) Xeon(R) CPU           E5410  @ 2.33GHz</p>
<p>2，  16G内存</p>
<p>3，  1.4T硬盘</p>
<p>4，  千兆以太网卡</p>
<p>建议KVM虚拟机的配置:</p>
<p>1，  单核CPU  （多核性能未测试）</p>
<p>2，  1G内存   （物理内存完全可以满足需求，所有可以开的大一些）</p>
<p>3，  百兆网卡 virtio</p>
<p>单台物理机启动虚拟机的数目在8-10左右，建议为8个虚拟机</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1102/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux监控程序-程序自动重启方法</title>
		<link>http://yaronspace.cn/blog/archives/1095</link>
		<comments>http://yaronspace.cn/blog/archives/1095#comments</comments>
		<pubDate>Mon, 24 Jan 2011 03:11:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[LAMP与网站架构]]></category>
		<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[exec]]></category>
		<category><![CDATA[fork]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[wait]]></category>
		<category><![CDATA[不间断重启]]></category>
		<category><![CDATA[自动重启]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1095</guid>
		<description><![CDATA[大家在写server的时候，不管server写的是多么健壮，还是经常出现core dump等程序异常退出的，但是一般情况下需要在无人为干预情况下，能够自动重新启动，保证server程序能够服务用户。这时就需要一个监控程序来实现能够让程序自动重新启动，现在笔者在写portmap就遇到了这个问题，通过网上查找资料，找到了一个相对靠谱的exec+fork解决方法。 使用脚本实现自动重启 首先想到的最简单的使用shell脚本，大概思路： ps -ef &#124; grep &#8220;$1&#8243; &#124; grep -v &#8220;grep&#8221; &#124; wc –l 是获取 $1 （$1 代表进程的名字）的进程数，脚本根据进程数来决定下一步的操作。通过一个死循环，每隔 1 秒检查一次系统中的指定程序的进程数，这里也可使用crontab来实现。 这种方法比较土，还是可以基本解决问题，但是有1s的延迟，笔者在应用中未采用这种方法，有关这个shell脚本，请参看文章后面的附件代码。 exec+fork方式 笔者最终采用的exec+fork方式来实现的，具体思想如下： 1，exec函数把当前进程替换为一个新的进程，新进程由path或file参数指定。可以使用exec函数将程序的执行从一个程序切换到另一个程序； 2，fork函数是创建一个新的进程，在进程表中创建一个新的表项，而创建者（即父进程）按原来的流程继续执行，子进程执行自己的控制流程； 3，wait 当fork启动一个子进程时，子进程就有了它自己的生命周期并将独立运行，我们可以在父进程中调用wait函数让父进程等待子进程的结束； 相信介绍到这里，读者已经能够想到解决方法了：1)首先使用fork系统调用，创建子进程，2)在子进程中使用exec函数，执行需要自动重启的程序，3) 在父进程中执行wait等待子进程的结束，然后重新创建一个新的子进程。 使用方法： BASH CODE#./portmap 需要监控的程序的路径 #args portmap 需要的参数 $ ./supervisor ./portmap args..... 代码如下： C CODE/** * * supervisor * * author: liyangguang (liyangguang@software.ict.ac.cn) * *]]></description>
			<content:encoded><![CDATA[<p>大家在写server的时候，不管server写的是多么健壮，还是经常出现core dump等程序异常退出的，但是一般情况下需要在无人为干预情况下，能够自动重新启动，保证server程序能够服务用户。这时就需要一个监控程序来实现能够让程序自动重新启动，现在笔者在写<a href="http://www.yaronspace.cn/blog/?s=portmap">portmap</a>就遇到了这个问题，通过网上查找资料，找到了一个相对靠谱的exec+fork解决方法。</p>
<h2><strong>使用脚本实现自动重启</strong></h2>
<p>首先想到的最简单的使用shell脚本，大概思路：</p>
<p>ps -ef | grep &#8220;$1&#8243; | grep -v &#8220;grep&#8221; | wc –l 是获取 $1 （$1 代表进程的名字）的进程数，脚本根据进程数来决定下一步的操作。通过一个死循环，每隔 1 秒检查一次系统中的指定程序的进程数，这里也可使用crontab来实现。</p>
<p>这种方法比较土，还是可以基本解决问题，但是有1s的延迟，笔者在应用中未采用这种方法，有关这个shell脚本，请参看文章后面的附件代码。</p>
<h2><strong>exec+fork方式</strong></h2>
<p>笔者最终采用的exec+fork方式来实现的，具体思想如下：</p>
<p>1，exec函数把当前进程替换为一个新的进程，新进程由path或file参数指定。可以使用exec函数将程序的执行从一个程序切换到另一个程序；</p>
<p>2，fork函数是创建一个新的进程，在进程表中创建一个新的表项，而创建者（即父进程）按原来的流程继续执行，子进程执行自己的控制流程；</p>
<p>3，wait 当fork启动一个子进程时，子进程就有了它自己的生命周期并将独立运行，我们可以在父进程中调用wait函数让父进程等待子进程的结束；</p>
<p>相信介绍到这里，读者已经能够想到解决方法了：1)首先使用fork系统调用，创建子进程，2)在子进程中使用exec函数，执行需要自动重启的程序，3) 在父进程中执行wait等待子进程的结束，然后重新创建一个新的子进程。</p>
<h2><span id="more-1095"></span></h2>
<p>使用方法：</p>

<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#./portmap 需要监控的程序的路径</span>
<span style="color: #666666; font-style: italic;">#args portmap 需要的参数</span>
$ .<span style="color: #000000; font-weight: bold;">/</span>supervisor .<span style="color: #000000; font-weight: bold;">/</span>portmap  args.....</pre></div></div>

<p>代码如下：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/**
 *
 * supervisor 
 *
 * author: liyangguang (liyangguang@software.ict.ac.cn)
 *
 * date: 2011-01-21 21:04:01
 *
 * changes
 * 1, execl to execv
 */</span>
&nbsp;
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;unistd.h&gt;</span>
<span style="color: #339933;">#include &lt;errno.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
<span style="color: #339933;">#include &lt;sys/types.h&gt;</span>
<span style="color: #339933;">#include &lt;sys/wait.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span>
main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> ret<span style="color: #339933;">,</span> i<span style="color: #339933;">,</span> status<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>child_argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">100</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    pid_t pid<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>argc <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        fprintf<span style="color: #009900;">&#40;</span>stderr<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Usage:%s &lt;exe_path&gt; &lt;args...&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> argc<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        child_argv<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span>strlen<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        strncpy<span style="color: #009900;">&#40;</span>child_argv<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> argv<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> strlen<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        child_argv<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>strlen<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
        pid <span style="color: #339933;">=</span> fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>pid <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            fprintf<span style="color: #009900;">&#40;</span>stderr<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;fork() error.errno:%d error:%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> errno<span style="color: #339933;">,</span> strerror<span style="color: #009900;">&#40;</span>errno<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>pid <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            ret <span style="color: #339933;">=</span> execv<span style="color: #009900;">&#40;</span>child_argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">**</span><span style="color: #009900;">&#41;</span>child_argv<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #666666; font-style: italic;">//ret = execl(child_argv[0], &quot;portmap&quot;, NULL, 0);</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>ret <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                fprintf<span style="color: #009900;">&#40;</span>stderr<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;execv ret:%d errno:%d error:%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> ret<span style="color: #339933;">,</span> errno<span style="color: #339933;">,</span> strerror<span style="color: #009900;">&#40;</span>errno<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>pid <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            pid <span style="color: #339933;">=</span> wait<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>status<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            fprintf<span style="color: #009900;">&#40;</span>stdout<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;wait return&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>shell脚本方式的代码如下：</p>

<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># 函数: CheckProcess</span>
<span style="color: #666666; font-style: italic;"># 功能: 检查一个进程是否存在</span>
<span style="color: #666666; font-style: italic;"># 参数: $1 --- 要检查的进程名称</span>
<span style="color: #666666; font-style: italic;"># 返回: 如果存在返回0, 否则返回1.</span>
<span style="color: #666666; font-style: italic;">#------------------------------------------------------------------------------</span>
CheckProcess<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
  <span style="color: #666666; font-style: italic;"># 检查输入的参数是否有效</span>
  <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;$1&quot;</span> = <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>;
  <span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #7a0874; font-weight: bold;">return</span> <span style="color: #000000;">1</span>
  <span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">#$PROCESS_NUM获取指定进程名的数目，为1返回0，表示正常，不为1返回1，表示有错误，需要重新启动</span>
  <span style="color: #007800;">PROCESS_NUM</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">ps</span> <span style="color: #660033;">-ef</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">&quot;$1&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-v</span> <span style="color: #ff0000;">&quot;grep&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">wc</span> -l<span style="color: #000000; font-weight: bold;">`</span> 
  <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$PROCESS_NUM</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">1</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>;
  <span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #7a0874; font-weight: bold;">return</span> <span style="color: #000000;">0</span>
  <span style="color: #000000; font-weight: bold;">else</span>
    <span style="color: #7a0874; font-weight: bold;">return</span> <span style="color: #000000;">1</span>
  <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #666666; font-style: italic;"># 检查test实例是否已经存在</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000;">1</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> ; <span style="color: #000000; font-weight: bold;">do</span>
 CheckProcess <span style="color: #ff0000;">&quot;test&quot;</span>
 <span style="color: #007800;">CheckQQ_RET</span>=<span style="color: #007800;">$?</span>
 <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$CheckQQ_RET</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">1</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>;
 <span style="color: #000000; font-weight: bold;">then</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># 杀死所有test进程，可换任意你需要执行的操作</span>
&nbsp;
&nbsp;
  <span style="color: #c20cb9; font-weight: bold;">killall</span> <span style="color: #660033;">-9</span> <span style="color: #7a0874; font-weight: bold;">test</span>
  <span style="color: #7a0874; font-weight: bold;">exec</span> .<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">test</span> <span style="color: #000000; font-weight: bold;">&amp;</span>  
 <span style="color: #000000; font-weight: bold;">fi</span>
 <span style="color: #c20cb9; font-weight: bold;">sleep</span> <span style="color: #000000;">1</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1095/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>端口映射工具portmap 0.1版本发布</title>
		<link>http://yaronspace.cn/blog/archives/1080</link>
		<comments>http://yaronspace.cn/blog/archives/1080#comments</comments>
		<pubDate>Thu, 20 Jan 2011 09:28:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[epoll]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[portmap]]></category>
		<category><![CDATA[端口映射]]></category>
		<category><![CDATA[端口转发]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1080</guid>
		<description><![CDATA[项目地址：http://code.google.com/p/portmap/ 下载地址：http://portmap.googlecode.com/files/portmap-0.1.tar.gz 项目介绍： portmap 主要是作为各个机器间端口映射的工具 项目的最初目的是作为vnc端口映射，主要是将不同机器的vnc接口映射到一台能够对外的 物理机上，安全和方便管理； iptables可以实现端口映射，但是每次增加一个映射端口都需要重新启动，故自己动手完成了端口映射工具； 还有像80端口的映射，这个可以归总为反向代理，作为负载均衡器来使用，原理是相通，像nginx七层的负载均衡功能应该使用的就是端口映射，portmap暂时不支持哈~ 特点： * 使用epoll方式，支持高并发和长连接模式 * 多线程支持，线程个数可配置，主要作为工作线程 * 使用简单，只需发送待映射的端口到守护进程，守护进程会返回映射后的端口，即可使用 * TODO: * 配置文件单独提取出来 * bug修复 * 多机扩展？ Example: SHELL CODE$ make $ ./portmap  //启动进程 $ cd test    //修改test1.c中相关变量 C CODE //addr: portmap server的地址 //port: portmap server 的端口 //request:是需要映射的地址和端口 const char *addr = &#34;10.60.1.124&#34;; unsigned int port = 5903;]]></description>
			<content:encoded><![CDATA[<p>项目地址：<a href="http://code.google.com/p/portmap/">http://code.google.com/p/portmap/</a></p>
<p>下载地址：<a href="http://portmap.googlecode.com/files/portmap-0.1.tar.gz" target="_blank">http://portmap.googlecode.com/files/portmap-0.1.tar.gz</a></p>
<h2><strong>项目介绍：</strong></h2>
<p>portmap 主要是作为各个机器间端口映射的工具<br />
项目的最初目的是作为vnc端口映射，主要是将不同机器的vnc接口映射到一台能够对外的<br />
物理机上，安全和方便管理；<br />
iptables可以实现端口映射，但是每次增加一个映射端口都需要重新启动，故自己动手完成了端口映射工具；<br />
还有像80端口的映射，这个可以归总为反向代理，作为负载均衡器来使用，原理是相通，像nginx七层的负载均衡功能应该使用的就是端口映射，portmap暂时不支持哈~</p>
<p><a href="http://www.yaronspace.cn/blog/wp-content/uploads/2011/01/arch.png"><img class="alignnone size-medium wp-image-1087" title="arch" src="http://www.yaronspace.cn/blog/wp-content/uploads/2011/01/arch-300x257.png" alt="" width="300" height="257" /></a></p>
<h2><strong>特点：</strong></h2>
<p>* 使用epoll方式，支持高并发和长连接模式<br />
* 多线程支持，线程个数可配置，主要作为工作线程<br />
* 使用简单，只需发送待映射的端口到守护进程，守护进程会返回映射后的端口，即可使用<br />
*</p>
<h2><strong>TODO:</strong></h2>
<p>* 配置文件单独提取出来<br />
* bug修复<br />
* 多机扩展？</p>
<h2><strong>Example:</strong></h2>

<div class="wp_syntax"><div class="code_title">SHELL CODE</div><div class="code"><pre class="shell" style="font-family:monospace;">$ make
$ ./portmap  //启动进程
$ cd test    //修改test1.c中相关变量</pre></div></div>


<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;">   <span style="color: #666666; font-style: italic;">//addr: portmap server的地址</span>
  <span style="color: #666666; font-style: italic;">//port: portmap server 的端口</span>
  <span style="color: #666666; font-style: italic;">//request:是需要映射的地址和端口</span>
<span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>addr <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;10.60.1.124&quot;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> port <span style="color: #339933;">=</span> <span style="color: #0000dd;">5903</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>request <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;10.60.1.124:5905&quot;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code_title">BASH CODE</div><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> .<span style="color: #000000; font-weight: bold;">/</span>test1</pre></div></div>

<p>正常情况下，返回映射后的地址和端口</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1080/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gdb 调试多进程程序方法</title>
		<link>http://yaronspace.cn/blog/archives/1072</link>
		<comments>http://yaronspace.cn/blog/archives/1072#comments</comments>
		<pubDate>Wed, 12 Jan 2011 13:04:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[fork]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[子进程]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1072</guid>
		<description><![CDATA[今天在用gdb调试sheepdog时，在程序fork出子进程后，整个gdb程序就退出了，无法继续跟踪，网上找了半天找到了解决方法. 解决方法： 设置detach-on-fork参数 set detach-on-fork [on&#124;off] on: 断开调试follow-fork-mode指定的进程。 off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试，另一个进程置于暂停（suspended）状态 将detach-on-fork 设置为off即可 跟踪子进程的方法： 默认情况下，gdb会继续跟踪父亲进程，无法对子进程进行调试 设置follow-fork-mode可以解决这个问题 follow-fork-mode的用法为： set follow-fork-mode [parent&#124;child] parent: fork之后继续调试父进程，子进程不受影响。 child: fork之后调试子进程，父进程不受影响。 SHELL CODE(gdb) set follow-fork-mode child 本文地址：http://www.yaronspace.cn/blog/index.php/archives/1072]]></description>
			<content:encoded><![CDATA[<p>今天在用gdb调试sheepdog时，在程序fork出子进程后，整个gdb程序就退出了，无法继续跟踪，网上找了半天找到了解决方法.</p>
<p>解决方法：</p>
<p>设置detach-on-fork参数</p>
<p><code>set detach-on-fork [on|off]</code></p>
<ul>
<li>on: 断开调试follow-fork-mode指定的进程。</li>
<li>off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试，另一个进程置于暂停（suspended）状态</li>
</ul>
<p>将detach-on-fork 设置为off即可</p>
<p><strong>跟踪子进程的方法：</strong></p>
<p>默认情况下，gdb会继续跟踪父亲进程，无法对子进程进行调试</p>
<p>设置follow-fork-mode可以解决这个问题</p>
<p>follow-fork-mode的用法为：</p>
<p><code>set follow-fork-mode [parent|child]</code></p>
<ul>
<li>parent: fork之后继续调试父进程，子进程不受影响。</li>
<li>child: fork之后调试子进程，父进程不受影响。</li>
</ul>

<div class="wp_syntax"><div class="code_title">SHELL CODE</div><div class="code"><pre class="shell" style="font-family:monospace;">(gdb) set follow-fork-mode child</pre></div></div>

<p>本文地址：<a href="http://www.yaronspace.cn/blog/index.php/archives/1072" target="_blank">http://www.yaronspace.cn/blog/index.php/archives/1072</a></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1072/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>KVM分布式共享存储解决方案-sheepdog</title>
		<link>http://yaronspace.cn/blog/archives/1065</link>
		<comments>http://yaronspace.cn/blog/archives/1065#comments</comments>
		<pubDate>Mon, 10 Jan 2011 13:52:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[分布式数据存储]]></category>
		<category><![CDATA[虚拟化技术KVM]]></category>
		<category><![CDATA[DFS]]></category>
		<category><![CDATA[kvm]]></category>
		<category><![CDATA[sheepdog]]></category>
		<category><![CDATA[共享存储]]></category>
		<category><![CDATA[动态迁移]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1065</guid>
		<description><![CDATA[介绍 今天在调研分布式文件系统时，非常偶然的机会看到sheepdog ，然后接着又看到KVM这个关键字，让我异常兴奋，这不是我一直在找的KVM镜像存储的分布式存储系统吗，原来KVM/Qemu最近已经开始对其进行了开发，并在Qemu 0.13.0版本后加入了与sheepdog的支持，太佩服国外的开源贡献者。 sheepdog(牧羊犬) 官方网站：http://www.osrg.net/sheepdog/ Sheepdog is a distributed storage system for KVM. It provides highly available block level storage volumes that can be attached to KVM virtual machines. Sheepdog scales to several hundreds nodes, and supports advanced volume management features such as snapshot, cloning, and thin provisioning. 安装步骤 1，环境准备 corosync-1.3.0.tar.gz sheepdog-0.2.0.tar.gz 2，安装corosync corosync]]></description>
			<content:encoded><![CDATA[<h2><strong>介绍</strong></h2>
<p>今天在调研分布式文件系统时，非常偶然的机会看到sheepdog ，然后接着又看到<a title="kvm" href="http://www.yaronspace.cn/blog/?s=KVM" target="_blank">KVM</a>这个关键字，让我异常兴奋，这不是我一直在找的KVM镜像存储的分布式存储系统吗，原来KVM/Qemu最近已经开始对其进行了开发，并在Qemu 0.13.0版本后加入了与sheepdog的支持，太佩服国外的开源贡献者。</p>
<p>sheepdog(牧羊犬) 官方网站：<a title="sheepdog" href="http://www.osrg.net/sheepdog/" target="_blank">http://www.osrg.net/sheepdog/</a></p>
<p>Sheepdog is a distributed storage system for <a title="kvm" href="http://www.yaronspace.cn/blog/?s=KVM" target="_blank">KVM</a>. It provides highly available block level storage volumes that can be attached to KVM virtual machines. Sheepdog scales to several hundreds nodes, and supports advanced volume management features such as snapshot, cloning, and thin provisioning.</p>
<h2><strong>安装步骤</strong></h2>
<h3>1，环境准备</h3>
<p><a href="ftp://ftp:downloads@corosync.org/downloads/corosync-1.3.0/corosync-1.3.0.tar.gz" target="_blank">corosync-1.3.0.tar.gz</a> <a href="http://sourceforge.net/projects/sheepdog/files/sheepdog/0.2.0/sheepdog-0.2.0.tar.gz/download" target="_blank">sheepdog-0.2.0.tar.gz</a></p>
<h3>2，安装corosync</h3>
<p>corosync 是linux 集群管理的引擎，具体请参看<a href="http://www.corosync.org/doku.php?id=welcome" target="_blank">官网</a></p>

<div class="wp_syntax"><div class="code_title">SHELL CODE</div><div class="code"><pre class="shell" style="font-family:monospace;">$ tar -xzvf  corosync-1.3.0.tar.gz
$ cd corosync-1.3.0
$ ./autogen.sh
$ ./configure
$ sudo make install</pre></div></div>

<h3>3，qemu 0.13的安装 （略）</h3>
<h3>4，sheepdog安装</h3>

<div class="wp_syntax"><div class="code_title">SHELL CODE</div><div class="code"><pre class="shell" style="font-family:monospace;">$ tar -xzvf sheepdog-0.2.0.tar.gz
$ cd sheepdog-0.2.0
$ ./autogen.sh
$ ./configure
$ sudo make install</pre></div></div>

<p>这时可能会出现linux/signalfd.h  这个文件找不到，以及后续会出现signalfd undefined reference 的错误，我的系统是CentOS ，出现了这种错误，出现这种情况的话，我简单的解决方法是对signalfd进行模拟，这点我参考了qemu的有关实现，<br />
具体是在sheep/work.c中加入以下代码：<br />
代码太长，我贴到最后了，请参看附件</p>
<h3>5，sheepdog的具体使用</h3>
<p>1&gt; 配置/etc/corosync/corosync.conf<br />
mv /etc/corosync/corosync.conf.example   /etc/corosync/corosync.conf<br />
同时修改，bindnetaddr字段为自己的ip地址，mcastaddr（怎么修改暂时不清楚，应该是广播的地址，保持默认值即可）<br />
2&gt; 启动corosync<br />
# corosync {注：需要是root账户}<br />
3&gt; 如果是ext3文件系统，需要加入user_xattr</p>

<div class="wp_syntax"><div class="code_title">SHELL CODE</div><div class="code"><pre class="shell" style="font-family:monospace;">     mount -o remount,user_xattr /</pre></div></div>

<p>4&gt; 启动Sheep</p>

<div class="wp_syntax"><div class="code_title">SHELL CODE</div><div class="code"><pre class="shell" style="font-family:monospace;">      # sheep ~/store_dir  &lt;span style=&quot;color: #ff6600;&quot;&gt;#不能是相对路径，相对路径会出错&lt;/span&gt;
      # collie cluster format --copies=3</pre></div></div>

<p>5&gt; 查看状态</p>

<div class="wp_syntax"><div class="code_title">SHELL CODE</div><div class="code"><pre class="shell" style="font-family:monospace;">      # collie node list
      # collie cluster info
      # colli vdi list</pre></div></div>

<p>6&gt; 创建镜像</p>

<div class="wp_syntax"><div class="code_title">SHELL CODE</div><div class="code"><pre class="shell" style="font-family:monospace;">        # qemu-img create sheepdog:Alice 256G
        # qemu-img convert ~/amd64.raw sheepdog:Bob</pre></div></div>

<p>不过我在Convert时一直提示不成功，<span style="color: #ff0000;">error while writing</span><br />
查找原因：通过查看sheep.log日志文件，可以发现时由于Too Many open files 错误提示，原来是打开太多文件所造成的，因为sheepdog对文件进行4M进行分片的，这样会导致大量的文件打开，而一般的系统进程最多的文件数是1024 所以就这个错误！<br />
解决方法：ulimit -n 4096 {或者更大的值} 这样修改只是在目前会话中有效，需要长久生效，请参看<a href="http://hi.baidu.com/ajin111/blog/item/7754e1620a8373d3e6113a3f.html">这篇文章</a></p>
<h2><strong>总结</strong></h2>
<p>sheepdog作为一个新的项目，感觉还是挺不错的，刚好弥补了开源虚拟化中有关镜像存储的问题，为后续的虚拟机迁移做准备，目前sheepdog暂时还未支持migrate ，不过看它的TODO LIST 下一步已经开始做了，系统能够尽快做出来，下一步主要是看下它的源码，因为很多地方会出现诡异的错误的，还需要解决呀！</p>
<p><span id="more-1065"></span>本文地址：<a href="http://www.yaronspace.cn/blog/index.php/archives/1065" target="_blank">http://www.yaronspace.cn/blog/index.php/archives/1065</a></p>
<p>附件代码：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#ifndef  _SIGNALFD</span>
<span style="color: #339933;">#include</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">/*
 *  include/linux/signalfd.h
 *
 *  Copyright (C) 2007  Davide Libenzi
 *
 */</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* For O_CLOEXEC and O_NONBLOCK */</span>
<span style="color: #339933;">#include</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">/* Flags for signalfd4.  */</span>
<span style="color: #339933;">#define SFD_CLOEXEC O_CLOEXEC</span>
<span style="color: #339933;">#define SFD_NONBLOCK O_NONBLOCK</span>
&nbsp;
<span style="color: #993333;">struct</span> signalfd_siginfo <span style="color: #009900;">&#123;</span>
        __u32 ssi_signo<span style="color: #339933;">;</span>
        __s32 ssi_errno<span style="color: #339933;">;</span>
        __s32 ssi_code<span style="color: #339933;">;</span>
        __u32 ssi_pid<span style="color: #339933;">;</span>
        __u32 ssi_uid<span style="color: #339933;">;</span>
        __s32 ssi_fd<span style="color: #339933;">;</span>
        __u32 ssi_tid<span style="color: #339933;">;</span>
        __u32 ssi_band<span style="color: #339933;">;</span>
        __u32 ssi_overrun<span style="color: #339933;">;</span>
        __u32 ssi_trapno<span style="color: #339933;">;</span>
        __s32 ssi_status<span style="color: #339933;">;</span>
        __s32 ssi_int<span style="color: #339933;">;</span>
        __u64 ssi_ptr<span style="color: #339933;">;</span>
        __u64 ssi_utime<span style="color: #339933;">;</span>
        __u64 ssi_stime<span style="color: #339933;">;</span>
        __u64 ssi_addr<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;">/*
         * Pad strcture to 128 bytes. Remember to update the
         * pad size when you add new members. We use a fixed
         * size structure to avoid compatibility problems with
         * future versions, and we leave extra space for additional
         * members. We use fixed size members because this strcture
         * comes out of a read(2) and we really don't want to have
         * a compat on read(2).
         */</span>
        __u8 __pad<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">48</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span> qemu_set_cloexec<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> fd<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> f<span style="color: #339933;">;</span>
    f <span style="color: #339933;">=</span> fcntl<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span> F_GETFD<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    fcntl<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span> F_SETFD<span style="color: #339933;">,</span> f <span style="color: #339933;">|</span> FD_CLOEXEC<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #993333;">struct</span> sigfd_compat_info
<span style="color: #009900;">&#123;</span>
    sigset_t mask<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> fd<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>sigwait_compat<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>opaque<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">struct</span> sigfd_compat_info <span style="color: #339933;">*</span>info <span style="color: #339933;">=</span> opaque<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> err<span style="color: #339933;">;</span>
    sigset_t all<span style="color: #339933;">;</span>
&nbsp;
    sigfillset<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>all<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    sigprocmask<span style="color: #009900;">&#40;</span>SIG_BLOCK<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>all<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">do</span> <span style="color: #009900;">&#123;</span>
        siginfo_t siginfo<span style="color: #339933;">;</span>
&nbsp;
        err <span style="color: #339933;">=</span> sigwaitinfo<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>info<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>mask<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>siginfo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>err <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> errno <span style="color: #339933;">==</span> EINTR<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            err <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>err <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #993333;">char</span> buffer<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">128</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            size_t offset <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
            memcpy<span style="color: #009900;">&#40;</span>buffer<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>err<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>err<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>offset <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>buffer<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                ssize_t len<span style="color: #339933;">;</span>
&nbsp;
                len <span style="color: #339933;">=</span> write<span style="color: #009900;">&#40;</span>info<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>fd<span style="color: #339933;">,</span> buffer <span style="color: #339933;">+</span> offset<span style="color: #339933;">,</span>
                            <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>buffer<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> offset<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>len <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> errno <span style="color: #339933;">==</span> EINTR<span style="color: #009900;">&#41;</span>
                    <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>len <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    err <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
                    <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
&nbsp;
                offset <span style="color: #339933;">+=</span> len<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>err <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> NULL<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">int</span> qemu_signalfd_compat<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> sigset_t <span style="color: #339933;">*</span>mask<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    pthread_attr_t attr<span style="color: #339933;">;</span>
    pthread_t tid<span style="color: #339933;">;</span>
    <span style="color: #993333;">struct</span> sigfd_compat_info <span style="color: #339933;">*</span>info<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> fds<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
    info <span style="color: #339933;">=</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>info<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>info <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        errno <span style="color: #339933;">=</span> ENOMEM<span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>pipe<span style="color: #009900;">&#40;</span>fds<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        free<span style="color: #009900;">&#40;</span>info<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    qemu_set_cloexec<span style="color: #009900;">&#40;</span>fds<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    qemu_set_cloexec<span style="color: #009900;">&#40;</span>fds<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    memcpy<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>info<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>mask<span style="color: #339933;">,</span> mask<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>mask<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    info<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>fd <span style="color: #339933;">=</span> fds<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
    pthread_attr_init<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>attr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    pthread_attr_setdetachstate<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>attr<span style="color: #339933;">,</span> PTHREAD_CREATE_DETACHED<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    pthread_create<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>tid<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>attr<span style="color: #339933;">,</span> sigwait_compat<span style="color: #339933;">,</span> info<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    pthread_attr_destroy<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>attr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> fds<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #339933;">#endif</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1065/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>KVM虚拟机在物理机间的迁移方法</title>
		<link>http://yaronspace.cn/blog/archives/1057</link>
		<comments>http://yaronspace.cn/blog/archives/1057#comments</comments>
		<pubDate>Wed, 05 Jan 2011 06:00:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[分布式数据存储]]></category>
		<category><![CDATA[虚拟化技术KVM]]></category>
		<category><![CDATA[kvm]]></category>
		<category><![CDATA[migrate]]></category>
		<category><![CDATA[动态迁移]]></category>
		<category><![CDATA[虚拟机迁移]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1057</guid>
		<description><![CDATA[有关虚拟机间的动态迁移，我在虚拟机迁移技术漫谈 对它进行大概的介绍，现在结合今天我自身的实践，来具体解释下迁移的步骤； 1，环境准备 1) 共享存储-NFS: 理论上来说，需要迁移的虚拟机可以不适用共享存储，但是如果不用共享存储的话，在迁移的过程中就需要对镜像进行大量的拷贝，这个是非常耗时的，而且在大量的集群的情况下，基本上镜像都是存放在分布式的共享存储中，一是方便管理，一是为虚拟机的动态迁移做准备，有关NFS的使用和挂载，请参看我的另外一篇文章 CentOS配置NFS服务器的方法 2) 支持kvm迁移的qemu-kvm 和 kvm模块：我用的是最新的qemu-kvm-0.13.0.tar.gz ，而kvm模块，由于我的系统的内核版本过低，用的kvm-88中的kvm-intel.ko kvm.ko模块 2，启动kvm虚拟机 在下面的介绍中使用 源虚拟机是待迁移的虚拟机，目的虚拟机是迁移后的虚拟机 源主机的启动命令如下： SHELL CODE ./qemu-system-x86_64 -m 512 -hda /home/yangguang/nfs_mnt/images/debian_lenny_i386_small.qcow2 -net tap -net nic,model=rtl8139 -vnc :1 -monitor stdio #解释说明： 1, /home/yangguang/nfs_mnt: 代表NFS挂载的目录 2, -monitor stdio 将控制台定向的标准输入输出(这个是虚拟机迁移必须的，因为后续需要在命令行中进行操作) 目的虚拟机的启动命令： SHELL CODE ./qemu-system-x86_64 -m 512 -hda /home/yangguang/nfs_mnt/images/debian_lenny_i386_small.qcow2 -net tap -net nic,model=rtl8139 -vnc :1 -monitor]]></description>
			<content:encoded><![CDATA[<p>有关虚拟机间的动态迁移，我在<a href="http://www.yaronspace.cn/blog/index.php/archives/926" target="_blank">虚拟机迁移技术漫谈</a> 对它进行大概的介绍，现在结合今天我自身的实践，来具体解释下迁移的步骤；</p>
<h2><strong>1，环境准备</strong></h2>
<p>1) 共享存储-NFS: 理论上来说，需要迁移的虚拟机可以不适用共享存储，但是如果不用共享存储的话，在迁移的过程中就需要对镜像进行大量的拷贝，这个是非常耗时的，而且在大量的集群的情况下，基本上镜像都是存放在分布式的共享存储中，一是方便管理，一是为虚拟机的动态迁移做准备，有关NFS的使用和挂载，请参看我的另外一篇文章<br />
<a title="永久链接: CentOS配置NFS服务器的方法" rel="bookmark" href="http://www.yaronspace.cn/blog/index.php/archives/1051">CentOS配置NFS服务器的方法</a><br />
2) 支持kvm迁移的qemu-kvm 和 kvm模块：我用的是最新的qemu-kvm-0.13.0.tar.gz ，而kvm模块，由于我的系统的内核版本过低，用的kvm-88中的kvm-intel.ko kvm.ko模块</p>
<h2><strong>2，启动kvm虚拟机</strong></h2>
<p>在下面的介绍中使用 源虚拟机是待迁移的虚拟机，目的虚拟机是迁移后的虚拟机<br />
源主机的启动命令如下：</p>

<div class="wp_syntax"><div class="code_title">SHELL CODE</div><div class="code"><pre class="shell" style="font-family:monospace;">   ./qemu-system-x86_64 -m 512 -hda /home/yangguang/nfs_mnt/images/debian_lenny_i386_small.qcow2 -net tap -net nic,model=rtl8139 -vnc :1 -monitor stdio
    #解释说明：
     1,  /home/yangguang/nfs_mnt: 代表NFS挂载的目录
     2,  -monitor stdio  将控制台定向的标准输入输出(这个是虚拟机迁移必须的，因为后续需要在命令行中进行操作)</pre></div></div>

<p>目的虚拟机的启动命令：</p>

<div class="wp_syntax"><div class="code_title">SHELL CODE</div><div class="code"><pre class="shell" style="font-family:monospace;">    ./qemu-system-x86_64 -m 512 -hda /home/yangguang/nfs_mnt/images/debian_lenny_i386_small.qcow2 -net tap -net nic,model=rtl8139 -vnc :1 -monitor stdio -incoming tcp:0:8888
     #解释说明
     1,  启动命令参数必须和源虚拟机的启动参数是一样的，包括网卡类型等
     2,  -incoming tcp:0:8888 这个是在端口8888接收迁移命令和数据</pre></div></div>

<p>这时在命令行中输入</p>

<div class="wp_syntax"><div class="code_title">SHELL CODE</div><div class="code"><pre class="shell" style="font-family:monospace;">     info status</pre></div></div>

<p>源虚拟机显示的状态是running<br />
目的虚拟机的显示的状态时paused</p>
<h2><span id="more-1057"></span></h2>
<h2><strong>3，进行虚拟机迁移</strong></h2>
<p>在源虚拟机中的控制台中执行以下命令：</p>

<div class="wp_syntax"><div class="code_title">SHELL CODE</div><div class="code"><pre class="shell" style="font-family:monospace;">    (qemu) help migrate
migrate [-d] [-b] [-i] uri -- migrate to URI (using -d to not wait for completion)
                         -b for migration without shared storage with full copy of disk
                         -i for migration without shared storage with incremental copy of disk (base image shared between src and destination)
     (qemu) migrate   -d tcp:10.60.1.92:8888
      #info migrate  查看当前的迁移的执行状态
     (qemu) info migrate</pre></div></div>

<p>执行完成后，可以通过info status命令来看<br />
源虚拟机和目的虚拟机的状态<br />
这时源虚拟机的状态:paused<br />
目的虚拟机的状态:running<br />
此时迁移完成，源虚拟机就可以退出了(quit)<br />
同时可以在迁移期间，可以在另外一个主机上使用ping命令对迁移的主机进行联通性进行测试，看看虚拟机的中断时间<br />
长短。</p>
<h2><strong>4，总结</strong></h2>
<p>到此为止，有关虚拟机的迁移已经完成，但是要把KVM虚拟机的迁移应该到实际的环境中，还需要关注下虚拟机迁移过程虚拟机内部服务的中间时间，以及整个虚拟机迁移的时间；同时目前我比较关心的是分布式共享存储的解决方案，NFS肯定是不能解决问题的，不知大家有没有好的解决方案？</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1057/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>一年又一年</title>
		<link>http://yaronspace.cn/blog/archives/1054</link>
		<comments>http://yaronspace.cn/blog/archives/1054#comments</comments>
		<pubDate>Sun, 02 Jan 2011 14:48:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[生活感悟]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1054</guid>
		<description><![CDATA[今天已经是2011年，真的感觉时间过的好快呀，转眼的功夫一年又过去了，每个人都需要停下脚步，回过头看看这一年的得与失，真的需要好好总结下了。 看到我的去年的总结，还是有种很亲切的感觉，没事写写平时的感受其实还是挺好的，可惜总是贴一些技术的文章，个人的想法的东西去想的还是太少（可能是性格的因素的吧，不希望把一些比较内心的想法表达出来），这个其实真的还是蛮好的，争取2011年能够写一些。 简单的列下流水账吧，太有文采的文字也写不出来 1，今年开学直到九月份一直在百度实习，实习是瞒着老板偷偷地出去的，时间还是挺紧凑的，还得正常去实验室，只能利用上课的时间去公司，基本上研一下半年没有上过课，不过最后还好，课程都过了，呵呵！其实本来没有打算出去实习的，真的想好好利用研究生的时间搞搞科研，正像在Google面试那个工程师所说的那样，既然读了研究生，就应该做一些与正常本科毕业就工作的不一样的事情，如果研究生三年就是再外面实习三年，虽然最后也可能找到很好的工作，但肯定还不如直接工作三年来的更直接一些呢，所以研究生就应该做一些研究生应该做的一些事，比如读读paper、写写论文啥的等；但是我最后还是选择出去实习，主要原因是原来跟着老板做的东西不感兴趣，不能就这样荒废三年对吧，而且我觉得我不是能够主动去学习的那种，需要某种需求进行推动我，我才会去看它学习它的，所以就偷偷摸摸的在百度实习了将近半年。 总的来说，在百度这半年还是挺开心的，挺有收获的，主要参与了Baidu App Engine 项目主要开发工作，因为这个项目是比较新的项目，当时去的时候，加我一共三个人，能够接触比较多的东西，从前端到最后端，而且对整个架构也理解的比较清晰，后来陆续又来了两个同事，这项目在百度内部目前发展的比较好，有个比较有意思的小插曲：当时我将近实习结束，我的mentor居然劝我退学，放弃读硕士，直接工作，并且拿出自己当例子说事（他是硕士毕业，但是我们的项目老大是本科毕业，而且比他还低一届），可惜我最后还是乖乖的回所继续干活了，哈哈~最后还是感谢chuanying,xiaowei还有dongfei zhangyong这些同学的，从你们身上学到了很多！ 2，到九月份时，就乖乖的回实验室了，开始了我的正常的研究生生涯，到现在也将近三四个月了，做了一些东西，包括对KFS的改造，有关KVM虚拟机的学习等，这期间我居然开始修改内核代码了，这个是最难以置信的，不过还是太弱了，本科时学的体系结构和微机技术的知识基本上全忘没了，还得从头回忆，但是还真没觉得这个东西能够用到，但是看论文太少，自己的独立思考还太弱了。 3，生活上，十一的时候去了趟大城市铁岭，看望下丈母娘，话说这男女方如果不在同一个地方，真是比较麻烦，下次去不知道得等到啥时候，这结婚后就更纠结了，希望xiaofang同学看到不要有啥想法哦~ 同时也给超哥、猛哥和韬哥提醒一声，找对象尽量都找近一点哦 2011年的期望： 1，祝愿小邓同学早日实现她的梦想 2，好好干活与学习，明年找个好工作 3，希望lc lm zt (对号入座)不再寂寞不再mensao, 猛哥也越nb, 超哥和韬哥飞越成功，我和猛哥的儿子的前途就全靠你俩了 写了好多，我发现我也太能墨迹了，不写了，回去睡觉了]]></description>
			<content:encoded><![CDATA[<p>今天已经是2011年，真的感觉时间过的好快呀，转眼的功夫一年又过去了，每个人都需要停下脚步，回过头看看这一年的得与失，真的需要好好总结下了。<br />
看到我的<a href="http://www.yaronspace.cn/blog/index.php/archives/363">去年的总结</a>，还是有种很亲切的感觉，没事写写平时的感受其实还是挺好的，可惜总是贴一些技术的文章，个人的想法的东西去想的还是太少（可能是性格的因素的吧，不希望把一些比较内心的想法表达出来），这个其实真的还是蛮好的，争取2011年能够写一些。<br />
简单的列下流水账吧，太有文采的文字也写不出来<br />
1，今年开学直到九月份一直在百度实习，实习是瞒着老板偷偷地出去的，时间还是挺紧凑的，还得正常去实验室，只能利用上课的时间去公司，基本上研一下半年没有上过课，不过最后还好，课程都过了，呵呵！其实本来没有打算出去实习的，真的想好好利用研究生的时间搞搞科研，正像在Google面试那个工程师所说的那样，既然读了研究生，就应该做一些与正常本科毕业就工作的不一样的事情，如果研究生三年就是再外面实习三年，虽然最后也可能找到很好的工作，但肯定还不如直接工作三年来的更直接一些呢，所以研究生就应该做一些研究生应该做的一些事，比如读读paper、写写论文啥的等；但是我最后还是选择出去实习，主要原因是原来跟着老板做的东西不感兴趣，不能就这样荒废三年对吧，而且我觉得我不是能够主动去学习的那种，需要某种需求进行推动我，我才会去看它学习它的，所以就偷偷摸摸的在百度实习了将近半年。<br />
总的来说，在百度这半年还是挺开心的，挺有收获的，主要参与了Baidu App Engine 项目主要开发工作，因为这个项目是比较新的项目，当时去的时候，加我一共三个人，能够接触比较多的东西，从前端到最后端，而且对整个架构也理解的比较清晰，后来陆续又来了两个同事，这项目在百度内部目前发展的比较好，有个比较有意思的小插曲：当时我将近实习结束，我的mentor居然劝我退学，放弃读硕士，直接工作，并且拿出自己当例子说事（他是硕士毕业，但是我们的项目老大是本科毕业，而且比他还低一届），可惜我最后还是乖乖的回所继续干活了，哈哈~最后还是感谢chuanying,xiaowei还有dongfei zhangyong这些同学的，从你们身上学到了很多！<br />
2，到九月份时，就乖乖的回实验室了，开始了我的正常的研究生生涯，到现在也将近三四个月了，做了一些东西，包括对<a href="http://www.yaronspace.cn/blog/?s=kfs">KFS</a>的改造，有关<a href="http://www.yaronspace.cn/blog/?s=kvm">KVM</a>虚拟机的学习等，这期间我居然开始修改内核代码了，这个是最难以置信的，不过还是太弱了，本科时学的体系结构和微机技术的知识基本上全忘没了，还得从头回忆，但是还真没觉得这个东西能够用到，但是看论文太少，自己的独立思考还太弱了。<br />
3，生活上，十一的时候去了趟大城市铁岭，看望下丈母娘，话说这男女方如果不在同一个地方，真是比较麻烦，下次去不知道得等到啥时候，这结婚后就更纠结了，希望xiaofang同学看到不要有啥想法哦~<br />
同时也给超哥、猛哥和韬哥提醒一声，找对象尽量都找近一点哦</p>
<p>2011年的期望：<br />
1，祝愿小邓同学早日实现她的梦想<br />
<a href="http://www.yaronspace.cn/blog/wp-content/uploads/2011/01/12934473758454.jpg"><img class="alignnone size-full wp-image-1055" title="12934473758454" src="http://www.yaronspace.cn/blog/wp-content/uploads/2011/01/12934473758454.jpg" alt="" width="245" height="280" /></a></p>
<p>2，好好干活与学习，明年找个好工作<br />
3，希望lc lm zt (对号入座)不再寂寞不再mensao, 猛哥也越nb, 超哥和韬哥飞越成功，我和猛哥的儿子的前途就全靠你俩了<br />
写了好多，我发现我也太能墨迹了，不写了，回去睡觉了</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1054/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CentOS配置NFS服务器的方法</title>
		<link>http://yaronspace.cn/blog/archives/1051</link>
		<comments>http://yaronspace.cn/blog/archives/1051#comments</comments>
		<pubDate>Fri, 31 Dec 2010 07:29:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[NFS服务器]]></category>
		<category><![CDATA[配置]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1051</guid>
		<description><![CDATA[最近搞KVM虚拟机迁移，前提是需要一个共享存储的文件系统来存储系统镜像，本来打算使用KFS来作为分布式文件系统的，但是在修改kvm的镜像读写API后，系统是跑起来了，但是奇慢无比，主要是存在对镜像存在大量的随机读写造成的，这个下次再好好总结下。所以就想到了简单易用的NFS文件系统，下面是具体的配置细节： 1，NFS服务器的安装 在CentOS系统中，默认情况下已经安装了NFS文件系统，如果没有安装就需要手工安装了 #rpm –q nfs-utils portmap 2， 查看NFS是否启动 #service nfs starus #service portmap status 3，启动NFS #service nfs start #service portmap status 4，修改NFS系统配置文件 #vim /etc/exports /home/yaronli/nfs_space *(sync,rw) 解释说明： /home/yaronli/nfs_space：共享目录名 *：表示所有主机都可以连接改NFS (sync,rw):设置选项     sync：设置NFS服务器同步写磁盘，这样不会轻易丢失数据，建议所有的NFS共享目录都使用该选项     ro：设置输出的共享目录只读，与rw不能共同使用    rw：设置输出的共享目录可读写，与ro不能共同使用 exports文件中“客户端主机地址”字段可以使用多种形式表示主机地址     192.168.152.13　指定IP地址的主机     nfsclient.test.com　指定域名的主机     192.168.1.0/24　指定网段中的所有主机    *.test.com　指定域下的所有主机     *　所有主机 5，生效配置文件 命令#exportfs –rv 可以让新设置的exports文件内容生效 以上是Server端的配置步骤 Client端的配置步骤如下： 1，直接mount到nfs]]></description>
			<content:encoded><![CDATA[<p>最近搞KVM虚拟机迁移，前提是需要一个共享存储的文件系统来存储系统镜像，本来打算使用KFS来作为分布式文件系统的，但是在修改kvm的镜像读写API后，系统是跑起来了，但是奇慢无比，主要是存在对镜像存在大量的随机读写造成的，这个下次再好好总结下。所以就想到了简单易用的NFS文件系统，下面是具体的配置细节：</p>
<p>1，NFS服务器的安装</p>
<p>在CentOS系统中，默认情况下已经安装了NFS文件系统，如果没有安装就需要手工安装了</p>
<pre>#rpm –q nfs-utils portmap
</pre>
<p>2， 查看NFS是否启动</p>
<pre>#service nfs starus
#service portmap status
</pre>
<p>3，启动NFS</p>
<pre>#service nfs start
#service portmap status
</pre>
<h2><span id="more-1051"></span></h2>
<p>4，修改NFS系统配置文件</p>
<p>#vim /etc/exports</p>
<p>/home/yaronli/nfs_space *(sync,rw)</p>
<p>解释说明：</p>
<p>/home/yaronli/nfs_space：共享目录名<br />
*：表示所有主机都可以连接改NFS<br />
<strong>(sync,rw):设置选项</strong></p>
<pre>    sync：设置NFS服务器同步写磁盘，这样不会轻易丢失数据，建议所有的NFS共享目录都使用该选项
    ro：设置输出的共享目录只读，与rw不能共同使用
   rw：设置输出的共享目录可读写，与ro不能共同使用</pre>
<p><strong>exports文件中“客户端主机地址”字段可以使用多种形式表示主机地址</strong></p>
<pre>    192.168.152.13　指定IP地址的主机
    nfsclient.test.com　指定域名的主机
    192.168.1.0/24　指定网段中的所有主机
   *.test.com　指定域下的所有主机
    *　所有主机</pre>
<p>5，生效配置文件<br />
命令#exportfs –rv 可以让新设置的exports文件内容生效<br />
以上是Server端的配置步骤</p>
<p>Client端的配置步骤如下：<br />
1，直接mount到nfs server即可</p>
<pre># mount -t nfs 10.60.1.91:/home/yangguang/nfs_space  /mnt/
说明：
10.60.1.91:是nfs server的ip地址
/home/yangguang/nfs_space: 是nfs server中的共享目录
/mnt:为本地的目录
</pre>
<p>执行成功后，即可在/mnt目录中看到nfs server 挂载的内容<br />
2，卸载已经挂载的nfs共享目录</p>
<pre>#umount /mnt/
</pre>
<p>常用命令：</p>
<pre>显示当前主机中NFS服务器的输出列表
# showmount -e
显示当前主机NFS服务器中已经被NFS客户机挂载使用的共享目录
# showmount -d
显示NFS服务器的输出
# showmount -e 10.60.1.91
</pre>
<p>本文地址：<a href="http://www.yaronspace.cn/blog/index.php/archives/1051">http://www.yaronspace.cn/blog/index.php/archives/1051</a></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1051/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C语言调用C++库接口的方法概述</title>
		<link>http://yaronspace.cn/blog/archives/1046</link>
		<comments>http://yaronspace.cn/blog/archives/1046#comments</comments>
		<pubDate>Tue, 28 Dec 2010 09:30:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[C++库]]></category>
		<category><![CDATA[c调用]]></category>
		<category><![CDATA[动态库]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1046</guid>
		<description><![CDATA[最近需要在由纯c语言编写的代码中调用C++的动态库，在网上找了一些资料，现在总结下解决方法。 主要的思想就是将C++的动态库再封装一层，在这一层编写C语言的函数api，这API中使用C++动态库提供的类； 具体例子如下： 1，假如C++动态库包含如下代码： //myclass.h C CODE#ifndef _MYCLASS_H #define _MYCLASS_H class MyClass &#123; public: void print&#40;&#41;; &#125;; #endif //myclass.cc C CODE#include &#60;iostream&#62; #include &#34;myclass.h&#34; using namespace std; &#160; void MyClass::print&#40;&#41; &#123; cout &#60;&#60; &#34;MyClass::print() called&#34; &#60;&#60; endl; &#125; 编译链接生成动态库：libmyclass.so g++ myclass.cc -shared -o libmyclass.so -I./ -fPIC 2，封装libmyclass.so中类的接口，生成libmyfunc.so //myfunc.h C CODE#ifndef _MYFUNCTION_H #define _MYFUNCTION_H &#160; #ifdef]]></description>
			<content:encoded><![CDATA[<p>最近需要在由纯c语言编写的代码中调用C++的动态库，在网上找了一些资料，现在总结下解决方法。</p>
<p>主要的思想就是将C++的动态库再封装一层，在这一层编写C语言的函数api，这API中使用C++动态库提供的类；</p>
<p>具体例子如下：</p>
<p><strong>1，假如C++动态库包含如下代码：</strong><br />
//myclass.h</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#ifndef _MYCLASS_H</span>
<span style="color: #339933;">#define _MYCLASS_H</span>
class MyClass
<span style="color: #009900;">&#123;</span>
    public<span style="color: #339933;">:</span>
        <span style="color: #993333;">void</span> print<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">#endif</span></pre></div></div>

<p>//myclass.cc</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;iostream&gt;</span>
<span style="color: #339933;">#include &quot;myclass.h&quot;</span>
using namespace std<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span>
MyClass<span style="color: #339933;">::</span><span style="color: #202020;">print</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">cout</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #ff0000;">&quot;MyClass::print() called&quot;</span> <span style="color: #339933;">&lt;&lt;</span> endl<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>编译链接生成动态库：libmyclass.so<br />
g++ myclass.cc -shared -o libmyclass.so -I./ -fPIC </p>
<h2><span id="more-1046"></span></h2>
<p><strong>2，封装libmyclass.so中类的接口，生成libmyfunc.so</strong><br />
//myfunc.h</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#ifndef _MYFUNCTION_H</span>
<span style="color: #339933;">#define _MYFUNCTION_H</span>
&nbsp;
<span style="color: #339933;">#ifdef _cplusplus</span>
<span style="color: #000000; font-weight: bold;">extern</span> <span style="color: #ff0000;">&quot;C&quot;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #339933;">#endif</span>
    <span style="color: #993333;">void</span> myprint<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">#ifdef _cplusplus</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #339933;">#endif</span>
<span style="color: #339933;">#endif</span></pre></div></div>

<p>//myfunc.c</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;myclass.h&quot;</span>
<span style="color: #339933;">#ifndef _cplusplus</span>
<span style="color: #339933;">#define _cplusplus</span>
<span style="color: #339933;">#include &quot;myfunc.h&quot;</span>
<span style="color: #339933;">#endif</span>
<span style="color: #993333;">void</span>
myprint<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    MyClass mc<span style="color: #339933;">;</span>
    mc.<span style="color: #202020;">print</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>编译链接生成动态库（C语言接口）:<br />
g++ myfunc.c -shared -o libmyfunc.so -L./ -lmyclass -fPIC -Xlinker -rpath=./<br />
<strong>3，测试libmyfunc.so中提供的接口</strong><br />
//main.c</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;myfunc.h&quot;</span>
<span style="color: #993333;">int</span> 
main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    myprint<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>编译链接生成可执行代码：<br />
gcc main.c -o main -lmyfunc -L./ -I. -Xlinker -rpath=./<br />
执行main文件，输出如下：<br />
MyClass::print() called<br />
ok，大功搞成！！<br />
<strong>注意事项：</strong><br />
1，注意myfunc.so必须是用g++来生成的，如果使用gcc，会不识别其中的类(这个解释不一定正确)<br />
2，注意myfunc.h中_cpluscplus的用法，因为myfunc.h被main.c和myfunc.c两个文件用到，而extern仅被g++能够识别，<br />
而不能够被gcc识别，解释的不一定对，还没有想清楚。。。。。<br />
本文地址：<a href="http://www.yaronspace.cn/blog/index.php/archives/1046">http://www.yaronspace.cn/blog/index.php/archives/1046</a></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1046/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用事件驱动模型实现高效稳定的网络服务器程序【写得比较基础详细】</title>
		<link>http://yaronspace.cn/blog/archives/1039</link>
		<comments>http://yaronspace.cn/blog/archives/1039#comments</comments>
		<pubDate>Thu, 23 Dec 2010 14:35:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[事件模型]]></category>
		<category><![CDATA[异步框架]]></category>
		<category><![CDATA[网络编程]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1039</guid>
		<description><![CDATA[前言 事件驱动为广大的程序员所熟悉，其最为人津津乐道的是在图形化界面编程中的应用；事实上，在网络编程中事件驱动也被广泛使用，并大规模部署在 高连接数高吞吐量的服务器程序中，如 http 服务器程序、ftp 服务器程序等。相比于传统的网络编程方式，事件驱动能够极大的降低资源占用，增大服务接待能力，并提高网络传输效率。 关于本文提及的服务器模型，搜索网络可以查阅到很多的实现代码，所以，本文将不拘泥于源代码的陈列与分析，而侧重模型的介绍和比较。使用 libev 事件驱动库的服务器模型将给出实现代码。 阻塞型的网络编程接口 几乎所有的程序员第一次接触到的网络编程都是从 listen()、send()、recv() 等接口开始的。使用这些接口可以很方便的构建服务器 / 客户机的模型。 我们假设希望建立一个简单的服务器程序，实现向单个客户机提供类似于“一问一答”的内容服务。 图 1. 简单的一问一答的服务器 / 客户机模型 我们注意到，大部分的 socket 接口都是阻塞型的。所谓阻塞型接口是指系统调用（一般是 IO 接口）不返回调用结果并让当前线程一直阻塞，只有当该系统调用获得结果或者超时出错时才返回。 实际上，除非特别指定，几乎所有的 IO 接口 ( 包括 socket 接口 ) 都是阻塞型的。这给网络编程带来了一个很大的问题，如在调用 send() 的同时，线程将被阻塞，在此期间，线程将无法执行任何运算或响应任何的网络请求。这给多客户机、多业务逻辑的网络编程带来了挑战。这时，很多程序员可能会 选择多线程的方式来解决这个问题。 多线程的服务器程序 应对多客户机的网络应用，最简单的解决方式是在服务器端使用多线程（或多进程）。多线程（或多进程）的目的是让每个连接都拥有独立的线程（或进程），这样任何一个连接的阻塞都不会影响其他的连接。 具体使用多进程还是多线程，并没有一个特定的模式。传统意义上，进程的开销要远远大于线程，所以，如果需要同时为较多的客户机提供服务，则不 推荐使用多进程；如果单个服务执行体需要消耗较多的 CPU 资源，譬如需要进行大规模或长时间的数据运算或文件访问，则进程较为安全。通常，使用 pthread_create () 创建新线程，fork() 创建新进程。 我们假设对上述的服务器 / 客户机模型，提出更高的要求，即让服务器同时为多个客户机提供一问一答的服务。于是有了如下的模型。 图 2. 多线程的服务器模型 在上述的线程]]></description>
			<content:encoded><![CDATA[<h2>前言</h2>
<p>事件驱动为广大的程序员所熟悉，其最为人津津乐道的是在图形化界面编程中的应用；事实上，在网络编程中事件驱动也被广泛使用，并大规模部署在 高连接数高吞吐量的服务器程序中，如 http 服务器程序、ftp  服务器程序等。相比于传统的网络编程方式，事件驱动能够极大的降低资源占用，增大服务接待能力，并提高网络传输效率。</p>
<p>关于本文提及的服务器模型，搜索网络可以查阅到很多的实现代码，所以，本文将不拘泥于源代码的陈列与分析，而侧重模型的介绍和比较。使用 libev 事件驱动库的服务器模型将给出实现代码。</p>
<h2>阻塞型的网络编程接口</h2>
<p>几乎所有的程序员第一次接触到的网络编程都是从 listen()、send()、recv() 等接口开始的。使用这些接口可以很方便的构建服务器 / 客户机的模型。</p>
<p>我们假设希望建立一个简单的服务器程序，实现向单个客户机提供类似于“一问一答”的内容服务。<br />
<strong>图 1. 简单的一问一答的服务器 / 客户机模型</strong><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-edntwk/image001.jpg" alt="图 1. 简单的一问一答的服务器 / 客户机模型" width="411" height="431" /></p>
<p>我们注意到，大部分的 socket 接口都是阻塞型的。所谓阻塞型接口是指系统调用（一般是 IO 接口）不返回调用结果并让当前线程一直阻塞，只有当该系统调用获得结果或者超时出错时才返回。</p>
<p>实际上，除非特别指定，几乎所有的 IO 接口 ( 包括 socket 接口 )  都是阻塞型的。这给网络编程带来了一个很大的问题，如在调用 send()  的同时，线程将被阻塞，在此期间，线程将无法执行任何运算或响应任何的网络请求。这给多客户机、多业务逻辑的网络编程带来了挑战。这时，很多程序员可能会 选择多线程的方式来解决这个问题。</p>
<h2><span id="more-1039"></span></h2>
<h2>多线程的服务器程序</h2>
<p>应对多客户机的网络应用，最简单的解决方式是在服务器端使用多线程（或多进程）。多线程（或多进程）的目的是让每个连接都拥有独立的线程（或进程），这样任何一个连接的阻塞都不会影响其他的连接。</p>
<p>具体使用多进程还是多线程，并没有一个特定的模式。传统意义上，进程的开销要远远大于线程，所以，如果需要同时为较多的客户机提供服务，则不 推荐使用多进程；如果单个服务执行体需要消耗较多的 CPU 资源，譬如需要进行大规模或长时间的数据运算或文件访问，则进程较为安全。通常，使用  pthread_create () 创建新线程，fork() 创建新进程。</p>
<p>我们假设对上述的服务器 / 客户机模型，提出更高的要求，即让服务器同时为多个客户机提供一问一答的服务。于是有了如下的模型。<br />
<strong>图 2. 多线程的服务器模型</strong><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-edntwk/image002.jpg" alt="图 2. 多线程的服务器模型" width="537" height="569" /></p>
<p>在上述的线程 / 时间图例中，主线程持续等待客户端的连接请求，如果有连接，则创建新线程，并在新线程中提供为前例同样的问答服务。</p>
<p>很多初学者可能不明白为何一个 socket 可以 accept 多次。实际上，socket 的设计者可能特意为多客户机的情况留下了伏笔，让 accept() 能够返回一个新的 socket。下面是 accept 接口的原型：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>	 int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
</pre>
</td>
</tr>
</tbody>
</table>
<p>输入参数 s 是从 socket()，bind() 和 listen() 中沿用下来的 socket 句柄值。执行完 bind() 和  listen() 后，操作系统已经开始在指定的端口处监听所有的连接请求，如果有请求，则将该连接请求加入请求队列。调用 accept()  接口正是从 socket s 的请求队列抽取第一个连接信息，创建一个与 s 同类的新的 socket 返回句柄。新的 socket 句柄即是后续  read() 和 recv() 的输入参数。如果请求队列当前没有请求，则 accept() 将进入阻塞状态直到有请求进入队列。</p>
<p>上述多线程的服务器模型似乎完美的解决了为多个客户机提供问答服务的要求，但其实并不尽然。如果要同时响应成百上千路的连接请求，则无论多线程还是多进程都会严重占据系统资源，降低系统对外界响应效率，而线程与进程本身也更容易进入假死状态。</p>
<p>很多程序员可能会考虑使用“<strong>线程池</strong>”或“<strong>连接池</strong>”。“线程池”旨在减 少创建和销毁线程的频率，其维持一定合理数量的线程，并让空闲的线程重新承担新的执行任务。“连接池”维持连接的缓存池，尽量重用已有的连接、减少创建和 关闭连接的频率。这两种技术都可以很好的降低系统开销，都被广泛应用很多大型系统，如 websphere、tomcat 和各种数据库等。</p>
<p>但是，“线程池”和“连接池”技术也只是在一定程度上缓解了频繁调用 IO  接口带来的资源占用。而且，所谓“池”始终有其上限，当请求大大超过上限时，“池”构成的系统对外界的响应并不比没有池的时候效果好多少。所以使用“池” 必须考虑其面临的响应规模，并根据响应规模调整“池”的大小。</p>
<p>对应上例中的所面临的可能同时出现的上千甚至上万次的客户端请求，“线程池”或“连接池”或许可以缓解部分压力，但是不能解决所有问题。</p>
<p>总之，多线程模型可以方便高效的解决小规模的服务请求，但面对大规模的服务请求，多线程模型并不是最佳方案。下一章我们将讨论用非阻塞接口来尝试解决这个问题。</p>
<h2>非阻塞的服务器程序</h2>
<p>以上面临的很多问题，一定程度是 IO 接口的阻塞特性导致的。多线程是一个解决方案，还一个方案就是使用非阻塞的接口。</p>
<p>非阻塞的接口相比于阻塞型接口的显著差异在于，在被调用之后立即返回。使用如下的函数可以将某句柄 fd 设为非阻塞状态。</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>	 fcntl( fd, F_SETFL, O_NONBLOCK );
</pre>
</td>
</tr>
</tbody>
</table>
<p>下面将给出只用一个线程，但能够同时从多个连接中检测数据是否送达，并且接受数据。<br />
<a name="fig3"><strong>图 3. 使用非阻塞的接收数据模型</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-edntwk/image003.jpg" alt="图 3. 使用非阻塞的接收数据模型" width="526" height="536" /></p>
<p>在非阻塞状态下，recv() 接口在被调用后立即返回，返回值代表了不同的含义。如在本例中，</p>
<ul>
<li> recv() 返回值大于 0，表示接受数据完毕，返回值即是接受到的字节数；</li>
<li> recv() 返回 0，表示连接已经正常断开；</li>
<li> recv() 返回 -1，且 errno 等于 EAGAIN，表示 recv 操作还没执行完成；</li>
<li> recv() 返回 -1，且 errno 不等于 EAGAIN，表示 recv 操作遇到系统错误 errno。</li>
</ul>
<p>可以看到服务器线程可以通过循环调用 recv() 接口，可以在单个线程内实现对所有连接的数据接收工作。</p>
<p>但是上述模型绝不被推荐。因为，循环调用 recv() 将大幅度推高 CPU 占用率；此外，在这个方案中，recv() 更多的是起到检测“操作是否完成”的作用，实际操作系统提供了更为高效的检测“操作是否完成“作用的接口，例如 select()。</p>
<h2>使用 select() 接口的基于事件驱动的服务器模型</h2>
<p>大部分 Unix/Linux 都支持 select 函数，该函数用于探测多个文件句柄的状态变化。下面给出 select 接口的原型：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre> FD_ZERO(int fd, fd_set* fds)
 FD_SET(int fd, fd_set* fds)
 FD_ISSET(int fd, fd_set* fds)
 FD_CLR(int fd, fd_set* fds)
 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
        struct timeval *timeout)
</pre>
</td>
</tr>
</tbody>
</table>
<p>这里，fd_set 类型可以简单的理解为按 bit 位标记句柄的队列，例如要在某 fd_set 中标记一个值为 16 的句柄，则该  fd_set 的第 16 个 bit 位被标记为 1。具体的置位、验证可使用 FD_SET、FD_ISSET 等宏实现。在 select()  函数中，readfds、writefds 和 exceptfds 同时作为输入参数和输出参数。如果输入的 readfds 标记了 16  号句柄，则 select() 将检测 16 号句柄是否可读。在 select() 返回后，可以通过检查 readfds 有否标记 16  号句柄，来判断该“可读”事件是否发生。另外，用户可以设置 timeout 时间。</p>
<p>下面将重新模拟上例中从多个客户端接收数据的模型。<br />
<a name="fig4"><strong>图 4. 使用 select() 的接收数据模型</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-edntwk/image004.jpg" alt="图 4. 使用 select() 的接收数据模型" width="533" height="542" /></p>
<p>上述模型只是描述了使用 select() 接口同时从多个客户端接收数据的过程；由于 select() 接口可以同时对多个句柄进行读状态、写状态和错误状态的探测，所以可以很容易构建为多个客户端提供独立问答服务的服务器系统。<br />
<a name="fig5"><strong>图 5. 使用 select() 接口的基于事件驱动的服务器模型</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-edntwk/image005.jpg" alt="图 5. 使用 select() 接口的基于事件驱动的服务器模型" width="541" height="669" /></p>
<p>这里需要指出的是，客户端的一个 connect() 操作，将在服务器端激发一个“可读事件”，所以 select() 也能探测来自客户端的 connect() 行为。</p>
<p>上述模型中，最关键的地方是如何动态维护 select() 的三个参数 readfds、writefds 和  exceptfds。作为输入参数，readfds 应该标记所有的需要探测的“可读事件”的句柄，其中永远包括那个探测 connect()  的那个“母”句柄；同时，writefds 和 exceptfds 应该标记所有需要探测的“可写事件”和“错误事件”的句柄 ( 使用  FD_SET() 标记 )。</p>
<p>作为输出参数，readfds、writefds 和 exceptfds 中的保存了 select() 捕捉到的所有事件的句柄值。程序员需要检查的所有的标记位 ( 使用 FD_ISSET() 检查 )，以确定到底哪些句柄发生了事件。</p>
<p>上述模型主要模拟的是“一问一答”的服务流程，所以，如果 select() 发现某句柄捕捉到了“可读事件”，服务器程序应及时做  recv() 操作，并根据接收到的数据准备好待发送数据，并将对应的句柄值加入 writefds，准备下一次的“可写事件”的 select()  探测。同样，如果 select() 发现某句柄捕捉到“可写事件”，则程序应及时做 send()  操作，并准备好下一次的“可读事件”探测准备。下图描述的是上述模型中的一个执行周期。<br />
<a name="fig6"><strong>图 6. 一个执行周期</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-edntwk/image006.jpg" alt="图 6. 一个执行周期" width="444" height="411" /></p>
<p>这种模型的特征在于每一个执行周期都会探测一次或一组事件，一个特定的事件会触发某个特定的响应。我们可以将这种模型归类为“<strong>事件驱动模型</strong>”。</p>
<p>相比其他模型，使用 select() 的事件驱动模型只用单线程（进程）执行，占用资源少，不消耗太多 CPU，同时能够为多客户端提供服务。如果试图建立一个简单的事件驱动的服务器程序，这个模型有一定的参考价值。</p>
<p>但这个模型依旧有着很多问题。</p>
<p>首先，select() 接口并不是实现“事件驱动”的最好选择。因为当需要探测的句柄值较大时，select()  接口本身需要消耗大量时间去轮询各个句柄。很多操作系统提供了更为高效的接口，如 linux 提供了 epoll，BSD 提供了  kqueue，Solaris 提供了 /dev/poll …。如果需要实现更高效的服务器程序，类似 epoll  这样的接口更被推荐。遗憾的是不同的操作系统特供的 epoll 接口有很大差异，所以使用类似于 epoll  的接口实现具有较好跨平台能力的服务器会比较困难。</p>
<p>其次，该模型将事件探测和事件响应夹杂在一起，一旦事件响应的执行体庞大，则对整个模型是灾难性的。如下例，庞大的执行体 1 的将直接导致响应事件 2 的执行体迟迟得不到执行，并在很大程度上降低了事件探测的及时性。<br />
<strong>图 7. 庞大的执行体对使用 select() 的事件驱动模型的影响</strong><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-edntwk/image007.jpg" alt="图 7. 庞大的执行体对使用 select() 的事件驱动模型的影响" width="425" height="423" /></p>
<p>幸运的是，有很多高效的事件驱动库可以屏蔽上述的困难，常见的事件驱动库有 libevent 库，还有作为 libevent 替代者的  libev 库。这些库会根据操作系统的特点选择最合适的事件探测接口，并且加入了信号 (signal)  等技术以支持异步响应，这使得这些库成为构建事件驱动模型的不二选择。下章将介绍如何使用 libev 库替换 select 或 epoll  接口，实现高效稳定的服务器模型。</p>
<h2>使用事件驱动库 libev 的服务器模型</h2>
<p>Libev 是一种高性能事件循环 / 事件驱动库。作为 libevent 的替代作品，其第一个版本发布与 2007 年 11  月。Libev 的设计者声称 libev  拥有更快的速度，更小的体积，更多功能等优势，这些优势在很多测评中得到了证明。正因为其良好的性能，很多系统开始使用 libev  库。本章将介绍如何使用 Libev 实现提供问答服务的服务器。</p>
<p>（事实上，现存的事件循环 / 事件驱动库有很多，作者也无意推荐读者一定使用 libev 库，而只是为了说明事件驱动模型给网络服务器编程带来的便利和好处。大部分的事件驱动库都有着与 libev 库相类似的接口，只要明白大致的原理，即可灵活挑选合适的库。）</p>
<p>与前章的模型类似，libev 同样需要循环探测事件是否产生。Libev 的循环体用 ev_loop 结构来表达，并用 ev_loop( ) 来启动。</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>	 void ev_loop( ev_loop* loop, int flags )
</pre>
</td>
</tr>
</tbody>
</table>
<p>Libev 支持八种事件类型，其中包括 IO 事件。一个 IO 事件用 ev_io 来表征，并用 ev_io_init() 函数来初始化：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>	 void ev_io_init(ev_io *io, callback, int fd, int events)
</pre>
</td>
</tr>
</tbody>
</table>
<p>初始化内容包括回调函数 callback，被探测的句柄 fd 和需要探测的事件，EV_READ 表“可读事件”，EV_WRITE 表“可写事件”。</p>
<p>现在，用户需要做的仅仅是在合适的时候，将某些 ev_io 从 ev_loop 加入或剔除。一旦加入，下个循环即会检查 ev_io  所指定的事件有否发生；如果该事件被探测到，则 ev_loop 会自动执行 ev_io 的回调函数 callback()；如果 ev_io  被注销，则不再检测对应事件。</p>
<p>无论某 ev_loop 启动与否，都可以对其添加或删除一个或多个 ev_io，添加删除的接口是 ev_io_start() 和 ev_io_stop()。</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>	 void ev_io_start( ev_loop *loop, ev_io* io )
	 void ev_io_stop( EV_A_* )
</pre>
</td>
</tr>
</tbody>
</table>
<p>由此，我们可以容易得出如下的“一问一答”的服务器模型。由于没有考虑服务器端主动终止连接机制，所以各个连接可以维持任意时间，客户端可以自由选择退出时机。<br />
<a name="fig8"><strong>图 8. 使用 libev 库的服务器模型</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-edntwk/image008.jpg" alt="图 8. 使用 libev 库的服务器模型" width="574" height="560" /></p>
<p>上述模型可以接受任意多个连接，且为各个连接提供完全独立的问答服务。借助 libev 提供的事件循环 / 事件驱动接口，上述模型有机会具备其他模型不能提供的高效率、低资源占用、稳定性好和编写简单等特点。</p>
<p>由于传统的 web 服务器，ftp 服务器及其他网络应用程序都具有“一问一答”的通讯逻辑，所以上述使用 libev  库的“一问一答”模型对构建类似的服务器程序具有参考价值；另外，对于需要实现远程监视或远程遥控的应用程序，上述模型同样提供了一个可行的实现方案。</p>
<h2>总结</h2>
<p>本文围绕如何构建一个提供“一问一答”的服务器程序，先后讨论了用阻塞型的 socket 接口实现的模型，使用多线程的模型，使用  select() 接口的基于事件驱动的服务器模型，直到使用 libev  事件驱动库的服务器模型。文章对各种模型的优缺点都做了比较，从比较中得出结论，即使用“事件驱动模型”可以的实现更为高效稳定的服务器程序。文中描述的 多种模型可以为读者的网络编程提供参考价值。</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1039/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google创新论坛</title>
		<link>http://yaronspace.cn/blog/archives/1035</link>
		<comments>http://yaronspace.cn/blog/archives/1035#comments</comments>
		<pubDate>Sun, 12 Dec 2010 14:58:24 +0000</pubDate>
		<dc:creator>Yvonne</dc:creator>
				<category><![CDATA[业界趣闻轶事]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1035</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><embed src="http://player.youku.com/player.php/sid/XMjI4MTQxODky/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1035/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WPO[Web 性能优化与运维]会议链接</title>
		<link>http://yaronspace.cn/blog/archives/1030</link>
		<comments>http://yaronspace.cn/blog/archives/1030#comments</comments>
		<pubDate>Sun, 12 Dec 2010 14:26:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[LAMP与网站架构]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1030</guid>
		<description><![CDATA[http://velocity.oreilly.com.cn/index.php?func=slidesvideos 保存下链接，后续好好听下~]]></description>
			<content:encoded><![CDATA[<p><a href="http://velocity.oreilly.com.cn/index.php?func=slidesvideos" target="_blank">http://velocity.oreilly.com.cn/index.php?func=slidesvideos</a></p>
<p>保存下链接，后续好好听下~</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1030/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux中container_of用法详解</title>
		<link>http://yaronspace.cn/blog/archives/1026</link>
		<comments>http://yaronspace.cn/blog/archives/1026#comments</comments>
		<pubDate>Sat, 11 Dec 2010 07:49:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[container_of]]></category>
		<category><![CDATA[宏定义]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1026</guid>
		<description><![CDATA[今天看内核代码，发现container_of的用法，上网查下它的用法，原来是 在已知结构体的某个成员的指针时，求出整个结构体的首指针地址，具体宏展开如下： C CODE#define container_of(ptr, type, member) ({ \ const typeof&#40; &#40;&#40;type *&#41;0&#41;-&#62;member &#41; *__mptr = &#40;ptr&#41;; \ &#160; &#40;type *&#41;&#40; &#40;char *&#41;__mptr - offsetof&#40;type,member&#41; &#41;;&#125;&#41; 具体解释如下： typeof是gcc的一个扩展，用于确定一个变量的类型，有点像C++的RTTI，常用于表达式内的语句，在定义宏时，如果需要临时变量，可以这样做： C CODE#define max(a,b) \ ({ typeof (a) _a = (a); \ typeof (b) _b = (b); \ _a &#62; _b ? _a : _b; }) 它可以保证我们定义的变量_a/_b与宏传入的变量a/b类型匹配，而不会产生编译器告警。 因此container_of的第一行就是定义一个与member类型匹配的变量__mptr，赋值后，__mptr为宏参数中的待转换指针，因为只是类型转换，不涉及数据读写，((type*)0)是没有任何副作用的。]]></description>
			<content:encoded><![CDATA[<p>今天看内核代码，发现container_of的用法，上网查下它的用法，原来是 <strong>在已知结构体的某个成员的指针时，求出整个结构体的首指针地址</strong>，具体宏展开如下：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define container_of(ptr, type, member) ({ \
</span>
<span style="color: #993333;">const</span> typeof<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>type <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>member <span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span>__mptr <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>ptr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> \
&nbsp;
<span style="color: #009900;">&#40;</span>type <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>__mptr <span style="color: #339933;">-</span> offsetof<span style="color: #009900;">&#40;</span>type<span style="color: #339933;">,</span>member<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p><strong>具体解释如下：</strong><br />
typeof是gcc的一个扩展，用于确定一个变量的类型，有点像C++的RTTI，常用于表达式内的语句，在定义宏时，如果需要临时变量，可以这样做：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define max(a,b) \
({ typeof (a) _a = (a); \
typeof (b) _b = (b); \
_a &gt; _b ? _a : _b; })</span></pre></div></div>

<p>它可以保证我们定义的变量_a/_b与宏传入的变量a/b类型匹配，而不会产生编译器告警。</p>
<p>因此container_of的第一行就是定义一个与member类型匹配的变量__mptr，赋值后，__mptr为宏参数中的待转换指针，因为只是类型转换，不涉及数据读写，((type*)0)是没有任何副作用的。</p>
<p>第二行用__mptr减去member变量在type中的偏移，这样便可实际访问到ptr相同偏移，也即type的实际首地址了。offsetof有两种定义：</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#ifdef __compiler_offsetof</span>
<span style="color: #339933;">#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)</span>
<span style="color: #339933;">#else</span>
<span style="color: #339933;">#define offsetof(TYPE, MEMBER) ((size_t) &amp;((TYPE *)0)-&gt;MEMBER)</span>
<span style="color: #339933;">#endif</span></pre></div></div>

<p>__compiler_offsetof即__builtin_offsetof，__builtin_offsetof可能是gcc內建的支持(见gcc源码c-parser.c)，<br />
从后一种实现方式可以明显看到这一技巧，假定一个从0地址开始的结构体，取其成员member的地址正是结构体内的偏移。</p>
<p>linux下的c语言的宏果然是博大精深呀，还得学习，下次会介绍下有关模块注册中宏的用法的~</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1026/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>许式伟：架构之美&amp;软件质量保障</title>
		<link>http://yaronspace.cn/blog/archives/1023</link>
		<comments>http://yaronspace.cn/blog/archives/1023#comments</comments>
		<pubDate>Tue, 07 Dec 2010 13:34:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[LAMP与网站架构]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[架构之美]]></category>
		<category><![CDATA[软件架构]]></category>
		<category><![CDATA[软件质量]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1023</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><embed src="http://player.ku6.com/refer/LbCFtqdYRKLCZqFu/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="always" allowfullscreen="true" type="application/x-shockwave-flash"></embed></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1023/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>第一次拜访客户</title>
		<link>http://yaronspace.cn/blog/archives/1018</link>
		<comments>http://yaronspace.cn/blog/archives/1018#comments</comments>
		<pubDate>Mon, 06 Dec 2010 13:56:19 +0000</pubDate>
		<dc:creator>Yvonne</dc:creator>
				<category><![CDATA[Project Management]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1018</guid>
		<description><![CDATA[今天下午第一次拜访客户收集需求，我的感受主要有三点： 首先，直观的了解客户需要一个什么样的功能：以前听别人转述可以知道我们要实现怎样的功能， 但通常都包含了转述人对需求加工的成分，如果描述不完整还容易造成理解的偏差；今天直接听到了客户对需求的描述，我要注意自己转述的时候别扭曲了用户的原意。 其次，知道客户提出某个需求做什么用、将如何使用：客户描述了实际使用中遇到的问题，所以希望这个功能怎样怎样实现以解决这个问题。 这样便于我们理解客户提出的需求，并且站在客户的角度思考功能的实现方式。可以在一定程度上避免做出来的产品是客户不需要的，或者不符合客户的使用习惯。 最后，客户能帮助我们排除他们不会使用的场景：前期我们项目组内讨论需求时大家都尽量覆 盖猜想到的使用场景和实现方式，与客户沟通的时候他们直接回答“我们不会这么用”。 另外客户和咨询师也会顺便给出一些对产品的反馈。并且是单纯的学习产品功能不考虑用户实际使用场景时不会考虑到的。 总之收益匪浅，以后能力提高了还要主动提供解决方案供参考，以后的事儿明天再说，今天回家了先~~]]></description>
			<content:encoded><![CDATA[<p>今天下午第一次拜访客户收集需求，我的感受主要有三点：</p>
<p>首先，直观的了解客户需要一个什么样的功能：以前听别人转述可以知道我们要实现怎样的功能，</p>
<p>但通常都包含了转述人对需求加工的成分，如果描述不完整还容易造成理解的偏差；今天直接听到了客户对需求的描述，我要注意自己转述的时候别扭曲了用户的原意。</p>
<p>其次，知道客户提出某个需求做什么用、将如何使用：客户描述了实际使用中遇到的问题，所以希望这个功能怎样怎样实现以解决这个问题。</p>
<p>这样便于我们理解客户提出的需求，并且站在客户的角度思考功能的实现方式。可以在一定程度上避免做出来的产品是客户不需要的，或者不符合客户的使用习惯。</p>
<p>最后，客户能帮助我们排除他们不会使用的场景：前期我们项目组内讨论需求时大家都尽量覆</p>
<p>盖猜想到的使用场景和实现方式，与客户沟通的时候他们直接回答“我们不会这么用”。</p>
<p>另外客户和咨询师也会顺便给出一些对产品的反馈。并且是单纯的学习产品功能不考虑用户实际使用场景时不会考虑到的。</p>
<p>总之收益匪浅，以后能力提高了还要主动提供解决方案供参考，以后的事儿明天再说，今天回家了先~~</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1018/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>需求分析小试牛刀【1】</title>
		<link>http://yaronspace.cn/blog/archives/1016</link>
		<comments>http://yaronspace.cn/blog/archives/1016#comments</comments>
		<pubDate>Sun, 05 Dec 2010 07:34:34 +0000</pubDate>
		<dc:creator>Yvonne</dc:creator>
				<category><![CDATA[Project Management]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1016</guid>
		<description><![CDATA[上周开始可以开始参与需求工作了，暂时参与需求跟踪和需求分析两个方面，先谈谈对需求分析的认识（太教科书的东西自己已经看了很多，不再这儿赘述）： 最初的想法：需求来源于客户，所以我们尽量采集客户的需求，然后整合规划后按照客户的希望实现即可。 实际情况：假设客户可以正确的表达自己的want和need，但究竟想要个怎样的产品来满足自己的want和need客户通常没想好，或者压根儿不愿意想。这个设计、实现产品的工作就需要我们来做。我们要制造需求，并培养需求。 对新需求的需求分析是从想法到产品的分析，重点在思考如何实现； 新需求实现后如果需要整合到整个产品中，就要重点分析对原有功能的影响： 并入需求和整个产品的风格是否一致？ 新需求属于整个产品框架的哪部分？ 业务流程是否有矛盾？ 功能是否有冗余？ 加入新功能后是否可提升产品的整体功能和竞争力？ 新需求的数据来源于哪里？处理后流向何处？ 暂时想到这些，多问些问题还是有好处的，提问有助于促进思考。]]></description>
			<content:encoded><![CDATA[<p>上周开始可以开始参与需求工作了，暂时参与需求跟踪和需求分析两个方面，先谈谈对需求分析的认识（太教科书的东西自己已经看了很多，不再这儿赘述）：</p>
<ul>
<li>最初的想法：需求来源于客户，所以我们尽量采集客户的需求，然后整合规划后按照客户的希望实现即可。</li>
</ul>
<ul>
<li> 实际情况：假设客户可以正确的表达自己的want和need，但究竟想要个怎样的产品来满足自己的want和need客户通常没想好，或者压根儿不愿意想。这个设计、实现产品的工作就需要我们来做。我们要制造需求，并培养需求。</li>
</ul>
<p>对新需求的需求分析是从想法到产品的分析，重点在思考如何实现；<br />
新需求实现后如果需要整合到整个产品中，就要重点分析对原有功能的影响：</p>
<ul>
<li> 并入需求和整个产品的风格是否一致？</li>
<li> 新需求属于整个产品框架的哪部分？</li>
<li> 业务流程是否有矛盾？</li>
<li> 功能是否有冗余？</li>
<li> 加入新功能后是否可提升产品的整体功能和竞争力？</li>
<li> 新需求的数据来源于哪里？处理后流向何处？</li>
</ul>
<p>暂时想到这些，多问些问题还是有好处的，提问有助于促进思考。</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1016/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>shell脚本小技巧总结【继续更新】</title>
		<link>http://yaronspace.cn/blog/archives/1012</link>
		<comments>http://yaronspace.cn/blog/archives/1012#comments</comments>
		<pubDate>Thu, 02 Dec 2010 14:13:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[shell脚本]]></category>
		<category><![CDATA[总结]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1012</guid>
		<description><![CDATA[今天写了个shell脚本，发现之前学的有关shell脚本的内容长时间不用，基本上是忘没了，所有的内容都 必须从网上现找，如判断文件是否存在等，今天就记录下学到的有关shell脚本的内容，后续有关内容也要 继续更新这篇文章的 1，判断文件是否存在 -f 判断文件是否存在   if [ ! -f $image_file ] ;then qemu-img create -b $(pwd)/images/ubuntu-base.img -f qcow2 $image_file elif [ ... ] ; then ...... fi 类似命令还有-x 判断文件是否有执行权限，-d 判断是否是路径，-eq 判断值是否相等，=直接判断是否 字符串相等 2，for loop range 的用法 C CODEfor i in $&#40;&#60;strong&#62;seq 1 10&#60;/strong&#62;&#41; ; do image_file=&#34;./images/ubuntu-${1}.img&#34; ps aux &#124; grep $image_file &#124; grep]]></description>
			<content:encoded><![CDATA[<p>今天写了个shell脚本，发现之前学的有关shell脚本的内容长时间不用，基本上是忘没了，所有的内容都</p>
<p>必须从网上现找，如判断文件是否存在等，今天就记录下学到的有关shell脚本的内容，后续有关内容也要</p>
<p>继续更新这篇文章的</p>
<p><strong>1，判断文件是否存在</strong></p>
<p>-f 判断文件是否存在</p>
<pre>  if [ ! -f $image_file ] ;then
 qemu-img create -b $(pwd)/images/ubuntu-base.img -f qcow2 $image_file
elif [  ... ] ;  then
......
  fi</pre>
<p>类似命令还有-x 判断文件是否有执行权限，-d 判断是否是路径，-eq 判断值是否相等，=直接判断是否<br />
字符串相等<br />
<strong>2，for loop range 的用法</strong></p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">for</span> i in $<span style="color: #009900;">&#40;</span><span style="color: #339933;">&lt;</span>strong<span style="color: #339933;">&gt;</span>seq <span style="color: #0000dd;">1</span> <span style="color: #0000dd;">10</span><span style="color: #339933;">&lt;/</span>strong<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span> <span style="color: #b1b100;">do</span>
image_file<span style="color: #339933;">=</span><span style="color: #ff0000;">&quot;./images/ubuntu-${1}.img&quot;</span>
ps aux <span style="color: #339933;">|</span> grep $image_file <span style="color: #339933;">|</span> grep <span style="color: #339933;">-</span>v grep <span style="color: #339933;">|</span> awk <span style="color: #ff0000;">'{print $2}'</span> <span style="color: #339933;">|</span> xargs sudo kill <span style="color: #339933;">-</span><span style="color: #0000dd;">9</span>
done</pre></div></div>

<p>主要是利用seq命令来实现</p>
<p><strong>3,从ps 命令中提取指定名字的进程号，并将其killl掉</strong></p>
<pre> ps aux | grep $image_file | grep -v grep | awk '{print $2}' | xargs sudo kill -9
 #$image_file 为进程的名字</pre>
<p><strong>4, shell进行算术运算</strong><br />
<span style="color: #ff0000;">1&gt; expr</span></p>
<pre>i=7
j =8
c=`expr $i + $j`</pre>
<p><span style="color: #ff0000;">2&gt; let</span></p>
<pre>i=7
j =8
let c=i+j</pre>
<p><span style="color: #ff0000;">3&gt; (())</span></p>
<pre>i=7
j =8
$((c=i+j))</pre>
<p><span style="color: #ff0000;">4&gt; bc</span></p>
<pre>echo "scale=2; 0.5 * 0.5" | bc

echo "0.5*0.5" | bc -l</pre>
<p>未完待续</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1012/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个对MapReduce理解绝佳的例子</title>
		<link>http://yaronspace.cn/blog/archives/1010</link>
		<comments>http://yaronspace.cn/blog/archives/1010#comments</comments>
		<pubDate>Thu, 02 Dec 2010 11:53:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[mapreduce]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1010</guid>
		<description><![CDATA[MapReduce编程模式可以简单归纳为这个Unix Shell： cat input&#124;grep xxx&#124;sort&#124;uniq -c&#124;cat &#62; output 对应典型MapReduce的几个阶段： Input&#124;Map&#124;Shuffle &#38; Sort&#124;Reduce&#124;Output]]></description>
			<content:encoded><![CDATA[<p>MapReduce编程模式可以简单归纳为这个Unix Shell：</p>
<pre><strong>cat input|grep xxx|sort|uniq -c|cat &gt; output</strong></pre>
<p>对应典型MapReduce的几个阶段：</p>
<pre>Input|Map|Shuffle &amp; Sort|Reduce|Output</pre>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1010/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gdb交叉编译的方法</title>
		<link>http://yaronspace.cn/blog/archives/1008</link>
		<comments>http://yaronspace.cn/blog/archives/1008#comments</comments>
		<pubDate>Thu, 02 Dec 2010 09:26:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[32位]]></category>
		<category><![CDATA[64位]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[交叉编译]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1008</guid>
		<description><![CDATA[最近需要在32位机器上调试64位的内核，需要在32位机器上编译出能够读取64位的内核文件vmlinux的gdb，今天问周老师，原来gdb本身可以支持交叉编译，gdb好强悍！！ 正确的编译方法： ./configure --target=x86_64-linux-gnu 错误方法： ./configure --target=x86_64 *** BFD does not support target x86_64-pc-none. *** Look in bfd/config.bfd for supported targets. make[1]: *** [configure-bfd] Error 1 make[1]: Leaving directory `/home/yaronli/software-tar/gdb-6.8' make: *** [all] Error 2 我刚开始用得这个选项，一直报错]]></description>
			<content:encoded><![CDATA[<p>最近需要在32位机器上调试64位的内核，需要在32位机器上编译出能够读取64位的内核文件vmlinux的gdb，今天问周老师，原来gdb本身可以支持交叉编译，gdb好强悍！！</p>
<p>正确的编译方法：</p>
<pre>./configure --target=x86_64-linux-gnu</pre>
<p>错误方法：</p>
<pre><span style="color: #ff0000;">./configure --target=x86_64</span>

*** BFD does not support target x86_64-pc-none.
*** Look in bfd/config.bfd for supported targets.
make[1]: *** [configure-bfd] Error 1
make[1]: Leaving directory `/home/yaronli/software-tar/gdb-6.8'
make: *** [all] Error 2</pre>
<p><span style="color: #ff0000;">我刚开始用得这个选项，一直报错</span></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1008/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux下x86架构下的内联汇编用法</title>
		<link>http://yaronspace.cn/blog/archives/1001</link>
		<comments>http://yaronspace.cn/blog/archives/1001#comments</comments>
		<pubDate>Tue, 30 Nov 2010 09:10:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[x86]]></category>
		<category><![CDATA[内联汇编]]></category>
		<category><![CDATA[用法]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=1001</guid>
		<description><![CDATA[如果您是 Linux 内核的开发人员，您会发现自己经常要对与体系结构高度相关的功能进行编码或优化代码路径。您很可能是通过将汇编语言指令插入到 C 语句的中间（又称为内联汇编的一种方法）来执行这些任务的。让我们看一下 Linux 中内联汇编的特定用法。（我们将讨论限制在 IA32 汇编。） GNU 汇编程序简述 让我们首先看一下 Linux 中使用的基本汇编程序语法。GCC（用于 Linux 的 GNU C 编译器）使用 AT&#38;T 汇编语法。下面列出了这种语法的一些基本规则。（该列表肯定不完整；只包括了与内联汇编相关的那些规则。） 寄存器命名 寄存器名称有 % 前缀。即，如果必须使用 eax，它应该用作 %eax。 源操作数和目的操作数的顺序 在所有指令中，先是源操作数，然后才是目的操作数。这与将源操作数放在目的操作数之后的 Intel 语法不同。 mov %eax, %ebx, transfers the contents of eax to ebx. 操作数大小 根据操作数是字节 (byte)、字 (word) 还是长型 (long)，指令的后缀可以是 b、w 或 l。这并不是强制性的；GCC 会尝试通过读取操作数来提供相应的后缀。但手工指定后缀可以改善代码的可读性，并可以消除编译器猜测不正确的可能性。 movb %al, %bl --]]></description>
			<content:encoded><![CDATA[<p>如果您是 Linux 内核的开发人员，您会发现自己经常要对与体系结构高度相关的功能进行编码或优化代码路径。您很可能是通过将汇编语言指令插入到 C 语句的中间（又称为内联汇编的一种方法）来执行这些任务的。让我们看一下 Linux 中内联汇编的特定用法。（我们将讨论限制在 IA32 汇编。）</p>
<h2><a name="1">GNU 汇编程序简述</a></h2>
<p>让我们首先看一下 Linux 中使用的基本汇编程序语法。GCC（用于 Linux 的 GNU C 编译器）使用 AT&amp;T 汇编语法。下面列出了这种语法的一些基本规则。（该列表肯定不完整；只包括了与内联汇编相关的那些规则。）</p>
<p><strong>寄存器命名</strong><br />
寄存器名称有 % 前缀。即，如果必须使用 eax，它应该用作 %eax。</p>
<p><strong>源操作数和目的操作数的顺序</strong><br />
在所有指令中，先是源操作数，然后才是目的操作数。这与将源操作数放在目的操作数之后的 Intel 语法不同。</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>mov %eax, %ebx, transfers the contents of eax to ebx.
</pre>
</td>
</tr>
</tbody>
</table>
<p><strong>操作数大小</strong><br />
根据操作数是字节 (byte)、字 (word) 还是长型 (long)，指令的后缀可以是 b、w 或 l。这并不是强制性的；GCC 会尝试通过读取操作数来提供相应的后缀。但手工指定后缀可以改善代码的可读性，并可以消除编译器猜测不正确的可能性。</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>movb %al, %bl -- Byte move
    movw %ax, %bx -- Word move
    movl %eax, %ebx -- Longword move
</pre>
</td>
</tr>
</tbody>
</table>
<p><strong>立即操作数</strong><br />
通过使用 $ 指定直接操作数。</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>movl $0xffff, %eax -- will move the value of 0xffff into eax register.
</pre>
</td>
</tr>
</tbody>
</table>
<h2><span id="more-1001"></span></h2>
<p><strong>间接内存引用</strong><br />
任何对内存的间接引用都是通过使用 ( ) 来完成的。</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>movb (%esi), %al -- will transfer the byte in the memory
 pointed by esi into al
register
</pre>
</td>
</tr>
</tbody>
</table>
<div>
<hr /></div>
<h2><a name="2">内联汇编</a></h2>
<p>GCC 为内联汇编提供特殊结构，它具有以下格式：</p>
<p><strong>GCG 的 &#8220;asm&#8221; 结构</strong></p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>   asm ( assembler template

: output operands               (optional)

: input operands                (optional)

: list of clobbered registers
    (optional)

);
</pre>
</td>
</tr>
</tbody>
</table>
<p>本例中，汇编程序模板由汇编指令组成。输入操作数是充当指令输入操作数使用的 C 表达式。输出操作数是将对其执行汇编指令输出的 C 表达式。</p>
<p>内联汇编的重要性体现在它能够灵活操作，而且可以使其输出通过 C 变量显示出来。因为它具有这种能力，所以 &#8220;asm&#8221; 可以用作汇编指令和包含它的 C 程序之间的接口。</p>
<p>一个非常基本但很重要的区别在于          <em>简单内联汇编</em>只包括指令，而         <em>扩展内联汇编</em>包括操作数。要说明这一点，考虑以下示例：</p>
<p><strong>内联汇编的基本要素</strong></p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>{
    int a=10, b;
    asm ("movl %1, %%eax;

movl %%eax, %0;"
        :"=r"(b)  /* output */
        :"r"(a)       /* input */
        :"%eax"); /* clobbered register */
}
</pre>
</td>
</tr>
</tbody>
</table>
<p>在上例中，我们使用汇编指令使 &#8220;b&#8221; 的值等于 &#8220;a&#8221;。请注意以下几点：</p>
<ul>
<li>&#8220;b&#8221; 是输出操作数，由 %0 引用，&#8221;a&#8221; 是输入操作数，由 %1 引用。</li>
<li>&#8220;r&#8221; 是操作数的约束，它指定将变量 &#8220;a&#8221; 和 &#8220;b&#8221; 存储在寄存器中。请注意，输出操作数约束应该带有一个约束修饰符 &#8220;=&#8221;，指定它是输出操作数。</li>
<li>要在 &#8220;asm&#8221; 内使用寄存器 %eax，%eax 的前面应该再加一个 %，换句话说就是 %%eax，因为 &#8220;asm&#8221; 使用 %0、%1 等来标识变量。任何带有一个 % 的数都看作是输入／输出操作数，而不认为是寄存器。</li>
<li>第三个冒号后的修饰寄存器 %eax 告诉将在 &#8220;asm&#8221; 中修改 GCC %eax 的值，这样 GCC 就不使用该寄存器存储任何其它的值。</li>
<li> <code>movl %1, %%eax</code> 将 &#8220;a&#8221; 的值移到 %eax 中，            <code>movl %%eax, %0</code> 将 %eax 的内容移到 &#8220;b&#8221; 中。</li>
<li>因为 &#8220;b&#8221; 被指定成输出操作数，因此当 &#8220;asm&#8221; 的执行完成后，它将反映出更新的值。换句话说，对 &#8220;asm&#8221; 内 &#8220;b&#8221; 所做的更改将在 &#8220;asm&#8221; 外反映出来。</li>
</ul>
<p>现在让我们更详细的了解每一项的含义。</p>
<div>
<hr /></div>
<h2><a name="3">汇编程序模板</a></h2>
<p>汇编程序模板是一组插入到 C 程序中的汇编指令（可以是单个指令，也可以是一组指令）。每条指令都应该由双引号括起，或者整组指令应该由双引号括起。每条指令还应该用一个定界符结尾。有效的定界符为新行 (\n) 和分号 (;)。 &#8216;\n&#8217; 后可以跟一个 tab(\t) 作为格式化符号，增加 GCC 在汇编文件中生成的指令的可读性。 指令通过数 %0、%1 等来引用 C 表达式（指定为操作数）。</p>
<p>如果希望确保编译器不会在 &#8220;asm&#8221; 内部优化指令，可以在 &#8220;asm&#8221; 后使用关键字 &#8220;volatile&#8221;。如果程序必须与 ANSI C 兼容，则应该使用 __asm__ 和 __volatile__，而不是 asm 和 volatile。</p>
<div>
<hr /></div>
<h2><a name="4">操作数</a></h2>
<p>C 表达式用作 &#8220;asm&#8221; 内的汇编指令操作数。在汇编指令通过对 C 程序的 C 表达式进行操作来执行有意义的作业的情况下，操作数是内联汇编的主要特性。</p>
<p>每个操作数都由操作数约束字符串指定，后面跟用括弧括起的 C 表达式，例如：&#8221;constraint&#8221; (C expression)。操作数约束的主要功能是确定操作数的寻址方式。</p>
<p>可以在输入和输出部分中同时使用多个操作数。每个操作数由逗号分隔开。</p>
<p>在汇编程序模板内部，操作数由数字引用。如果总共有         <em>n</em> 个操作数（包括输入和输出），那么第一个输出操作数的编号为 0，逐项递增，最后那个输入操作数的编号为         <em>n</em> -1。总操作数的数目限制在 10，如果机器描述中任何指令模式中的最大操作数数目大于 10，则使用后者作为限制。</p>
<div>
<hr /></div>
<h2><a name="5">修饰寄存器列表</a></h2>
<p>如果 &#8220;asm&#8221; 中的指令指的是硬件寄存器，可以告诉 GCC 我们将自己使用和修改它们。这样，GCC 就不会假设它装入到这些寄存器中的值是有效值。通常不需要将输入和输出寄存器列为 clobbered，因为 GCC 知道 &#8220;asm&#8221; 使用它们（因为它们被明确指定为约束）。不过，如果指令使用任何其它的寄存器，无论是明确的还是隐含的（寄存器不在输入约束列表中出现，也不在输出约束列表中出现），寄存器都必须被指定为修饰列表。修饰寄存器列在第三个冒号之后，其名称被指定为字符串。</p>
<p>至于关键字，如果指令以某些不可预知且不明确的方式修改了内存，则可能将 &#8220;memory&#8221; 关键字添加到修饰寄存器列表中。这样就告诉 GCC 不要在不同指令之间将内存值高速缓存在寄存器中。</p>
<div>
<hr /></div>
<h2><a name="6">操作数约束</a></h2>
<p>前面提到过，&#8221;asm&#8221; 中的每个操作数都应该由操作数约束字符串描述，后面跟用括弧括起的 C 表达式。操作数约束主要是确定指令中操作数的寻址方式。约束也可以指定：</p>
<ul>
<li> 是否允许操作数位于寄存器中，以及它可以包括在哪些种类的寄存器中</li>
<li> 操作数是否可以是内存引用，以及在这种情况下使用哪些种类的地址</li>
<li>操作数是否可以是立即数</li>
</ul>
<p>约束还要求两个操作数匹配。</p>
<div>
<hr /></div>
<h2><a name="7">常用约束</a></h2>
<p>在可用的操作数约束中，只有一小部分是常用的；下面列出了这些约束以及简要描述。有关操作数约束的完整列表，请参考 GCC 和 GAS 手册。</p>
<p><strong>寄存器操作数约束 (r)</strong><br />
使用这种约束指定操作数时，它们存储在通用寄存器中。请看下例：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>asm ("movl %%cr3, %0\n" :"=r"(cr3val));
</pre>
</td>
</tr>
</tbody>
</table>
<p>这里，变量 cr3val 保存在寄存器中，%cr3 的值复制到寄存器上，cr3val 的值从该寄存器更新到内存中。指定 &#8220;r&#8221; 约束时，GCC 可以将变量 cr3val 保存在任何可用的 GPR 中。要指定寄存器，必须通过使用特定的寄存器约束直接指定寄存器名。</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>a   %eax
b   %ebx
c   %ecx
d   %edx
S   %esi
D   %edi
</pre>
</td>
</tr>
</tbody>
</table>
<p><strong>内存操作数约束 (m)</strong><br />
当操作数位于内存中时，任何对它们执行的操作都将在内存位置中直接发生，这与寄存器约束正好相反，后者先将值存储在要修改的寄存器中，然后将它写回内存位置中。但寄存器约束通常只在对于指令来说它们是绝对必需的，或者它们可以大大提高进程速度时使用。当需要在 &#8220;asm&#8221; 内部更新 C 变量，而您又确实不希望使用寄存器来保存其值时，使用内存约束最为有效。例如，idtr 的值存储在内存位置 loc 中：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre> ("sidt %0\n" : :"m"(loc));
</pre>
</td>
</tr>
</tbody>
</table>
<p><strong>匹配（数字）约束</strong><br />
在某些情况下，一个变量既要充当输入操作数，也要充当输出操作数。可以通过使用匹配约束在 &#8220;asm&#8221; 中指定这种情况。</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>asm ("incl %0" :"=a"(var):"0"(var));
</pre>
</td>
</tr>
</tbody>
</table>
<p>在匹配约束的示例中，寄存器 %eax 既用作输入变量，也用作输出变量。将 var 输入读取到 %eax，增加后将更新的 %eax 再次存储在 var 中。这里的 &#8220;0&#8243; 指定第 0 个输出变量相同的约束。即，它指定 var 的输出实例只应该存储在 %eax 中。该约束可以用于以下情况：</p>
<ul>
<li>输入从变量中读取，或者变量被修改后，修改写回到同一变量中</li>
<li>不需要将输入操作数和输出操作数的实例分开</li>
</ul>
<p>使用匹配约束最重要的意义在于它们可以导致有效地使用可用寄存器。</p>
<div>
<hr /></div>
<h2><a name="8">一般内联汇编用法示例</a></h2>
<p>以下示例通过各种不同的操作数约束说明了用法。有如此多的约束以至于无法将它们一一列出，这里只列出了最经常使用的那些约束类型。</p>
<p><strong>&#8220;asm&#8221; 和寄存器约束 &#8220;r&#8221;</strong> 让我们先看一下使用寄存器约束 r 的 &#8220;asm&#8221;。我们的示例显示了 GCC 如何分配寄存器，以及它如何更新输出变量的值。</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>int main(void)
{
    int x = 10, y;

    asm ("movl %1, %%eax;

 "movl %%eax, %0;"
        :"=r"(y)  /* y is output operand */
        :"r"(x)       /* x is input operand */
        :"%eax"); /* %eax is clobbered register */
}
</pre>
</td>
</tr>
</tbody>
</table>
<p>在该例中，x 的值复制为 &#8220;asm&#8221; 中的 y。x 和 y 都通过存储在寄存器中传递给 &#8220;asm&#8221;。为该例生成的汇编代码如下：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>main:
pushl %ebp
movl %esp,%ebp
subl $8,%esp
movl $10,-4(%ebp)
movl -4(%ebp),%edx  /* x=10 is stored in %edx */
#APP    /* asm starts here */
movl %edx, %eax     /* x is moved to %eax */
movl %eax, %edx     /* y is allocated in edx and updated */
#NO_APP /* asm ends here */
movl %edx,-8(%ebp)  /* value of y in stack is updated with 

 the value in %edx */
</pre>
</td>
</tr>
</tbody>
</table>
<p>当使用 &#8220;r&#8221; 约束时，GCC 在这里可以自由分配任何寄存器。在我们的示例中，它选择 %edx 来存储 x。在读取了 %edx 中 x 的值后，它为 y 也分配了相同的寄存器。</p>
<p>因为 y 是在输出操作数部分中指定的，所以 %edx 中更新的值存储在 -8(%ebp)，堆栈上 y 的位置中。如果 y 是在输入部分中指定的，那么即使它在 y 的临时寄存器存储值 (%edx) 中被更新，堆栈上 y 的值也不会更新。</p>
<p>因为 %eax 是在修饰列表中指定的，GCC 不在任何其它地方使用它来存储数据。</p>
<p>输入 x 和输出 y 都分配在同一个 %edx 寄存器中，假设输入在输出产生之前被消耗。请注意，如果您有许多指令，就不是这种情况了。要确保输入和输出分配到不同的寄存器中，可以指定 &amp; 约束修饰符。下面是添加了约束修饰符的示例。</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>int main(void)
{
    int x = 10, y;

    asm ("movl %1, %%eax;

 "movl %%eax, %0;"
        :"=&amp;r"(y) /* y is output operand, note the    

 &amp; constraint modifier. */
        :"r"(x)       /* x is input operand */
        :"%eax"); /* %eax is clobbered register */
}
</pre>
</td>
</tr>
</tbody>
</table>
<p>以下是为该示例生成的汇编代码，从中可以明显地看出 x 和 y 存储在 &#8220;asm&#8221; 中不同的寄存器中。</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>main:
pushl %ebp
movl %esp,%ebp
subl $8,%esp
movl $10,-4(%ebp)
movl -4(%ebp),%ecx  /* x, the input is in %ecx */
#APP
    movl %ecx, %eax
    movl %eax, %edx     /* y, the output is in %edx */
#NO_APP
movl %edx,-8(%ebp)
</pre>
</td>
</tr>
</tbody>
</table>
<div>
<hr /></div>
<h2><a name="9">特定寄存器约束的使用</a></h2>
<p>现在让我们看一下如何将个别寄存器作为操作数的约束指定。在下面的示例中，cpuid 指令采用 %eax 寄存器中的输入，然后在四个寄存器中给出输出：%eax、%ebx、%ecx、%edx。对 cpuid 的输入（变量 &#8220;op&#8221;）传递到 &#8220;asm&#8221; 的 eax 寄存器中，因为 cpuid 希望它这样做。在输出中使用 a、b、c 和 d 约束，分别收集四个寄存器中的值。</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>asm ("cpuid"
: "=a" (_eax),
"=b" (_ebx),
"=c" (_ecx),
"=d" (_edx)
: "a" (op));
</pre>
</td>
</tr>
</tbody>
</table>
<p>在下面可以看到为它生成的汇编代码（假设 _eax、_ebx 等&#8230; 变量都存储在堆栈上）：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>movl -20(%ebp),%eax /* store 'op' in %eax -- input */
#APP
cpuid
#NO_APP
movl %eax,-4(%ebp)  /* store %eax in _eax -- output */
movl %ebx,-8(%ebp)  /* store other registers in
movl %ecx,-12(%ebp)
 respective output variables */
movl %edx,-16(%ebp)
</pre>
</td>
</tr>
</tbody>
</table>
<p>strcpy 函数可以通过以下方式使用 &#8220;S&#8221; 和 &#8220;D&#8221; 约束来实现：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>asm ("cld\n

rep\n

movsb"

: /* no input */

:"S"(src), "D"(dst), "c"(count));
</pre>
</td>
</tr>
</tbody>
</table>
<p>通过使用 &#8220;S&#8221; 约束将源指针 src 放入 %esi 中，使用 &#8220;D&#8221; 约束将目的指针 dst 放入 %edi 中。因为 rep 前缀需要 count 值，所以将它放入 %ecx 中。</p>
<p>在下面可以看到另一个约束，它使用两个寄存器 %eax 和 %edx 将两个 32 位的值合并在一起，然后生成一个64 位的值：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>#define rdtscll(val) \
 __asm__ __volatile__ ("rdtsc" : "=A" (val))
The generated assembly looks like this (if val has a 64 bit memory space).
#APP
rdtsc
#NO_APP
movl %eax,-8(%ebp)  /* As a result of A constraint
movl %edx,-4(%ebp)
 %eax and %edx serve as outputs */
Note here that the values in %edx:%eax serve as 64 bit output.
</pre>
</td>
</tr>
</tbody>
</table>
<div>
<hr /></div>
<h2><a name="10">使用匹配约束</a></h2>
<p>在下面将看到系统调用的代码，它有四个参数：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \
: "=a" (__res) \
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \
"d" ((long)(arg3)),"S" ((long)(arg4))); \
__syscall_return(type,__res); \
}
</pre>
</td>
</tr>
</tbody>
</table>
<p>在上例中，通过使用 b、c、d 和 S 约束将系统调用的四个自变量放入 %ebx、%ecx、%edx 和 %esi 中。请注意，在输出中使用了 &#8220;=a&#8221; 约束，这样，位于 %eax 中的系统调用的返回值就被放入变量 __res 中。通过将匹配约束 &#8220;0&#8243; 用作输入部分中第一个操作数约束，syscall 号 __NR_##name 被放入 %eax 中，并用作对系统调用的输入。这样，这里的 %eax 既可以用作输入寄存器，又可以用作输出寄存器。没有其它寄存器用于这个目的。另请注意，输入（syscall 号）在产生输出（syscall 的返回值）之前被消耗（使用）。</p>
<div>
<hr /></div>
<h2><a name="11">内存操作数约束的使用</a></h2>
<p>请考虑下面的原子递减操作：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>__asm__ __volatile__(
"lock; decl %0"
:"=m" (counter)
:"m" (counter));
</pre>
</td>
</tr>
</tbody>
</table>
<p>为它生成的汇编类似于：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>#APP
    lock
    decl -24(%ebp) /* counter is modified on its memory location */
#NO_APP.
</pre>
</td>
</tr>
</tbody>
</table>
<p>您可能考虑在这里为 counter 使用寄存器约束。如果这样做，counter 的值必须先复制到寄存器，递减，然后对其内存更新。但这样您会无法理解锁定和原子性的全部意图，这些明确显示了使用内存约束的必要性。</p>
<div>
<hr /></div>
<h2><a name="12">使用修饰寄存器</a></h2>
<p>请考虑内存拷贝的基本实现。</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>   asm ("movl $count, %%ecx;

up: lodsl;  

stosl;

loop up;"
        :           /* no output */
        :"S"(src), "D"(dst) /* input */
        :"%ecx", "%eax" );  /* clobbered list */
</pre>
</td>
</tr>
</tbody>
</table>
<p>当 lodsl 修改 %eax 时，lodsl 和 stosl 指令隐含地使用它。%ecx 寄存器明确装入 count。但 GCC 在我们通知它以前是不知道这些的，我们是通过将 %eax 和 %ecx 包括在修饰寄存器集中来通知 GCC 的。在完成这一步之前，GCC 假设 %eax 和 %ecx 是自由的，它可能决定将它们用作存储其它的数据。请注意，%esi 和 %edi 由 &#8220;asm&#8221; 使用，它们不在修饰列表中。这是因为已经声明 &#8220;asm&#8221; 将在输入操作数列表中使用它们。这里最低限度是，如果在 &#8220;asm&#8221; 内部使用寄存器（无论是明确还是隐含地），既不出现在输入操作数列表中，也不出现在输出操作数列表中，必须将它列为修饰寄存器。</p>
<p>原文地址：http://www.ibm.com/developerworks/cn/linux/sdk/assemble/inline/index.html#main</p>
<div>
<hr /></div>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/1001/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>soso 和 sogou 网页player循环方式提示对比</title>
		<link>http://yaronspace.cn/blog/archives/993</link>
		<comments>http://yaronspace.cn/blog/archives/993#comments</comments>
		<pubDate>Tue, 30 Nov 2010 05:54:28 +0000</pubDate>
		<dc:creator>Yvonne</dc:creator>
				<category><![CDATA[Project Management]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=993</guid>
		<description><![CDATA[soso player: sogou player: soso player 比 sogou player 多了一个顺序循环的方式，应该是顺序播放列表中的内容，最后一个播完后停止。sogou player 没有此功能，但从我的角度出发，一点儿都不介意这个功能，如果可以顺序播放一个列表中的内容，播放完是否重新播放第一个都无所谓，甚至列表循环和顺序两者我更喜欢列表循环的方式。 sogou的循环方式用小图标全部显示在页面中，且设计上通俗易懂，并且辅助悬浮Tooltips提示，比较喜欢。]]></description>
			<content:encoded><![CDATA[<p>soso player:</p>
<p><a href="http://www.yaronspace.cn/blog/wp-content/uploads/2010/11/qqplayer.jpg"><img class="alignnone size-full wp-image-994" title="qqplayer" src="http://www.yaronspace.cn/blog/wp-content/uploads/2010/11/qqplayer.jpg" alt="" width="626" height="377" /></a></p>
<p>sogou player:</p>
<p><a href="http://www.yaronspace.cn/blog/wp-content/uploads/2010/11/sogouplayer.jpg"><img class="alignnone size-full wp-image-995" title="sogouplayer" src="http://www.yaronspace.cn/blog/wp-content/uploads/2010/11/sogouplayer.jpg" alt="" width="626" height="377" /></a></p>
<p>soso player 比 sogou player 多了一个顺序循环的方式，应该是顺序播放列表中的内容，最后一个播完后停止。sogou player 没有此功能，但从我的角度出发，一点儿都不介意这个功能，如果可以顺序播放一个列表中的内容，播放完是否重新播放第一个都无所谓，甚至列表循环和顺序两者我更喜欢列表循环的方式。</p>
<p>sogou的循环方式用小图标全部显示在页面中，且设计上通俗易懂，并且辅助悬浮Tooltips提示，比较喜欢。</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/993/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>康神之网站那些事</title>
		<link>http://yaronspace.cn/blog/archives/991</link>
		<comments>http://yaronspace.cn/blog/archives/991#comments</comments>
		<pubDate>Thu, 25 Nov 2010 05:17:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[LAMP与网站架构]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[网站架构]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=991</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<div><object id="ssss" width="480" height="370" ><param name="allowScriptAccess" value="always" /><embed pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://you.video.sina.com.cn/api/sinawebApi/outplayrefer.php/vid=42166796_1700099614/s.swf" type="application/x-shockwave-flash" name="ssss" allowFullScreen="true" allowScriptAccess="always" width="480" height="370"></embed></object></div>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/991/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>程序员眼中的编程语言</title>
		<link>http://yaronspace.cn/blog/archives/985</link>
		<comments>http://yaronspace.cn/blog/archives/985#comments</comments>
		<pubDate>Mon, 22 Nov 2010 02:28:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[业界趣闻轶事]]></category>
		<category><![CDATA[编程语言]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=985</guid>
		<description><![CDATA[下图是一个搞笑的图片——程序员眼中的编程语言。 图片的横轴是编程语言。 纵轴是各语言的程序员、粉丝、信徒。 中间的各个小图片则是，粉丝眼中的编程语言的形象。 比如说， 第一行第一列，是Java程序员看Java语言的样子，一幢现代化的大厦。 第一行第二列，是Java程序员看C语言，一个年老过时的骨灰级老头。 当然，C程序员看Java语言也比较搞，见第二行第一列。呵呵。 其它的大家自己看吧。还有另外一个关于操作系统的《粉丝眼中的操作系统》]]></description>
			<content:encoded><![CDATA[<p>下图是一个搞笑的图片——程序员眼中的编程语言。</p>
<ul>
<li>图片的横轴是编程语言。</li>
<li>纵轴是各语言的程序员、粉丝、信徒。</li>
<li>中间的各个小图片则是，粉丝眼中的编程语言的形象。</li>
</ul>
<p>比如说，</p>
<ul>
<li>第一行第一列，是Java程序员看Java语言的样子，一幢现代化的大厦。</li>
<li>第一行第二列，是Java程序员看C语言，一个年老过时的骨灰级老头。</li>
<li>当然，C程序员看Java语言也比较搞，见第二行第一列。呵呵。</li>
</ul>
<p>其它的大家自己看吧。还有另外一个关于操作系统的《<a rel="bookmark" href="http://coolshell.cn/articles/1998.html">粉丝眼中的操作系统</a>》</p>
<p><img title="程序员眼中的编程语言" src="http://coolshell.cn/wp-content/uploads/2009/12/language-fanboys.jpg" alt="程序员眼中的编程语言" width="575" height="420" /></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/985/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>poj3691分析与解题报告</title>
		<link>http://yaronspace.cn/blog/archives/959</link>
		<comments>http://yaronspace.cn/blog/archives/959#comments</comments>
		<pubDate>Sun, 21 Nov 2010 14:16:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[AC自动机]]></category>
		<category><![CDATA[poj3691]]></category>
		<category><![CDATA[状态dp]]></category>
		<category><![CDATA[解题报告]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=959</guid>
		<description><![CDATA[题目链接：http://poj.org/problemstatus?problem_id=3691 题目大意 给定一系列代表疾病的DNA序列，同时已知一条DNA序列，计算改变最少的DNA序列来使这个DNA序列不包含疾病的DNA序列 例如： AAA AAG #前面两列代表疾病的DNA序列 AAAG #正常的DNA序列 输出：1 #修改第三个字符即可 解题思路 AC自动机+状态dp 首先由desease的DNA序列，构造出Trie树即AC自动机，也可以叫做DFA图，每个节点代表一种状态，然后利用状态转移的动态规划方法，dp[i][j] 表示到目标串的第 i 个字符，DFA 状态为 j 时的最小修改数量，具体方程分为两种，已知dp[i-1][j]： 1，child[sequence[i]] 状态j的匹配第i个字符的子节点 &#38;&#38; !is_danger dp[i][child[sequence[i]]] = min{dp[i][child[sequence[j]]], dp[i-1][j]} 2，状态j的其他子节点 &#38;&#38; is_danger dp[i][other_child] = min{dp[i][other_child], dp[i-1][other_child] + 1} 最后在所有的dp[len-1][j] &#38;&#38;!is_danger 中找到 最小的值极为所求 C CODE/* * Author: liyangguang &#60;liyangguang@software.ict.ac.cn&#62; * http://www.yaronspace.cn/blog * * File: 3691.cc * Create]]></description>
			<content:encoded><![CDATA[<p>题目链接：<a href="http://poj.org/problemstatus?problem_id=3691" target="_blank">http://poj.org/problemstatus?problem_id=3691</a></p>
<h3><strong>题目大意</strong></h3>
<p>给定一系列代表疾病的DNA序列，同时已知一条DNA序列，计算改变最少的DNA序列来使这个DNA序列不包含疾病的DNA序列</p>
<p>例如：</p>
<pre>AAA
AAG
#前面两列代表疾病的DNA序列

AAAG #正常的DNA序列

输出：1     #修改第三个字符即可</pre>
<h3><strong>解题思路</strong></h3>
<p>AC自动机+状态dp<br />
首先由desease的DNA序列，构造出Trie树即AC自动机，也可以叫做DFA图，每个节点代表一种状态，然后利用状态转移的动态规划方法，dp[i][j] 表示到目标串的第 i 个字符，DFA 状态为 j 时的最小修改数量，具体方程分为两种，已知dp[i-1][j]：<br />
1，child[sequence[i]] 状态j的匹配第i个字符的子节点 &amp;&amp; !is_danger<br />
<strong>dp[i][child[sequence[i]]] = min{dp[i][child[sequence[j]]], dp[i-1][j]}</strong><br />
2，状态j的其他子节点 &amp;&amp; is_danger<br />
<strong>dp[i][other_child] = min{dp[i][other_child], dp[i-1][other_child] + 1}</strong></p>
<p>最后在所有的dp[len-1][j] &amp;&amp;!is_danger  中找到 最小的值极为所求<br />
<span id="more-959"></span></p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/*
 * Author: liyangguang &lt;liyangguang@software.ict.ac.cn&gt;
 * http://www.yaronspace.cn/blog
 *
 * File: 3691.cc
 * Create Date: 2010-11-14 20:34:41
 *
 */</span>
<span style="color: #339933;">#include &lt;iostream&gt;</span>
<span style="color: #339933;">#include &lt;vector&gt;</span>
<span style="color: #339933;">#include &lt;queue&gt;</span>
<span style="color: #339933;">#include &lt;string&gt;</span>
<span style="color: #339933;">#include &lt;vector&gt;</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
<span style="color: #339933;">#define MAX_STR_LEN 1001</span>
<span style="color: #339933;">#define MAX_NODES 800</span>
using namespace std<span style="color: #339933;">;</span>
<span style="color: #993333;">struct</span> TrieNode <span style="color: #009900;">&#123;</span>
    TrieNode <span style="color: #339933;">*</span>next<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>     
    TrieNode <span style="color: #339933;">*</span>fail<span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// 是否是边界</span>
    <span style="color: #993333;">int</span> isdanger<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> index<span style="color: #339933;">;</span>
    TrieNode<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>fail<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>isdanger<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>index<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        memset<span style="color: #009900;">&#40;</span>next<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>next<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
class TrieTree
<span style="color: #009900;">&#123;</span>
    public<span style="color: #339933;">:</span>
        TrieNode <span style="color: #339933;">*</span>root<span style="color: #339933;">;</span>
        vector<span style="color: #339933;">&lt;</span>TrieNode <span style="color: #339933;">*&gt;</span> node_list<span style="color: #339933;">;</span>
        TrieTree<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>root<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> Init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
        <span style="color: #993333;">void</span> Init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #993333;">void</span> Insert<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> string<span style="color: #339933;">&amp;</span> str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// 构造fail指针</span>
        <span style="color: #993333;">void</span> BuildTrieTree<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        virtual ~TrieTree<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">inline</span> <span style="color: #993333;">int</span> id<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> ch<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span>ch<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'A'</span><span style="color: #339933;">:</span><span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'T'</span><span style="color: #339933;">:</span><span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'G'</span><span style="color: #339933;">:</span><span style="color: #b1b100;">return</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'C'</span><span style="color: #339933;">:</span><span style="color: #b1b100;">return</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #993333;">void</span>
TrieTree<span style="color: #339933;">::</span><span style="color: #202020;">Init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    root <span style="color: #339933;">=</span> new TrieNode<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    root<span style="color: #339933;">-&gt;</span>index <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    node_list.<span style="color: #202020;">push_back</span><span style="color: #009900;">&#40;</span>root<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #993333;">void</span>
TrieTree<span style="color: #339933;">::</span><span style="color: #202020;">Insert</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> string<span style="color: #339933;">&amp;</span> str<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> size <span style="color: #339933;">=</span> str.<span style="color: #202020;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    TrieNode <span style="color: #339933;">*</span>r <span style="color: #339933;">=</span> root<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> size<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>j<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        i <span style="color: #339933;">=</span> id<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>r<span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            r<span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> new TrieNode<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            r<span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>index <span style="color: #339933;">=</span> node_list.<span style="color: #202020;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            node_list.<span style="color: #202020;">push_back</span><span style="color: #009900;">&#40;</span>r<span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        r <span style="color: #339933;">=</span> r<span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    r<span style="color: #339933;">-&gt;</span>isdanger <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #993333;">void</span> 
TrieTree<span style="color: #339933;">::</span><span style="color: #202020;">BuildTrieTree</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    TrieNode<span style="color: #339933;">*</span> r <span style="color: #339933;">=</span> root<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
    queue<span style="color: #339933;">&lt;</span>TrieNode <span style="color: #339933;">*&gt;</span> q<span style="color: #339933;">;</span>
    root<span style="color: #339933;">-&gt;</span>fail <span style="color: #339933;">=</span> root<span style="color: #339933;">;</span>
    q.<span style="color: #202020;">push</span><span style="color: #009900;">&#40;</span>root<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>q.<span style="color: #202020;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        p <span style="color: #339933;">=</span> q.<span style="color: #202020;">front</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        q.<span style="color: #202020;">pop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        p<span style="color: #339933;">-&gt;</span>isdanger <span style="color: #339933;">=</span> p<span style="color: #339933;">-&gt;</span>isdanger <span style="color: #339933;">||</span> p<span style="color: #339933;">-&gt;</span>fail<span style="color: #339933;">-&gt;</span>isdanger<span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                p<span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">==</span> root<span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> root <span style="color: #339933;">:</span> p<span style="color: #339933;">-&gt;</span>fail<span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #b1b100;">else</span>
            <span style="color: #009900;">&#123;</span>
                p<span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>fail <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">==</span> root<span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> root <span style="color: #339933;">:</span> p<span style="color: #339933;">-&gt;</span>fail<span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                q.<span style="color: #202020;">push</span><span style="color: #009900;">&#40;</span>p<span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
TrieTree<span style="color: #339933;">::</span>~TrieTree<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    vector<span style="color: #339933;">&lt;</span>TrieNode <span style="color: #339933;">*&gt;::</span><span style="color: #202020;">iterator</span> itr<span style="color: #339933;">;</span>
    itr <span style="color: #339933;">=</span> node_list.<span style="color: #202020;">begin</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">;</span> itr <span style="color: #339933;">!=</span> node_list.<span style="color: #202020;">end</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;++</span>itr<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        delete <span style="color: #339933;">*</span>itr<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    node_list.<span style="color: #202020;">clear</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #993333;">void</span> 
checkmin<span style="color: #009900;">&#40;</span>int<span style="color: #339933;">&amp;</span> a<span style="color: #339933;">,</span><span style="color: #993333;">int</span> b<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">==-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> a<span style="color: #339933;">=</span>b<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">&gt;</span>b<span style="color: #009900;">&#41;</span> a<span style="color: #339933;">=</span>b<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">//记录状态方程的信息</span>
<span style="color: #993333;">int</span> dp<span style="color: #009900;">&#91;</span>MAX_STR_LEN<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>MAX_NODES<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span>
build_dp<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">string</span> <span style="color: #339933;">&amp;</span>sequences<span style="color: #339933;">,</span> TrieTree <span style="color: #339933;">*</span>tree<span style="color: #009900;">&#41;</span> 
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">,</span> k<span style="color: #339933;">;</span>
    memset<span style="color: #009900;">&#40;</span>dp<span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>dp<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>tree<span style="color: #339933;">-&gt;</span>node_list<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>id<span style="color: #009900;">&#40;</span>sequences<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>isdanger<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        dp<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>tree<span style="color: #339933;">-&gt;</span>node_list<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>id<span style="color: #009900;">&#40;</span>sequences<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">!=</span> id<span style="color: #009900;">&#40;</span>sequences<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span>tree<span style="color: #339933;">-&gt;</span>node_list<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>isdanger<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            dp<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>tree<span style="color: #339933;">-&gt;</span>node_list<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>i <span style="color: #339933;">&lt;</span> sequences.<span style="color: #202020;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>j <span style="color: #339933;">&lt;</span> tree<span style="color: #339933;">-&gt;</span>node_list.<span style="color: #202020;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>j<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>dp<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>tree<span style="color: #339933;">-&gt;</span>node_list<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>id<span style="color: #009900;">&#40;</span>sequences<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>isdanger<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    checkmin<span style="color: #009900;">&#40;</span>dp<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>tree<span style="color: #339933;">-&gt;</span>node_list<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>id<span style="color: #009900;">&#40;</span>sequences<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>index<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> dp<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>k <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> k <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>k<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>k <span style="color: #339933;">!=</span> id<span style="color: #009900;">&#40;</span>sequences<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span>tree<span style="color: #339933;">-&gt;</span>node_list<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>isdanger<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        checkmin<span style="color: #009900;">&#40;</span>dp<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>tree<span style="color: #339933;">-&gt;</span>node_list<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>next<span style="color: #009900;">&#91;</span>k<span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>index<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> dp<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #993333;">int</span> ans <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">&lt;&lt;</span><span style="color: #0000dd;">20</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i <span style="color: #339933;">&lt;</span> tree<span style="color: #339933;">-&gt;</span>node_list.<span style="color: #202020;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>tree<span style="color: #339933;">-&gt;</span>node_list<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span>isdanger <span style="color: #339933;">&amp;&amp;</span> dp<span style="color: #009900;">&#91;</span>sequences.<span style="color: #202020;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">&amp;&amp;</span> dp<span style="color: #009900;">&#91;</span>sequences.<span style="color: #202020;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;</span> ans<span style="color: #009900;">&#41;</span>
            ans <span style="color: #339933;">=</span> dp<span style="color: #009900;">&#91;</span>sequences.<span style="color: #202020;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> ans <span style="color: #339933;">==</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">&lt;&lt;</span><span style="color: #0000dd;">20</span> <span style="color: #339933;">?</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span> <span style="color: #339933;">:</span> ans<span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span>
<span style="color: #993333;">int</span> 
main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> cases <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> n <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">string</span> disease<span style="color: #339933;">,</span> seq<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>cin <span style="color: #339933;">&gt;&gt;</span>n <span style="color: #339933;">&amp;&amp;</span> n <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        TrieTree <span style="color: #339933;">*</span>tree <span style="color: #339933;">=</span> new TrieTree<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i <span style="color: #339933;">&lt;</span> n<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            cin <span style="color: #339933;">&gt;&gt;</span>disease<span style="color: #339933;">;</span>
            tree<span style="color: #339933;">-&gt;</span>Insert<span style="color: #009900;">&#40;</span>disease<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        tree<span style="color: #339933;">-&gt;</span>BuildTrieTree<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        cin <span style="color: #339933;">&gt;&gt;</span> seq<span style="color: #339933;">;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Case %d: %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>cases<span style="color: #339933;">++,</span> build_dp<span style="color: #009900;">&#40;</span>seq<span style="color: #339933;">,</span> tree<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        delete tree<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* vim: set ts=4 sw=4: */</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/959/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gdb调试程序之查看运行时数据【五】</title>
		<link>http://yaronspace.cn/blog/archives/972</link>
		<comments>http://yaronspace.cn/blog/archives/972#comments</comments>
		<pubDate>Sat, 20 Nov 2010 09:44:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[display]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[print]]></category>
		<category><![CDATA[查看运行时数据]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=972</guid>
		<description><![CDATA[在用gdb调试程序时，当程序运行到之前设置的断点时，很容易想到的操作就是查看当前变量的值，而gdb可以很轻易地满足的你的需求的~~ 在gdb中最常用的命令就是print(简写p)，具体格式如下： print &#60;expr&#62; print/f &#60;expr&#62; f代表输出的格式 x 按十六进制格式显示变量 d 按十进制格式显示变量 u 按十六进制格式显示无符号整型 o 按八进制格式显示变量 t 按二进制格式显示变量 a 按十六进制格式显示变量 c 按字符格式显示变量 f 按浮点数格式显示变量 表达式 print命令可以接受表达式，其中表达式的定义遵循C/C++语法，需要注意的是表达式中不能出现程序中定义的宏表达式；同时在gdb表达式中，还支持以下三种特殊的操作符： @ 是一个和数组有关的操作符，在后面会有更详细的说明 :: 指定一个在文件或是一个函数中的变量，注意与C++语法中的::操作符的区分 {} 表示一个指向内存地址的类型为type的一个对象 程序变量的定位 在GDB中，查看以下三种变量的值： 1、全局变量（所有文件可见的） 2、静态全局变量（当前文件可见的） 3、局部变量（当前Scope可见的） 如果出现局部变量和全局变量相互冲突时，局部变量会覆盖全局变量，可以使用::限制符来查看全局变量 file::variable function::variable 注意事项：如果在编译时加入了编译优化选项，即-O3选项，编译器会修改你的程序，同时可能查看不同某些变量，这时在调试时建议把优化选项关掉，即-O0 动态数组 你需要查看一段连续的内存空间的值。比如数组的一段，或是动态分配的数据的大小。你可以使用GDB的“@”操作符，“@”的左边是第一个内存的地址的值，“@”的右边则你你想查看内存的长度。例如，你的程序中有这样的语句： int *array = (int *) malloc (len * sizeof (int)); 于是，在GDB调试过程中，你可以以如下命令显示出这个动态数组的取值： p *array@len]]></description>
			<content:encoded><![CDATA[<p>在用gdb调试程序时，当程序运行到之前设置的断点时，很容易想到的操作就是查看当前变量的值，而gdb可以很轻易地满足的你的需求的~~</p>
<p>在gdb中最常用的命令就是<strong>print</strong>(简写p)，具体格式如下：</p>
<pre>print &lt;expr&gt;
print/f &lt;expr&gt;  f代表输出的格式
 x 按十六进制格式显示变量
 d 按十进制格式显示变量
 u 按十六进制格式显示无符号整型
 o 按八进制格式显示变量
 t 按二进制格式显示变量
 a 按十六进制格式显示变量
 c 按字符格式显示变量
 f 按浮点数格式显示变量
</pre>
<h2><strong>表达式</strong></h2>
<p>print命令可以接受表达式，其中表达式的定义遵循C/C++语法，需要注意的是表达式中不能出现程序中定义的宏表达式；同时在gdb表达式中，还支持以下三种特殊的操作符：</p>
<pre>@       是一个和数组有关的操作符，在后面会有更详细的说明
::      指定一个在文件或是一个函数中的变量，注意与C++语法中的::操作符的区分
{}      表示一个指向内存地址的类型为type的一个对象
</pre>
<h2><span id="more-972"></span></h2>
<h2><strong>程序变量的定位</strong></h2>
<p>在GDB中，查看以下三种变量的值：<br />
1、全局变量（所有文件可见的）<br />
2、静态全局变量（当前文件可见的）<br />
3、局部变量（当前Scope可见的）</p>
<p>如果出现局部变量和全局变量相互冲突时，局部变量会覆盖全局变量，可以使用::限制符来查看全局变量</p>
<pre>file::variable
function::variable
</pre>
<p><span style="color: #ff0000;">注意事项：如果在编译时加入了编译优化选项，即-O3选项，编译器会修改你的程序，同时可能查看不同某些变量，这时在调试时建议把优化选项关掉，即-O0</span></p>
<h2><span style="color: #ff0000;"><span style="color: #000000;"> </span><strong><span style="color: #000000;">动态数组</span></strong></span></h2>
<p>你需要查看一段连续的内存空间的值。比如数组的一段，或是动态分配的数据的大小。你可以使用GDB的“@”操作符，“@”的左边是第一个内存的地址的值，“@”的右边则你你想查看内存的长度。例如，你的程序中有这样的语句：</p>
<pre>int *array = (int *) malloc (len * sizeof (int));
</pre>
<p>于是，在GDB调试过程中，你可以以如下命令显示出这个动态数组的取值：</p>
<pre>p *array@len
</pre>
<p>@的左边是数组的首地址的值，也就是变量array所指向的内容，右边则是数据的长度，其保存在变量len中，其输出结果，大约是下面这个样子的：</p>
<pre>(gdb) p *array@len
$1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40}
</pre>
<h2><strong>查看内存</strong></h2>
<p>gdb中可以使用examine命令来查看内存内容，简写为x，使用方法如下：</p>
<pre>x/&lt;n/f/u&gt; &lt;addr&gt;
  n、f、u是可选的参数。
  n 是一个正整数，表示显示内存的长度，也就是说从当前地址向后显示几个地址的内容。
  f 表示显示的格式，参见上面。如果地址所指的是字符串，那么格式可以是s，如果地十是指令地址，那么格式可以是i。
  u 表示从当前地址往后请求的字节数，如果不指定的话，GDB默认是4个bytes。u参数可以用下面的字符来代替，b表示单字节，h表示双字节，w表示四字节，g表示八字节。
    当我们指定了字节长度后，GDB会从指内存定的内存地址开始，读写指定字节，并把其当作一个值取出来。
  &lt;addr&gt;表示一个内存地址。
</pre>
<p>例如</p>
<pre>x/3uh 0x54320  从内存地址0x54320读取内容，h表示以双字节为一个单位，3表示三个单位，u表示按十六进制显示
</pre>
<h2><strong>自动显示</strong></h2>
<p>在gdb中，你可以设置当程序停在断点处时，自动显示变量的内容，即display命令，使用如下：</p>
<pre> display &lt;expr&gt;
 display/&lt;fmt&gt; &lt;expr&gt;
 display/&lt;fmt&gt; &lt;addr&gt;
 expr是一个表达式，fmt表示显示的格式，addr表示内存地址
</pre>
<p><span style="color: #ff0000;">一个非常有用的命令，显示源码与机器码的对应：</span></p>
<pre>display/i $pc
$pc是GDB的环境变量，表示着指令的地址，/i则表示输出格式为机器指令码，也就是汇编。于是当程序停下后，就会出现源代码和机器指令码相对应的情形
</pre>
<p>与display管理相关的命令：</p>
<pre>undisplay
delete display
disable display
enable display
info display  查看display设置的自动显示的信息
</pre>
<h2><strong>查看寄存器</strong></h2>
<pre>info registers            查看寄存器的情况。（除了浮点寄存器）
info all-registers        查看所有寄存器的情况。（包括浮点寄存器）
info registers       查看所指定的寄存器的情况
</pre>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/972/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gdb调试程序之栈和源码信息【四】</title>
		<link>http://yaronspace.cn/blog/archives/968</link>
		<comments>http://yaronspace.cn/blog/archives/968#comments</comments>
		<pubDate>Mon, 15 Nov 2010 12:47:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[函数栈信息]]></category>
		<category><![CDATA[搜索源码]]></category>
		<category><![CDATA[源码信息]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=968</guid>
		<description><![CDATA[显示栈信息 当程序停在你设置的断点处时，你首先需要看的是函数调用的过程即函数调用栈，及每层栈中函数的名称、参数和局部变量等信息，这时可以用gdb提供的backtrace(bt)来查看函数调用栈信息 backtrace &#60;n&#62;， bt &#60;n&#62; n是一个正整数，表示只打印栈顶上n层的栈信息。 backtrace &#60;-n&#62; ，bt &#60;-n&#62; -n表一个负整数，表示只打印栈底下n层的栈信息。 (gdb) bt #0 func (n=250) at tst.c:6 #1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30 #2 0x400409ed in __libc_start_main () from /lib/libc.so.6 从上可以看出函数的调用栈信息：__libc_start_main &#8211;&#62; main() &#8211;&#62; func() 如果你要查看某一层的信息，你需要在切换当前的栈，一般来说，程序停止时，最顶层的栈就是当前栈，如果你要查看栈下面层的详细信息，首先要做的是切换当前栈，此时可以用frame命令来进行切换 frame &#60;n&#62; 是一个从0开始的整数，是栈中的层编号。比如：frame 0，表示栈顶，frame 1，表示栈的第二层。 up 表示向栈的上面移动n层，可以不打n，表示向上移动一层。 down 表示向栈的下面移动n层，可以不打n，表示向下移动一层。 当切换到某个某层frame时，可以使用info命令来查看当前函数的具体信息 info frame 显示当前frame的详细信息 info args]]></description>
			<content:encoded><![CDATA[<h2><strong>显示栈信息</strong></h2>
<p>当程序停在你设置的断点处时，你首先需要看的是函数调用的过程即函数调用栈，及每层栈中函数的名称、参数和局部变量等信息，这时可以用gdb提供的backtrace(bt)来查看函数调用栈信息</p>
<pre>backtrace &lt;n&gt;， bt &lt;n&gt; n是一个正整数，表示只打印栈顶上n层的栈信息。

backtrace &lt;-n&gt; ，bt &lt;-n&gt; -n表一个负整数，表示只打印栈底下n层的栈信息。
</pre>
<pre>   (gdb) bt
        #0 func (n=250) at tst.c:6
        #1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30
        #2 0x400409ed in __libc_start_main () from /lib/libc.so.6
</pre>
<p>从上可以看出函数的调用栈信息：__libc_start_main &#8211;&gt; main() &#8211;&gt; func()</p>
<p>如果你要查看某一层的信息，你需要在切换当前的栈，一般来说，程序停止时，最顶层的栈就是当前栈，如果你要查看栈下面层的详细信息，首先要做的是切换当前栈，此时可以用frame命令来进行切换</p>
<pre>frame &lt;n&gt;   是一个从0开始的整数，是栈中的层编号。比如：frame 0，表示栈顶，frame 1，表示栈的第二层。
up          表示向栈的上面移动n层，可以不打n，表示向上移动一层。

down        表示向栈的下面移动n层，可以不打n，表示向下移动一层。
</pre>
<p>当切换到某个某层frame时，可以使用info命令来查看当前函数的具体信息</p>
<pre>info frame  显示当前frame的详细信息
info args    显示函数的参数的详细信息
info locals     打印出当前函数中所有局部变量及其值
info catch      打印出当前的函数中的异常处理信息
</pre>
<h2><span id="more-968"></span></h2>
<h2><strong>显示源代码</strong></h2>
<p>GDB 可以打印出所调试程序的源代码，当然，在程序编译时一定要加上-g的参数，把源程序信息编译到执行文件中，具体可以使用list命令来查看源代码程序</p>
<pre>list + 参数
一般来说在list后面可以跟以下这们的参数：
   行号。
    &lt;+offset&gt;   当前行号的正偏移量
    &lt;-offset&gt;   当前行号的负偏移量
     哪个文件的哪一行
     函数名
     哪个文件中的哪个函数
    &lt;*address&gt; 程序运行时的语句在内存中的地址
</pre>
<h3><strong>搜索源代码</strong></h3>
<p>GDB还提供了源代码搜索的命令：</p>
<pre>forward-search ，search         向前面搜索。
reverse-search  全部搜索。
</pre>
<p>其中是正则表达式，也主一个字符串的匹配模式</p>
<p>用-g编译过后的执行程序中只是包括了源文件的名字，没有路径名。GDB提供了可以让你指定源文件的路径的命令，以便GDB进行搜索。</p>
<pre>directory    加一个源文件路径到当前路径的前面
directory                      清除所有的自定义的源文件搜索路径信息
show directories            显示定义了的源文件搜索路径
</pre>
<p>使用info line命令来查看源代码在内存中的地址</p>
<pre>(gdb) info line tst.c:func
        Line 5 of "tst.c" starts at address 0x8048456  and ends at 0x804845d .
</pre>
<p>disassemble命令可以查看当前程序的机器码即汇编指令</p>
<pre>(gdb) disassemble func
        Dump of assembler code for function func:
        0x8048450 :       push   %ebp
        0x8048451 :     mov    %esp,%ebp
        0x8048453 :     sub    $0x18,%esp
        0x8048456 :     movl   $0x0,0xfffffffc(%ebp)
        0x804845d :    movl   $0x1,0xfffffff8(%ebp)
        0x8048464 :    mov    0xfffffff8(%ebp),%eax
</pre>
<p>下面一篇文章将介绍如何查看运行时的数据</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/968/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>gdb调试程序之单步调试【三】</title>
		<link>http://yaronspace.cn/blog/archives/961</link>
		<comments>http://yaronspace.cn/blog/archives/961#comments</comments>
		<pubDate>Mon, 15 Nov 2010 12:18:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[单步调试]]></category>
		<category><![CDATA[断点管理]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=961</guid>
		<description><![CDATA[断点维护 在gdb中，如果觉得设置的断点已经没有用处了，可以使用delete clair  disable&#124;enable 对断点进行操作 clear         清除所有的已定义的停止点。 clear &#60;function&#62;，clear &#60;filename:function&#62;        清除所有设置在函数上的停止点。 clear &#60;linenum&#62;，clear &#60;filename:linenum&#62;        清除所有设置在指定行上的停止点。 delete [breakpoints] [range...]        删除指定的断点，breakpoints为断点号。如果不指定断点号，则表示删除所有的断点。range 表示断点号的范围（如：3-7）。其简写命令为d。 比删除更好的方法是disable停止点，disable了的停止点，GDB不会删除，当你还需要时，enable即可. disable [breakpoints] [range...] disable所指定的停止点，breakpoints为停止点号。如果什么都不指定，表示disable所有的停止点。简写命令是dis. enable [breakpoints] [range...] enable所指定的停止点，breakpoints为停止点号。 enable [breakpoints] once range... enable所指定的停止点一次，当程序停止后，该停止点马上被GDB自动disable。 enable [breakpoints] delete range... enable所指定的停止点一次，当程序停止后，该停止点马上被GDB自动删除。 条件断点维护 在前面一篇文章提到，可以使用b &#60;function_name&#62; if condition 来设置条件断点，当条件成立时，程序自动停止； 同时我们可以使用condition命令来修改条件（只有break和watch命令支持if，catch目前暂不支持if）； condition &#60;bnum&#62; &#60;expression&#62;         修改断点号为bnum的停止条件为expression。 condition &#60;bnum&#62;        清除断点号为bnum的停止条件。 还有一个比较特殊的维护命令ignore，你可以指定程序运行时，忽略停止条件几次。 ignore]]></description>
			<content:encoded><![CDATA[<h2><strong>断点维护</strong></h2>
<p>在gdb中，如果觉得设置的断点已经没有用处了，可以使用delete clair  disable|enable 对断点进行操作</p>
<pre>clear         清除所有的已定义的停止点。

clear &lt;function&gt;，clear &lt;filename:function&gt;        清除所有设置在函数上的停止点。

clear &lt;linenum&gt;，clear &lt;filename:linenum&gt;        清除所有设置在指定行上的停止点。

delete [breakpoints] [range...]        删除指定的断点，breakpoints为断点号。如果不指定断点号，则表示删除所有的断点。range 表示断点号的范围（如：3-7）。其简写命令为d。
</pre>
<p>比删除更好的方法是disable停止点，disable了的停止点，GDB不会删除，当你还需要时，enable即可.</p>
<pre>
disable [breakpoints] [range...]
disable所指定的停止点，breakpoints为停止点号。如果什么都不指定，表示disable所有的停止点。简写命令是dis.

enable [breakpoints] [range...]
enable所指定的停止点，breakpoints为停止点号。

enable [breakpoints] once range...
enable所指定的停止点一次，当程序停止后，该停止点马上被GDB自动disable。

enable [breakpoints] delete range...
enable所指定的停止点一次，当程序停止后，该停止点马上被GDB自动删除。
</pre>
<p><span id="more-961"></span></p>
<h2><strong>条件断点维护</strong></h2>
<p>在前面一篇文章提到，可以使用b &lt;function_name&gt; if condition 来设置条件断点，当条件成立时，程序自动停止；</p>
<p>同时我们可以使用condition命令来修改条件（只有break和watch命令支持if，catch目前暂不支持if）；</p>
<pre>
condition &lt;bnum&gt; &lt;expression&gt;         修改断点号为bnum的停止条件为expression。

condition &lt;bnum&gt;        清除断点号为bnum的停止条件。
还有一个比较特殊的维护命令ignore，你可以指定程序运行时，忽略停止条件几次。

ignore &lt;bnum&gt; &lt;count&gt;        表示忽略断点号为bnum的停止条件count次。

为停止点设置运行命令</pre>
<p>我们可以使用gdb提供的command 来为停止点处设置运行命令，即当程序运行到断点处时，会自动运行先前使用command来设置的命令，这样很方便来进行自动化调试；</p>
<pre>commands [bnum]
... command-list ...
end</pre>
<p>为断点号bnum指写一个命令列表。当程序被该断点停住时，gdb会依次运行命令列表中的命令。<br />
例如：</p>
<pre>break foo if x&gt;0
commands
printf "x is %d\n",x
continue
end</pre>
<h2><strong>恢复程序运行和单步调试</strong></h2>
<p>当程序运行到断点处时，程序被挺住，这时可以使用continue命令使程序继续运行，next或者step命令进行单步跟踪</p>
<pre>continue [ignore-count]
c [ignore-count]
fg [ignore-count]
</pre>
<p>恢复程序运行，直到程序结束，或是下一个断点到来。ignore-count表示忽略其后的断点次数</p>
<pre>step
</pre>
<p>单步跟踪，如果有函数调用，他会进入该函数。进入函数的前提是，此函数被编译有debug信息，后面可以加count也可以不加，不加表示一条条地执行，加表示执行后面的count条指令，然后再停住</p>
<pre>set step-mode，set step-mode on
</pre>
<p>打开step-mode模式，于是，在进行单步跟踪时，程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码</p>
<pre>next <count>
</pre>
<p>单步运行count 条指令，count默认值为1</p>
<pre>finish
</pre>
<p>运行程序，直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。</p>
<pre>until
</pre>
<p>可以运行程序直到退出循环体</p>
<pre>stepi 或 si，nexti 或 ni
</pre>
<p>单步跟踪一条机器指令！一条程序代码有可能由数条机器指令完成，stepi和nexti可以单步执行机器指令</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/961/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>poj2513分析与解题报告</title>
		<link>http://yaronspace.cn/blog/archives/956</link>
		<comments>http://yaronspace.cn/blog/archives/956#comments</comments>
		<pubDate>Sun, 14 Nov 2010 11:28:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[poj2513]]></category>
		<category><![CDATA[Trie树]]></category>
		<category><![CDATA[并查集]]></category>
		<category><![CDATA[欧拉路]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=956</guid>
		<description><![CDATA[题目大意： 给定一系列sticks,每个木棒的两端都涂有颜色，判断是否能够找到将所有的木棒连接起来的方法，使相互连接的木棒的两端的颜色是相同的？ 题目链接：http://poj.org/problem?id=2513 解题思路 知识考查点：1，字典树；2，欧拉路：其中又考察了判断是否为连通图；3，并查集 可以将木棒间的关系抽象为一个无向图，无向图的边即代表一根木棒，节点代表木棒两端的颜色 现在要解决的问题是找到一条路径，遍历图的每条边一次，即欧拉路问题 要存在欧拉路就要满足： 1.该图必须是一个连通图 2.该图每个点的度数要么全为偶数，要么有且仅有两个点的度数为奇数 解决方法 1，给所有的颜色进行编号，同时计算所有颜色节点的度数（在木棒断点出现的次数）；这里我试了两种选择： 1&#62;一种是map进行映射，颜色作为key, 2&#62; 还有就是构建Trie树，判断节点是否出现过 在实际编程过程中，使用map提交时超时，最后只好选择Trie树这种更高效率的查找方法 2，使用并查集来检验图的连通性，关于并查集的概念请google之 3，计算所有节点的度数，然后判断是否满足欧拉路的第二个条件 参考资料 1，关于并查集：http://hi.baidu.com/fandywang_jlu/blog/item/b49e40893ddbb0b00f244485.html 2，关于欧拉路：http://hi.baidu.com/luyade1987/blog/item/f2304d0fd6b4922f6059f3ab.html/cmtid/79f3bcecb3b02a30269791b1]]></description>
			<content:encoded><![CDATA[<h2><strong>题目大意：</strong></h2>
<p>给定一系列sticks,每个木棒的两端都涂有颜色，判断是否能够找到将所有的木棒连接起来的方法，使相互连接的木棒的两端的颜色是相同的？</p>
<p>题目链接：<a href="http://poj.org/problem?id=2513" target="_blank">http://poj.org/problem?id=2513</a></p>
<h2><strong>解题思路</strong></h2>
<p>知识考查点：1，<strong>字典树</strong>；2，<strong>欧拉路</strong>：其中又考察了判断是否为连通图；3，<strong>并查集</strong></p>
<p>可以将木棒间的关系抽象为一个无向图，无向图的边即代表一根木棒，节点代表木棒两端的颜色</p>
<p><a href="http://www.yaronspace.cn/blog/wp-content/uploads/2010/11/5cd4cccfg58c9a90fa373.jpg"><img class="alignnone size-full wp-image-957" title="5cd4cccfg58c9a90fa373" src="http://www.yaronspace.cn/blog/wp-content/uploads/2010/11/5cd4cccfg58c9a90fa373.jpg" alt="" width="401" height="340" /></a></p>
<p>现在要解决的问题是找到一条路径，遍历图的每条边一次，即欧拉路问题</p>
<p>要存在欧拉路就要满足：</p>
<p>1.该图必须是一个连通图</p>
<p>2.该图每个点的度数要么全为偶数，要么有且仅有两个点的度数为奇数</p>
<h2><strong>解决方法</strong></h2>
<p>1，给所有的颜色进行编号，同时计算所有颜色节点的度数（在木棒断点出现的次数）；这里我试了两种选择：</p>
<p>1&gt;一种是map进行映射，颜色作为key,</p>
<p>2&gt; 还有就是构建Trie树，判断节点是否出现过</p>
<p>在实际编程过程中，使用map提交时<span style="color: #ff0000;">超时，<span style="color: #000000;">最后只好选择Trie树这种更高效率的查找方法</span></span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">2，使用并查集来检验图的连通性，关于并查集的概念请google之</span></span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">3，计算所有节点的度数，然后判断是否满足欧拉路的第二个条件</span></span></p>
<h2></h2>
<h2><span style="color: #ff0000;"><span style="color: #000000;"><strong>参考资料</strong></span></span></h2>
<p><span style="color: #ff0000;"><span style="color: #000000;">1，关于并查集：</span></span>http://hi.baidu.com/fandywang_jlu/blog/item/b49e40893ddbb0b00f244485.html</p>
<p>2，关于欧拉路：http://hi.baidu.com/luyade1987/blog/item/f2304d0fd6b4922f6059f3ab.html/cmtid/79f3bcecb3b02a30269791b1</p>
<p><span style="color: #ff0000;"><span style="color: #000000;"><strong><br />
</strong></span></span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;"><strong><br />
</strong></span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/956/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>理想服务员</title>
		<link>http://yaronspace.cn/blog/archives/951</link>
		<comments>http://yaronspace.cn/blog/archives/951#comments</comments>
		<pubDate>Thu, 11 Nov 2010 12:53:54 +0000</pubDate>
		<dc:creator>Yvonne</dc:creator>
				<category><![CDATA[生活感悟]]></category>
		<category><![CDATA[理想]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=951</guid>
		<description><![CDATA[你想想，你小时候的志向是什么？你再看看你现在一天都忙啥呢？ 你把理想给丢啦！！]]></description>
			<content:encoded><![CDATA[<p><embed src="http://player.youku.com/player.php/sid/XMTM2ODIzNTU2/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed></p>
<p>你想想，你小时候的志向是什么？你再看看你现在一天都忙啥呢？</p>
<p>你把理想给丢啦！！</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/951/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gdb调试程序系统之断点设置【二】</title>
		<link>http://yaronspace.cn/blog/archives/946</link>
		<comments>http://yaronspace.cn/blog/archives/946#comments</comments>
		<pubDate>Wed, 10 Nov 2010 03:46:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[断点设置]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=946</guid>
		<description><![CDATA[调试程序时，暂停程序运行时首要任务，在gdb中有以下几种暂停方法：断点（BreakPoint）、观察点（WatchPoint）、捕捉点（CatchPoint）、信号（Signals）、线程停止（Thread Stops） 设置断点 break &#60;function&#62; 在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名 break &#60;linenum&#62; 在指定行号停住 break +offset break -offset 在当前行号的前面或后面的offset行停住。offset为自然数 break filename:linenum 在源文件filename的linenum行处停住 break filename:function 在源文件filename的function函数的入口处停住 break *address 在程序运行的内存地址处停住 break break命令没有参数时，表示在下一条指令处停住 break &#8230; if &#60;condition&#62; &#8230;可以是上述的参数，condition表示条件，在条件成立时停住。比如在循环境体中，可以设置break if i=100，表示当i为100时停住程序 info breakpoints [n] info break [n] 查看断点时，可使用info命令，如下所示：（注：n表示断点号） 设置观察点 观察点一般来观察某个表达式（变量也是一种表达式）的值是否有变化了，如果有变化，马上停住程序。我们有下面的几种方法来设置观察点： watch &#60;expr&#62;    为表达式（变量）expr设置一个观察点。一量表达式值有变化时，马上停住程序。 rwatch &#60;expr&#62;   当表达式（变量）expr被读时，停住程序。 awatch &#60;expr&#62;   当表达式（变量）的值被读或被写时，停住程序。 info watchpoints 列出当前所设置了的所有观察点。 设置捕捉点 catch]]></description>
			<content:encoded><![CDATA[<p>调试程序时，暂停程序运行时首要任务，在gdb中有以下几种暂停方法：断点（BreakPoint）、观察点（WatchPoint）、捕捉点（CatchPoint）、信号（Signals）、线程停止（Thread Stops）</p>
<h2><strong>设置断点</strong></h2>
<table border="1" cellspacing="0" cellpadding="7" width="665">
<tbody>
<tr>
<td width="124"><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">break    &lt;function&gt;</span></span></td>
<td width="511"><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">在进入指定函数时停住。</span></span><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">C++</span></span><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">中可以使用</span></span><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">class::function</span></span><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">或</span></span><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">function(type,type)</span></span><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">格式来指定函数名</span></span></td>
</tr>
<tr>
<td width="124"><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">break    &lt;linenum&gt;</span></span></td>
<td width="511"><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">在指定行号停住</span></span></td>
</tr>
<tr>
<td width="124"><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">break    +offset</span></span></p>
<p><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">break    -offset</span></span></td>
<td width="511"><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">在当前行号的前面或后面的</span></span><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">offset</span></span><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">行停住。</span></span><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">offset</span></span><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">为自然数</span></span></td>
</tr>
<tr>
<td width="124"><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">break    filename:linenum</span></span></td>
<td width="511"><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">在源文件</span></span><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">filename</span></span><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">的</span></span><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">linenum</span></span><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">行处停住</span></span></td>
</tr>
<tr>
<td width="124"><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">break    filename:function</span></span></td>
<td width="511"><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">在源文件</span></span><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">filename</span></span><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">的</span></span><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">function</span></span><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">函数的入口处停住</span></span></td>
</tr>
<tr>
<td width="124"><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">break    *address</span></span></td>
<td width="511"><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">在程序运行的内存地址处停住</span></span></td>
</tr>
<tr>
<td width="124"><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">break</span></span></td>
<td width="511"><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">break</span></span><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">命令没有参数时，表示在下一条指令处停住</span></span></td>
</tr>
<tr>
<td width="124"><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">break    &#8230; if &lt;condition&gt;</span></span></td>
<td width="511"><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">&#8230;</span></span><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">可以是上述的参数，</span></span><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">condition</span></span><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">表示条件，在条件成立时停住。比如在循环境体中，可以设置</span></span><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">break    if i=100</span></span><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">，表示当</span></span><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">i</span></span><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">为</span></span><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">100</span></span><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">时停住程序</span></span></td>
</tr>
<tr>
<td width="124"><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">info    breakpoints [n]</span></span></p>
<p><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">info    break [n]</span></span></td>
<td width="511"><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">查看断点时，可使用</span></span><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">info</span></span><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">命令，如下所示：（注：</span></span><span style="font-family: Arial,sans-serif;"><span style="font-size: x-small;">n</span></span><span style="font-family: 楷体_GB2312,monospace;"><span style="font-size: x-small;">表示断点号）</span></span></td>
</tr>
</tbody>
</table>
<h2><strong>设置观察点</strong></h2>
<p>观察点一般来观察某个表达式（变量也是一种表达式）的值是否有变化了，如果有变化，马上停住程序。我们有下面的几种方法来设置观察点：<br />
watch &lt;expr&gt;    为表达式（变量）expr设置一个观察点。一量表达式值有变化时，马上停住程序。<br />
rwatch &lt;expr&gt;   当表达式（变量）expr被读时，停住程序。<br />
awatch &lt;expr&gt;   当表达式（变量）的值被读或被写时，停住程序。<br />
info watchpoints 列出当前所设置了的所有观察点。<span id="more-946"></span></p>
<h2><strong>设置捕捉点</strong></h2>
<p>catch &lt;event&gt; 和tcatch &lt;event&gt; ，用help catch和help tcatch来看具体用法</p>
<h2><strong>信号(Signal)</strong></h2>
<p>信号是一种软中断，是一种处理异步事件的方法。一般来说，操作系统都支持许多信号。尤其是UNIX，比较重要应用程序一般都会处理信号。UNIX定义了许多信号，比如SIGINT表示中断字符信号，也就是Ctrl+C的信号，SIGBUS表示硬件故障的信号；SIGCHLD表示子进程状态改变信号；SIGKILL表示终止程序运行的信号，等等。信号量编程是UNIX下非常重要的一种技术。</p>
<p>GDB有能力在你调试程序的时候处理任何一种信号，你可以告诉GDB需要处理哪一种信号。你可以要求GDB收到你所指定的信号时，马上停住正在运行的程序，以供你进行调试。你可以用GDB的handle命令来完成这一功能。</p>
<p>handle &lt;signal&gt; &lt;keywords&#8230;&gt;<br />
在GDB中定义一个信号处理。信号&lt;signal&gt;可以以SIG开头或不以SIG开头，可以用定义一个要处理信号的范围（如：SIGIO-SIGKILL，表示处理从SIGIO信号到SIGKILL的信号，其中包括SIGIO，SIGIOT，SIGKILL三个信号），也可以使用关键字all来标明要处理所有的信号。一旦被调试的程序接收到信号，运行程序马上会被GDB停住，以供调试。其&lt;keywords&gt;可以是以下几种关键字的一个或多个。</p>
<p>Nostop 当被调试的程序收到信号时，GDB不会停住程序的运行，但会打出消息告诉你收到这种信号。<br />
stop 当被调试的程序收到信号时，GDB会停住你的程序。<br />
print 当被调试的程序收到信号时，GDB会显示出一条信息。<br />
noprint 当被调试的程序收到信号时，GDB不会告诉你收到信号的信息。<br />
pass，noignore 当被调试的程序收到信号时，GDB不处理信号。这表示，GDB会把这个信号交给被调试程序会处理。<br />
nopass，ignore 当被调试的程序收到信号时，GDB不会让被调试程序来处理这个信号。</p>
<p>info signals，info handle 查看有哪些信号在被GDB检测中。</p>
<h2><strong>线程(Thread Stop)</strong></h2>
<p>如果程序是多线程的话，你可以定义你的断点是否在所有的线程上，或是在某个特定的线程。GDB很容易帮你完成这一工作。</p>
<p>break &lt;linespec&gt; thread &lt;threadno&gt;<br />
break &lt;linespec&gt; thread &lt;threadno&gt; if &#8230;<br />
linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID，注意，这个ID是GDB分配的，你可以通过“info threads”命令来查看正在运行程序中的线程信息。如果你不指定thread &lt;threadno&gt;则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。如：<br />
(gdb) break frik.c:13 thread 28 if bartab &gt; lim</p>
<p>当你的程序被GDB停住时，所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时，所有的线程也会被恢复运行。那怕是主进程在被单步调试时。</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/946/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gdb调试程序系列之启动gdb【一】</title>
		<link>http://yaronspace.cn/blog/archives/942</link>
		<comments>http://yaronspace.cn/blog/archives/942#comments</comments>
		<pubDate>Wed, 10 Nov 2010 03:28:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[调试]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=942</guid>
		<description><![CDATA[首先需要在gcc或者g++编译时加入-g选项，这个程序才能将调试信息加入到执行程序中 其次需要把编译优化选项去掉，加入-O0选项，否则的话编译会修改你的源程序，调试时出现诡异的问题； 启动gdb的方法 1、gdb &#60;program&#62; program也就是你的执行文件，一般在当然目录下。 2、gdb &#60;program&#62; core 用gdb同时调试一个运行程序和core文件，core是程序非法执行后core dump后产生的文件。 3、gdb &#60;program&#62; &#60;PID&#62; 如果你的程序是一个服务程序，那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去，并调试他。program应该在PATH环境变量中搜索得到。或者是进入gdb后，通过attach PID命令，将调试进程加入到gdb中 gdb启动时常用开关选项 -symbols &#60;file&#62; -s &#60;file&#62; 从指定文件中读取符号表。 -se file 从指定文件中读取符号表信息，并把他用在可执行文件中。 -core &#60;file&#62; -c &#60;file&#62; 调试时core dump的core文件。 -directory &#60;directory&#62; -d &#60;directory&#62; 加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径]]></description>
			<content:encoded><![CDATA[<p>首先需要在gcc或者g++编译时加入-g选项，这个程序才能将调试信息加入到执行程序中</p>
<p>其次需要把编译优化选项去掉，加入-O0选项，否则的话编译会修改你的源程序，调试时出现诡异的问题；</p>
<h2><strong>启动gdb的方法</strong></h2>
<p><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">1</span></span><span style="font-size: x-small;">、</span><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">gdb &lt;program&gt;<br />
program</span></span><span style="font-size: x-small;">也就是你的执行文件，一般在当然目录下。</span></p>
<p><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">2</span></span><span style="font-size: x-small;">、</span><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">gdb &lt;program&gt; core<br />
</span></span><span style="font-size: x-small;">用</span><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">gdb</span></span><span style="font-size: x-small;">同时调试一个运行程序和</span><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">core</span></span><span style="font-size: x-small;">文件，</span><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">core</span></span><span style="font-size: x-small;">是程序非法执行后</span><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">core dump</span></span><span style="font-size: x-small;">后产生的文件。</span></p>
<p><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">3</span></span><span style="font-size: x-small;">、</span><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">gdb &lt;program&gt; &lt;PID&gt;<br />
</span></span><span style="font-size: x-small;">如果你的程序是一个服务程序，那么你可以指定这个服务程序运行时的进程</span><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">ID</span></span><span style="font-size: x-small;">。</span><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">gdb</span></span><span style="font-size: x-small;">会自动</span><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">attach</span></span><span style="font-size: x-small;">上去，并调试他。</span><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">program</span></span><span style="font-size: x-small;">应该在</span><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">PATH</span></span><span style="font-size: x-small;">环境变量中搜索得到。或者是进入gdb后，通过attach PID命令，将调试进程加入到gdb中</span></p>
<pre><span style="font-size: x-small;">gdb启动时常用开关选项
</span>
<span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">-symbols &lt;file&gt;
 -s &lt;file&gt;
 </span></span><span style="font-size: x-small;">从指定文件中读取符号表。</span>

<span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">-se file
 </span></span><span style="font-size: x-small;">从指定文件中读取符号表信息，并把他用在可执行文件中。</span>

<span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">-core &lt;file&gt;
 -c &lt;file&gt;
 </span></span><span style="font-size: x-small;">调试时</span><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">core dump</span></span><span style="font-size: x-small;">的</span><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">core</span></span><span style="font-size: x-small;">文件。</span>
 <span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">-directory &lt;directory&gt;
 -d &lt;directory&gt;
 </span></span><span style="font-size: x-small;">加入一个源文件的搜索路径。默认搜索路径是环境变量中</span><span style="font-family: 文鼎PL简报宋,serif;"><span style="font-size: x-small;">PATH</span></span><span style="font-size: x-small;">所定义的路径</span>
</pre>
<p><span style="font-size: x-small;"><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/942/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>更换blog的模板</title>
		<link>http://yaronspace.cn/blog/archives/938</link>
		<comments>http://yaronspace.cn/blog/archives/938#comments</comments>
		<pubDate>Tue, 09 Nov 2010 14:19:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[业界趣闻轶事]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=938</guid>
		<description><![CDATA[今天更换下blog的模板，同时把Wordpress 升级到3.0.1, 总体上这个模板感觉还比较好 下载地址：http://wordpress.org/extend/themes/mystique]]></description>
			<content:encoded><![CDATA[<p>今天更换下blog的模板，同时把Wordpress 升级到3.0.1,</p>
<p>总体上这个模板感觉还比较好</p>
<p>下载地址：http://wordpress.org/extend/themes/mystique</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/938/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>字符串匹配AC自动机 和 矩阵乘法</title>
		<link>http://yaronspace.cn/blog/archives/934</link>
		<comments>http://yaronspace.cn/blog/archives/934#comments</comments>
		<pubDate>Sun, 07 Nov 2010 14:29:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[acm]]></category>
		<category><![CDATA[AC自动机]]></category>
		<category><![CDATA[poj]]></category>
		<category><![CDATA[trie]]></category>
		<category><![CDATA[矩阵乘法]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=934</guid>
		<description><![CDATA[今天搞了一个poj 2778 ，解决方法是AC自动机(Trie树)和矩阵乘法，对于AC自动机的机制理解还不是很清楚，发现算法能力还是太弱了，对着别人的代码居然看不懂。。。。。 先记录下相关资料 1，http://blog.chinaunix.net/u3/113538/showart_2212716.html 2，http://cool8511.blog.hexun.com/29903963_d.html 3，http://www.matrix67.com/blog/archives/276 4，http://www.cppblog.com/RyanWang/archive/2010/01/13/105559.html 类似题目：poj3691  poj 2513]]></description>
			<content:encoded><![CDATA[<p>今天搞了一个poj 2778 ，解决方法是AC自动机(Trie树)和矩阵乘法，对于AC自动机的机制理解还不是很清楚，发现算法能力还是太弱了，对着别人的代码居然看不懂。。。。。</p>
<p>先记录下相关资料</p>
<p>1，http://blog.chinaunix.net/u3/113538/showart_2212716.html</p>
<p>2，http://cool8511.blog.hexun.com/29903963_d.html</p>
<p>3，http://www.matrix67.com/blog/archives/276</p>
<p>4，http://www.cppblog.com/RyanWang/archive/2010/01/13/105559.html</p>
<p>类似题目：poj3691  poj 2513</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/934/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于增量模型和迭代模型的区别</title>
		<link>http://yaronspace.cn/blog/archives/931</link>
		<comments>http://yaronspace.cn/blog/archives/931#comments</comments>
		<pubDate>Sun, 07 Nov 2010 12:50:27 +0000</pubDate>
		<dc:creator>Yvonne</dc:creator>
				<category><![CDATA[Project Management]]></category>
		<category><![CDATA[增量模型]]></category>
		<category><![CDATA[迭代模型]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=931</guid>
		<description><![CDATA[迭代模型和增量模型都属于并行开发的软件生命周期模型，但是这两个模型大家往往容易混淆或者不好理解。下面对两个模型的区别和相同之处做一下介绍。 迭代是不能并行的，迭代的并行是指迭代任务，比如从3.1-3.31号是一个迭代计划，该迭代计划需求人员可以分析功能点5-功能点10，设计人员可以做功 能点3-功能点7的设计，开发人员可以做功能点2-功能点4的开发，测试人员可以做上个迭代周期发布的代码。  迭代的并行是指工作流的并行。 大家看到迭代计划是比较复杂的，因此对项目经理的经验要求很高。 增量模型一般是指具有底层框架和平台的项目，在该稳定的框架和平台上，来开发和增加具体的业务功能。每个增量之间相对独立，各个增量可以并行开发， 比如：3.1-31号实现增量1（包含5的功能点），3.20-4.15开发增量2（包含另外的4个功能点）。增量内部是瀑布模型。 两种类型的区别在于迭代是基于IBM的RUP的以架构为核心，用例为驱动，角色职责划分不同，在同一时刻项目内部需求、设计、编码、测试的活动都在发生。迭代适合需求不明确、架构风险大的项目，增量适合需求比较明确，架构比较稳定，而且增量功能的实现基本不影响架构。 还有一个不同就是迭代计划是基于角色的，增量计划是基于任务的。 两种类型的相同之处，每个迭代和增量结束后都有产品发布。 转自 http://blog.csdn.net/li_hualing/archive/2007/03/07/1522988.aspx]]></description>
			<content:encoded><![CDATA[<p><cite></cite>迭代模型和增量模型都属于并行开发的软件生命周期模型，但是这两个模型大家往往容易混淆或者不好理解。下面对两个模型的区别和相同之处做一下介绍。</p>
<div>
<p>迭代是不能并行的，迭代的并行是指迭代任务，比如从3.1-3.31号是一个迭代计划，该迭代计划需求人员可以分析功能点5-功能点10，设计人员可以做功 能点3-功能点7的设计，开发人员可以做功能点2-功能点4的开发，测试人员可以做上个迭代周期发布的代码。  迭代的并行是指工作流的并行。<br />
大家看到迭代计划是比较复杂的，因此对项目经理的经验要求很高。</p>
<p>增量模型一般是指具有底层框架和平台的项目，在该稳定的框架和平台上，来开发和增加具体的业务功能。每个增量之间相对独立，各个增量可以并行开发， 比如：3.1-31号实现增量1（包含5的功能点），3.20-4.15开发增量2（包含另外的4个功能点）。增量内部是瀑布模型。</p>
<p>两种类型的区别在于迭代是基于IBM的RUP的以架构为核心，用例为驱动，角色职责划分不同，在同一时刻项目内部需求、设计、编码、测试的活动都在发生。迭代适合需求不明确、架构风险大的项目，增量适合需求比较明确，架构比较稳定，而且增量功能的实现基本不影响架构。<br />
还有一个不同就是迭代计划是基于角色的，增量计划是基于任务的。</p>
<p>两种类型的相同之处，每个迭代和增量结束后都有产品发布。</p>
<p>转自 http://blog.csdn.net/li_hualing/archive/2007/03/07/1522988.aspx</p></div>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/931/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>虚拟机迁移技术漫谈【两篇不错的文章】</title>
		<link>http://yaronspace.cn/blog/archives/926</link>
		<comments>http://yaronspace.cn/blog/archives/926#comments</comments>
		<pubDate>Thu, 04 Nov 2010 09:22:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[虚拟化技术KVM]]></category>
		<category><![CDATA[kvm]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[虚拟机迁移]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=926</guid>
		<description><![CDATA[虚拟机的迁移技术，为虚拟机的管理提供更方便的支持，可以在不间断服务的情况下，将虚拟机从host A 迁移到 host B! 虚拟机迁移分为三类： P2V : 物理机到虚拟机的迁移 V2V: 虚拟机到虚拟机的迁移 【这个感觉用户还是最大的】 V2P: 虚拟机到物理机的迁移 这个应该是不错的研究和实践方向。 下面是有关虚拟机的迁移和KVM具体实践的文章， 虚拟机迁移技术漫谈，第 1 部分 KVM 虚拟机在物理主机之间迁移的实现 Linux 虚拟化技术]]></description>
			<content:encoded><![CDATA[<p>虚拟机的迁移技术，为虚拟机的管理提供更方便的支持，可以在不间断服务的情况下，将虚拟机从host A 迁移到 host B!</p>
<p>虚拟机迁移分为三类：</p>
<p>P2V : 物理机到虚拟机的迁移</p>
<p>V2V: 虚拟机到虚拟机的迁移 【这个感觉用户还是最大的】</p>
<p>V2P: 虚拟机到物理机的迁移</p>
<p>这个应该是不错的研究和实践方向。</p>
<p>下面是有关虚拟机的迁移和KVM具体实践的文章，</p>
<h1><a href="http://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm1/index.html?ca=drs-" target="_blank">虚拟机迁移技术漫谈，第 1 部分</a></h1>
<p><br/></p>
<h1><a href="http://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm2/index.html" target="_blank">KVM 虚拟机在物理主机之间迁移的实现</a></h1>
<p><br/></p>
<h1><a href="http://www.ibm.com/developerworks/cn/linux/theme/virtualization/index.html" target="_blank">Linux 虚拟化技术</a></h1>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/926/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2010 Linux Journal读者选择奖揭晓[CSDN]</title>
		<link>http://yaronspace.cn/blog/archives/924</link>
		<comments>http://yaronspace.cn/blog/archives/924#comments</comments>
		<pubDate>Wed, 03 Nov 2010 08:58:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=924</guid>
		<description><![CDATA[完整的榜单如下（提名奖按名次排序）： 最佳Linux发行版 Ubuntu 提名： PCLinuxOS, Debian, Fedora, Pardus 最佳上网本/受限设备发行版 Ubuntu Netbook Remix 提名：Google Android, MeeGo, Puppy, PclinuxOS LXDE 最佳手机系统 Google Android 提名： MeeGo, Symbian, Maemo, Moblin 最佳桌面环境 GNOME 和 KDE 提名：Xfce, LXDE, Fluxbox 最佳Web浏览器 FireFox 提名： Chrome, Opera, Konqueror, Mozilla Seamonkey 最佳Email客户端 Thunderbird 提名：Gmail Web客户端, Kmail, Evolution, mutt 最佳IM客户端 Pidgin 提名： Skype, Kopete, empathy, amsn]]></description>
			<content:encoded><![CDATA[<p>完整的榜单如下（提名奖按名次排序）：</p>
<p><strong>最佳Linux发行版</strong><strong> Ubuntu</strong></p>
<p>提名： PCLinuxOS, Debian, Fedora, Pardus</p>
<p><strong>最佳上网本/受限设备发行版</strong><strong> Ubuntu Netbook Remix</strong></p>
<p>提名：Google Android, MeeGo, Puppy, PclinuxOS LXDE</p>
<p><strong>最佳手机系统</strong><strong> Google Android</strong></p>
<p>提名： MeeGo, Symbian, Maemo, Moblin</p>
<p><strong>最佳桌面环境</strong><strong> GNOME 和 KDE </strong></p>
<p>提名：Xfce, LXDE, Fluxbox</p>
<p><strong>最佳Web浏览器</strong><strong> FireFox</strong></p>
<p>提名： Chrome, Opera, Konqueror, Mozilla Seamonkey</p>
<p><strong>最佳Email客户端</strong><strong> Thunderbird</strong></p>
<p>提名：Gmail Web客户端, Kmail, Evolution, mutt</p>
<p><strong>最佳IM客户端</strong><strong> Pidgin</strong></p>
<p>提名： Skype, Kopete, empathy, amsn</p>
<p><strong>最佳IRC客户端 Pidgin</strong></p>
<p>提名： Xchat, irssi, konversation, Quassel</p>
<p><strong>最佳微博客户端 Gwibber</strong></p>
<p>提名：Choqok, Jaiku, Spaz, Nitwit</p>
<p><span id="more-924"></span></p>
<p><strong>最佳办公套件 OpenOffice</strong></p>
<p>提名：Google Docs, KOffice, IBM Lotus Symphony, GNOME Office</p>
<p><strong>最佳独立办公软件 Openoffice.org Writer</strong></p>
<p>提名：AbiWord, OOCalc, Scribus, KWord</p>
<p><strong>最佳图像/设计工具 GIMP</strong></p>
<p>提名：InkScape, Blender, Krita</p>
<p><strong>最佳数码照片管理工具 digiKam </strong></p>
<p>提名：Picasa, F-spot, GwenView, gThumb</p>
<p><strong>最佳音频工具 Audacity</strong></p>
<p>提名：Ardour, LMMS, VLC, Jokosher</p>
<p><strong>最佳音频播放器 Amarok</strong></p>
<p>提名：RythmBox, XMMS, Banshee, SongBird</p>
<p><strong>最佳多媒体(视频)播放器 VLC</strong></p>
<p>提名：Mplayer, SMPlayer, Kaffeine, Totem</p>
<p><strong>最佳书签同步工具 Xmarks</strong></p>
<p>提名：Delicious, Weave, Google Chrome Bookmarks Sync</p>
<p><strong>最佳在线协作工具 Google Docs</strong></p>
<p>提名：Wikis, Google Wave, Zimbra, eGroupware</p>
<p><strong>最佳云存储 Dropbox</strong></p>
<p>提名： Ubuntu one, Amazon S3, ownCloud, SpiderOak</p>
<p><strong>最适合孩子的软件 Tux Paint</strong></p>
<p>提名：GCompris, Scratch, Tux Typing, Tux Math Command</p>
<p><strong>最佳游戏 <a href="http://www.frozen-bubble.org/">Frozen Bubble</a></strong></p>
<p>提名：Doom, Battle for Wesnoth, Tux Racer, Enemy Territory Quake Wars</p>
<p><strong>最佳数据库 MySQL</strong></p>
<p>提名：PostgreSQL, SQLite, Oracle, Firebird</p>
<p><strong>最佳备份方案 rsync</strong></p>
<p>提名：tar, Bacula, Amanda, Simple Linux Backup</p>
<p><strong>最佳虚拟化解决方案 VirtualBox </strong></p>
<p>提名： VMware, KVM, Xen, QEMU</p>
<p><strong>最佳监控工具 Nagios</strong></p>
<p>提名：Zabbix, Zenoss Core, Hyperic, Ganglia</p>
<p><strong>最佳版本控制系统 git</strong></p>
<p>提名：Apache Subversion, cvs, bazzaar,mercurial</p>
<p><strong>最佳编程语言 Python</strong></p>
<p>提名： C++, Java, C, Perl</p>
<p><strong>最佳脚本语言 Python</strong></p>
<p>提名：PHP，bash，Perl，Ruby</p>
<p><strong>最佳IDE Eclipse</strong></p>
<p>提名：KDevelop, NetBeans, QT creator, Vim</p>
<p><strong>最佳开源配置管理工具 Puppet </strong></p>
<p>提名：OpenQRM, Cfengine, Chef, Bcfg2</p>
<p><strong>最佳RIA开发平台 Adobe AIR</strong></p>
<p>提名：JavaFx, Google Gears, OpenLaszlo, Mono Moonlight</p>
<p><strong>最佳包管理工具 apt</strong></p>
<p>提名：synaptic, yum, aptitude, Pisi</p>
<p><strong>最佳开源CMS WordPress</strong></p>
<p>提名：Drupal, Joomla, Alfresco, Plone</p>
<p><strong>最佳Linux支持主机提供商 Godaddy.com</strong></p>
<p>提名：Contegix, Dreamhost, 1&amp;1, Rackspace</p>
<p><strong>最佳Linux笔记本供应商 Dell</strong></p>
<p>提名: 联想, 华硕, 宏碁, EmperorLinux</p>
<p><strong>最佳Linux桌面电脑供应商 Dell</strong></p>
<p>提名：HP, System76, Penguin Computing, ZaReason</p>
<p><strong>最佳Linux服务器供应商 IBM</strong></p>
<p>提名：Dell, HP, SUN, System 76</p>
<p><strong>最佳Linux图书 《Linux in Nutshell》 </strong></p>
<p>提名：《Running Linux》, 《Linux Bible》, 《Linux for Dummies》,  《Understanding the Linux Kernel》</p>
<p><strong>最佳Linux专栏 <a href="http://www.linuxjournal.com/googlesearch?cx=014164207538395607518:w82fvojcgcu&amp;cof=FORID:11&amp;as_q=hack+and+/&amp;sa=Search#922">Hack  and / by Kyle Rankin</a> </strong></p>
<p>提名：Paranoid Penguin by Mick Bauer，Work the Shell by Dave Taylor，At  the Forge by Reuven Lerner, diff -u by Zack Brown</p>
<p><strong>最佳视频芯片品牌 NVidia</strong></p>
<p>提名：ATI, Intel, VIA</p>
<p><strong>最佳Linux手机 Nokia N900</strong></p>
<p>提名：HTC Nexus One, Motorola Droid , HTC Droid ,HTC EVO</p>
<p><strong>最佳Linux数码产品 Amazon Kindle</strong></p>
<p>提名：Tom Tom Navigation System，Nokia N810 Tablet ,Sheeva Plug ,Archos</p>
<p><strong>最佳新开源项目 MeeGo</strong></p>
<p>提名：Owncloud, Android, CoffeeSaint, rekonq</p>
<p><strong>最佳新商业软件 Fluendo DVD Player</strong></p>
<p>提名：CodeWeavers CrossOver Office for Linux, Nero Linux ,Zenoss  Enterprise, Softmark office Suite</p>
<p><strong>年度产品 Android</strong></p>
<p>提名：KDE, Fluendo DVD Player, zabbix, Pardus</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/924/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>组织过程资产</title>
		<link>http://yaronspace.cn/blog/archives/916</link>
		<comments>http://yaronspace.cn/blog/archives/916#comments</comments>
		<pubDate>Tue, 02 Nov 2010 12:57:43 +0000</pubDate>
		<dc:creator>Yvonne</dc:creator>
				<category><![CDATA[Project Management]]></category>
		<category><![CDATA[组织过程资产]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=916</guid>
		<description><![CDATA[什么是组织过程资产 组织过程资产指一个学习型组织在项目操作过程中所积累的无形资产。组织过程资产的累积程度是衡量一个项目组织管理体系成熟度的重要指标，项目组织在实践中形成自己独特的过程资产，构成组织的核心竞争力。 组织过程资产的内容 组织过程资产主要包括但不限于以下内容： 项目组织在项目管理过程中指定的各种规章制度、指导方针、规范标准、操作程序、工作流程、行为准则和工具方法等。 项目组织在项目操作过程中所获得的经验和教训，其中既包括已经形成文字的档案，也包括留在团队成员脑子中没有形成文字的思想。 项目组织在项目管理过程中形成的所有文档，包括知识资料库、文档模板、标准化的表格、风险清单等。 项目组织在以往的项目操作过程中留下的历史信息。 组织过程资产的构成 组织过程资产由两类构成： 一、组织指导工作的过程和程序： 组织的标准过程，例如标准，政策（如安全和健康政策），标准产品和项目生命周期，质量方针和程序（如过程审核，目标改进，检查清单，以及应用于组织中的标准化过程定义） 标准化的指导方针，工作结构，提案评价标准，以及工作状况测量标准 模板（如风险模板，工作分解结构模板，项目进度网络图模板） 为了满足项目的特殊要求，组织标准过程中采用的指导方针和标准要作适当的修剪 组织通讯需求（如明确可用的通信技术，被许可的传播媒体，录音记录和安全需要） 项目收尾的指导方针或需求（如最终的项目审计，项目评价，产品确认和认可标准） 财政控制程序（如时间报告，必要的花费和支出复核，会计法规，标准合同规定） 问题和缺陷管理过程定义了问题和缺陷控制、鉴别、处理决定和活动条目跟踪 变更控制过程，包括了修改正式的公司标准，政策，计划，过程（或任何项目文档）。以及批准和生效任何改动时遵循的步骤 风险控制过程，包括风险种类，确定概率及其后果，以及概率和后果的矩阵。 批准和发布工作授权的程序 二、存储和检索信息的组织公用知识库： 过程测量数据库是用来收集和提供测量过程和产品的数据 项目文件（如范围，成本，质量基线，执行情况测量基线，项目日历，项目进度网络图，风险登记，计划应对活动，以及定义风险影响） 历史信息和来自知识库的教训（如项目报告和文档，项目收尾信息和文件，跟以前所有项目选择和执行情况有关的信息，以及风险管理努力的信息） 问题和缺陷管理数据库，包含了问题和缺陷的状态，控制信息，问题和缺陷解决方案和行动结果 结构管理知识数据，包含了对所有正式的公司标准、政策、程序和任何项目文档的释义和基线 财政数据库，包含诸如劳动时间、花费成本、预算和任何项目费用超支的信息 转自 http://wiki.mbalib.com/]]></description>
			<content:encoded><![CDATA[<h3>什么是组织过程资产</h3>
<p>组织过程资产指一个学习型组织在项目操作过程中所积累的无形资产。组织过程资产的累积程度是衡量一个项目组织管理体系成熟度的重要指标，项目组织在实践中形成自己独特的过程资产，构成组织的核心竞争力。</p>
<h3>组织过程资产的内容</h3>
<p>组织过程资产主要包括但不限于以下内容：</p>
<ul>
<li>项目组织在项目管理过程中指定的各种规章制度、指导方针、规范标准、操作程序、工作流程、行为准则和工具方法等。</li>
<li>项目组织在项目操作过程中所获得的经验和教训，其中既包括已经形成文字的档案，也包括留在团队成员脑子中没有形成文字的思想。</li>
<li>项目组织在项目管理过程中形成的所有文档，包括知识资料库、文档模板、标准化的表格、风险清单等。</li>
<li>项目组织在以往的项目操作过程中留下的历史信息。</li>
</ul>
<h3>组织过程资产的构成</h3>
<p>组织过程资产由两类构成：</p>
<h4>一、组织指导工作的过程和程序：</h4>
<ul>
<li>组织的标准过程，例如标准，政策（如安全和健康政策），标准产品和项目生命周期，质量方针和程序（如过程审核，目标改进，检查清单，以及应用于组织中的标准化过程定义）</li>
<li>标准化的指导方针，工作结构，提案评价标准，以及工作状况测量标准</li>
<li>模板（如风险模板，工作分解结构模板，项目进度网络图模板）</li>
<li>为了满足项目的特殊要求，组织标准过程中采用的指导方针和标准要作适当的修剪</li>
<li>组织通讯需求（如明确可用的通信技术，被许可的传播媒体，录音记录和安全需要）</li>
<li>项目收尾的指导方针或需求（如最终的项目审计，项目评价，产品确认和认可标准）</li>
<li>财政控制程序（如时间报告，必要的花费和支出复核，会计法规，标准合同规定）</li>
<li>问题和缺陷管理过程定义了问题和缺陷控制、鉴别、处理决定和活动条目跟踪</li>
<li>变更控制过程，包括了修改正式的公司标准，政策，计划，过程（或任何项目文档）。以及批准和生效任何改动时遵循的步骤</li>
<li>风险控制过程，包括风险种类，确定概率及其后果，以及概率和后果的矩阵。</li>
<li>批准和发布工作授权的程序</li>
</ul>
<h4>二、存储和检索信息的组织公用知识库：</h4>
<ul>
<li>过程测量数据库是用来收集和提供测量过程和产品的数据</li>
<li>项目文件（如范围，成本，质量基线，执行情况测量基线，项目日历，项目进度网络图，风险登记，计划应对活动，以及定义风险影响）</li>
<li>历史信息和来自知识库的教训（如项目报告和文档，项目收尾信息和文件，跟以前所有项目选择和执行情况有关的信息，以及风险管理努力的信息）</li>
<li>问题和缺陷管理数据库，包含了问题和缺陷的状态，控制信息，问题和缺陷解决方案和行动结果</li>
<li>结构管理知识数据，包含了对所有正式的公司标准、政策、程序和任何项目文档的释义和基线</li>
<li>财政数据库，包含诸如劳动时间、花费成本、预算和任何项目费用超支的信息</li>
</ul>
<p>转自 http://wiki.mbalib.com/</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/916/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>十个利用矩阵乘法解决的经典题目[经典]</title>
		<link>http://yaronspace.cn/blog/archives/914</link>
		<comments>http://yaronspace.cn/blog/archives/914#comments</comments>
		<pubDate>Sun, 31 Oct 2010 14:31:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[编程语言与算法设计]]></category>
		<category><![CDATA[AC自动机]]></category>
		<category><![CDATA[矩阵]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=914</guid>
		<description><![CDATA[今天看poj2778题目时，看到这篇文章，写得很不错！ 最让我诧异的是，这哥们居然是北大中文系的，居然把算法搞的这么透彻，佩服！ blog地址：http://www.matrix67.com/blog 好像目前还没有这方面题目的总结。这几天连续看到四个问这类题目的人，今天在这里简单写一下。这里我们不介绍其它有关矩阵的知识，只介绍矩阵乘法和相关性质。 不 要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符。在数学中，一个矩阵说穿了就是一个二维数组。一个n行m列的矩阵可以乘以一个m行p列的矩阵，得到 的结果是一个n行p列的矩阵，其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个乘积的和。比 如，下面的算式表示一个2行2列的矩阵乘以2行3列的矩阵，其结果是一个2行3列的矩阵。其中，结果的那个4等于2*2+0*1： 下面的算式则是一个1 x 3的矩阵乘以3 x 2的矩阵，得到一个1 x 2的矩阵： 矩阵乘法的两个重要性质：一，矩阵乘法不满足交 换律；二，矩阵乘法满足结合律。为什么矩阵乘法不满足交换律呢？废话，交换过来后两个矩阵有可能根本不能相乘。为什么它又满足结合律呢？仔细想想你会发现 这也是废话。假设你有三个矩阵A、B、C，那么(AB)C和A(BC)的结果的第i行第j列上的数都等于所有A(ik)*B(kl)*C(lj)的和（枚 举所有的k和l）。 经典题目1 给定n个点，m个操作，构造O(m+n)的算法输出m个操作后各点的位置。操作有平移、缩放、翻转和旋转 这 里的操作是对所有点同时进行的。其中翻转是以坐标轴为对称轴进行翻转（两种情况），旋转则以原点为中心。如果对每个点分别进行模拟，那么m个操作总共耗时 O(mn)。利用矩阵乘法可以在O(m)的时间里把所有操作合并为一个矩阵，然后每个点与该矩阵相乘即可直接得出最终该点的位置，总共耗时O(m+n)。 假设初始时某个点的坐标为x和y，下面5个矩阵可以分别对其进行平移、旋转、翻转和旋转操作。预先把所有m个操作所对应的矩阵全部乘起来，再乘以 (x,y,1)，即可一步得出最终点的位置。 经典题目2 给定矩阵A，请快速计算出A^n（n个A相乘）的结果，输出的每个数都mod p。 由 于矩阵乘法具有结合律，因此A^4 = A * A * A * A = (A*A) * (A*A) = A^2 * A^2。我们可以得到这样的结论：当n为偶数时，A^n = A^(n/2) * A^(n/2)；当n为奇数时，A^n = A^(n/2) * A^(n/2)]]></description>
			<content:encoded><![CDATA[<p>今天看poj2778题目时，看到这篇文章，写得很不错！</p>
<p>最让我诧异的是，这哥们居然是北大中文系的，居然把算法搞的这么透彻，佩服！</p>
<p>blog地址：<a href="http://www.matrix67.com/blog" target="_blank">http://www.matrix67.com/blog</a></p>
<p><span id="more-914"></span></p>
<p>好像目前还没有这方面题目的总结。这几天连续看到四个问这类题目的人，今天在这里简单写一下。这里我们不介绍其它有关矩阵的知识，只介绍矩阵乘法和相关性质。<br />
不 要以为数学中的矩阵也是黑色屏幕上不断变化的绿色字符。在数学中，一个矩阵说穿了就是一个二维数组。一个n行m列的矩阵可以乘以一个m行p列的矩阵，得到 的结果是一个n行p列的矩阵，其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个乘积的和。比 如，下面的算式表示一个2行2列的矩阵乘以2行3列的矩阵，其结果是一个2行3列的矩阵。其中，结果的那个4等于2*2+0*1：<br />
<img src="http://www.matrix67.com/blogimage/200708041.gif" border="0" alt="" /><br />
下面的算式则是一个1 x 3的矩阵乘以3 x 2的矩阵，得到一个1 x 2的矩阵：<br />
<img src="http://www.matrix67.com/blogimage/200708042.gif" border="0" alt="" /></p>
<p>矩阵乘法的两个重要性质：一，矩阵乘法<strong>不满足</strong>交 换律；二，矩阵乘法满足结合律。为什么矩阵乘法不满足交换律呢？废话，交换过来后两个矩阵有可能根本不能相乘。为什么它又满足结合律呢？仔细想想你会发现 这也是废话。假设你有三个矩阵A、B、C，那么(AB)C和A(BC)的结果的第i行第j列上的数都等于所有A(ik)*B(kl)*C(lj)的和（枚 举所有的k和l）。</p>
<p><strong>经典题目1 给定n个点，m个操作，构造O(m+n)的算法输出m个操作后各点的位置。操作有平移、缩放、翻转和旋转</strong><br />
这 里的操作是对所有点同时进行的。其中翻转是以坐标轴为对称轴进行翻转（两种情况），旋转则以原点为中心。如果对每个点分别进行模拟，那么m个操作总共耗时 O(mn)。利用矩阵乘法可以在O(m)的时间里把所有操作合并为一个矩阵，然后每个点与该矩阵相乘即可直接得出最终该点的位置，总共耗时O(m+n)。 假设初始时某个点的坐标为x和y，下面5个矩阵可以分别对其进行平移、旋转、翻转和旋转操作。预先把所有m个操作所对应的矩阵全部乘起来，再乘以 (x,y,1)，即可一步得出最终点的位置。<br />
<img src="http://www.matrix67.com/blogimage/200708043.gif" border="0" alt="" /></p>
<p><strong>经典题目2 给定矩阵A，请快速计算出A^n（n个A相乘）的结果，输出的每个数都mod p。</strong><br />
由 于矩阵乘法具有结合律，因此A^4 = A * A * A * A = (A*A) * (A*A) = A^2 *  A^2。我们可以得到这样的结论：当n为偶数时，A^n = A^(n/2) * A^(n/2)；当n为奇数时，A^n = A^(n/2) *  A^(n/2) * A  （其中n/2取整）。这就告诉我们，计算A^n也可以使用二分快速求幂的方法。例如，为了算出A^25的值，我们只需要递归地计算出A^12、A^6、 A^3的值即可。根据<a href="http://www.matrix67.com/blog/article.asp?id=282" target="_blank">这里</a>的一些结果，我们可以在计算过程中不断取模，避免高精度运算。</p>
<p><strong>经典题目3 <a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3233" target="_blank">POJ3233</a></strong> (感谢<a href="http://hi.baidu.com/rangemq/blog/item/cd0b9534a57f6ab6d1a2d32b.html" target="_blank">rmq</a>)<br />
题目大意：给定矩阵A，求A + A^2 + A^3 + &#8230; + A^k的结果（两个矩阵相加就是对应位置分别相加）。输出的数据mod m。k&lt;=10^9。<br />
这道题两次二分，相当经典。首先我们知道，A^i可以二分求出。然后我们需要对整个题目的数据规模k进行二分。比如，当k=6时，有：<br />
A + A^2 + A^3 + A^4 + A^5 + A^6 =<span style="text-decoration: underline;">(A + A^2 + A^3)</span> + A^3*<span style="text-decoration: underline;">(A + A^2 + A^3)</span><br />
应用这个式子后，规模k减小了一半。我们二分求出A^3后再递归地计算A + A^2 + A^3，即可得到原问题的答案。</p>
<p><strong>经典题目4 <a href="http://www.vijos.cn/Problem_Show.asp?id=1049" target="_blank">VOJ1049</a></strong><br />
题目大意：顺次给出m个置换，反复使用这m个置换对初始序列进行操作，问k次置换后的序列。m&lt;=10, k&lt;2^31。<br />
首先将这m个置换“合并”起来（算出这m个置换的乘积），然后接下来我们需要执行这个置换k/m次（取整，若有余数则剩下几步模拟即可）。注意任意一个置换都可以表示成矩阵的形式。例如，将1 2 3 4置换为3 1 2 4，相当于下面的矩阵乘法：<br />
<img src="http://www.matrix67.com/blogimage/200708044.gif" border="0" alt="" /><br />
置换k/m次就相当于在前面乘以k/m个这样的矩阵。我们可以二分计算出该矩阵的k/m次方，再乘以初始序列即可。做出来了别忙着高兴，得意之时就是你灭亡之日，别忘了最后可能还有几个置换需要模拟。</p>
<p><strong>经典题目5 《算法艺术与信息学竞赛》207页（2.1代数方法和模型，[例题5]细菌，版次不同可能页码有偏差）</strong><br />
大家自己去看看吧，书上讲得很详细。解题方法和上一题类似，都是用矩阵来表示操作，然后二分求最终状态。</p>
<p><strong>经典题目6 给定n和p，求第n个Fibonacci数mod p的值，n不超过2^31</strong><br />
根 据前面的一些思路，现在我们需要构造一个2 x  2的矩阵，使得它乘以(a,b)得到的结果是(b,a+b)。每多乘一次这个矩阵，这两个数就会多迭代一次。那么，我们把这个2 x  2的矩阵自乘n次，再乘以(0,1)就可以得到第n个Fibonacci数了。不用多想，这个2 x 2的矩阵很容易构造出来：<br />
<img src="http://www.matrix67.com/blogimage/200708045.gif" border="0" alt="" /></p>
<p><strong>经典题目7 <a href="http://www.vijos.cn/Problem_Show.asp?id=1067" target="_blank">VOJ1067</a></strong><br />
我 们可以用上面的方法二分求出任何一个线性递推式的第n项，其对应矩阵的构造方法为：在右上角的(n-1)*(n-1)的小矩阵中的主对角线上填1，矩阵第 n行填对应的系数，其它地方都填0。例如，我们可以用下面的矩阵乘法来二分计算f(n) = 4f(n-1) &#8211; 3f(n-2) +  2f(n-4)的第k项：<br />
<img src="http://www.matrix67.com/blogimage/200708046.gif" border="0" alt="" /><br />
利用矩阵乘法求解线性递推关系的题目我能编出一卡车来。这里给出的例题是系数全为1的情况。</p>
<p><strong>经典题目8 给定一个有向图，问从A点恰好走k步（允许重复经过边）到达B点的方案数mod p的值</strong><br />
把 给定的图转为邻接矩阵，即A(i,j)=1当且仅当存在一条边i-&gt;j。令C=A*A，那么C(i,j)=ΣA(i,k)*A(k,j)，实际上就 等于从点i到点j恰好经过2条边的路径数（枚举k为中转点）。类似地，C*A的第i行第j列就表示从i到j经过3条边的路径数。同理，如果要求经过k步的 路径数，我们只需要二分求出A^k即可。</p>
<p><strong>经典题目9 用1 x 2的多米诺骨牌填满M x N的矩形有多少种方案，M&lt;=5，N&lt;2^31，输出答案mod p的结果</strong><br />
<img src="http://www.matrix67.com/blogimage/200708047.gif" border="0" alt="" /><br />
我 们以M=3为例进行讲解。假设我们把这个矩形横着放在电脑屏幕上，从右往左一列一列地进行填充。其中前n-2列已经填满了，第n-1列参差不齐。现在我们 要做的事情是把第n-1列也填满，将状态转移到第n列上去。由于第n-1列的状态不一样（有8种不同的状态），因此我们需要分情况进行讨论。在图中，我把 转移前8种不同的状态放在左边，转移后8种不同的状态放在右边，左边的某种状态可以转移到右边的某种状态就在它们之间连一根线。注意为了保证方案不重复， 状态转移时我们不允许在第n-1列竖着放一个多米诺骨牌（例如左边第2种状态不能转移到右边第4种状态），否则这将与另一种转移前的状态重复。把这8种状 态的转移关系画成一个有向图，那么问题就变成了这样：从状态111出发，恰好经过n步回到这个状态有多少种方案。比如，n=2时有3种方案，111-&amp; gt;011-&gt;111、111-&gt;110-&gt;111和111-&gt;000-&gt;111，这与用多米诺骨牌覆盖3&#215;2矩形的方 案一一对应。这样这个题目就转化为了我们前面的例题8。<br />
后面我写了一份此题的源代码。你可以再次看到位运算的相关应用。</p>
<p><strong>经典题目10 <a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2778" target="_blank">POJ2778</a></strong><br />
题目大意是，检测所有可能的n位DNA串有多少个DNA串中不含有指定的病毒片段。合法的DNA只能由ACTG四个字符构成。题目将给出10个以内的病毒片段，每个片段长度不超过10。数据规模n&lt;=2 000 000 000。<br />
下 面的讲解中我们以ATC,AAA,GGC,CT这四个病毒片段为例，说明怎样像上面的题一样通过构图将问题转化为例题8。我们找出所有病毒片段的前缀，把 n位DNA分为以下7类：以AT结尾、以AA结尾、以GG结尾、以?A结尾、以?G结尾、以?C结尾和以??结尾。其中问号表示“其它情况”，它可以是任 一字母，只要这个字母不会让它所在的串成为某个病毒的前缀。显然，这些分类是全集的一个划分（交集为空，并集为全集）。现在，假如我们已经知道了长度为 n-1的各类DNA中符合要求的DNA个数，我们需要求出长度为n时各类DNA的个数。我们可以根据各类型间的转移构造一个边上带权的有向图。例如，从 AT不能转移到AA，从AT转移到??有4种方法（后面加任一字母），从?A转移到AA有1种方案（后面加个A），从?A转移到??有2种方案（后面加G 或C），从GG到??有2种方案（后面加C将构成病毒片段，不合法，只能加A和T）等等。这个图的构造过程类似于用有限状态自动机做串匹配。然后，我们就 把这个图转化成矩阵，让这个矩阵自乘n次即可。最后输出的是从??状态到所有其它状态的路径数总和。<br />
题目中的数据规模保证前缀数不超过100，一次矩阵乘法是三方的，一共要乘log(n)次。因此这题总的复杂度是100^3 * log(n)，AC了。</p>
<p>最后给出第9题的代码供大家参考（今天写的，熟悉了一下C++的类和运算符重载）。为了避免大家看代码看着看着就忘了，我把这句话放在前面来说：<br />
Matrix67原创，转贴请注明出处。</p>
<p><code>#include &lt;cstdio&gt;<br />
#define SIZE (1&lt;&lt;m)<br />
#define MAX_SIZE 32<br />
using namespace std;</p>
<p>class CMatrix<br />
{<br />
public:<br />
long element[MAX_SIZE][MAX_SIZE];<br />
void setSize(int);<br />
void setModulo(int);<br />
CMatrix operator* (CMatrix);<br />
CMatrix power(int);<br />
private:<br />
int size;<br />
long modulo;<br />
};</p>
<p>void CMatrix::setSize(int a)<br />
{<br />
for (int i=0; i&lt;a; i++)<br />
for (int j=0; j&lt;a; j++)<br />
element[i][j]=0;<br />
size = a;<br />
}</p>
<p>void CMatrix::setModulo(int a)<br />
{<br />
modulo = a;<br />
}</p>
<p>CMatrix CMatrix::operator* (CMatrix param)<br />
{<br />
CMatrix product;<br />
product.setSize(size);<br />
product.setModulo(modulo);<br />
for (int i=0; i&lt;size; i++)<br />
for (int j=0; j&lt;size; j++)<br />
for (int k=0; k&lt;size; k++)<br />
{<br />
product.element[i][j]+=element[i][k]*param.element[k][j];<br />
product.element[i][j]%=modulo;<br />
}</p>
<p>return product;<br />
}</p>
<p>CMatrix CMatrix::power(int exp)<br />
{<br />
CMatrix tmp = (*this) * (*this);<br />
if (exp==1) return *this;<br />
else if (exp &amp; 1) return tmp.power(exp/2) * (*this);<br />
else return tmp.power(exp/2);<br />
}</p>
<p>int main()<br />
{<br />
const int validSet[]={0,3,6,12,15,24,27,30};<br />
long n, m, p;<br />
CMatrix unit;</p>
<p>scanf("%d%d%d", &amp;n, &amp;m, &amp;p);<br />
unit.setSize(SIZE);<br />
for(int i=0; i&lt;SIZE; i++)<br />
for(int j=0; j&lt;SIZE; j++)<br />
if( ((~i)&amp;j) == ((~i)&amp;(SIZE-1)) )<br />
{<br />
bool isValid=false;<br />
for (int k=0; k&lt;8; k++)isValid=isValid||(i&amp;j)==validSet[k];<br />
unit.element[i][j]=isValid;<br />
}</p>
<p>unit.setModulo(p);<br />
printf("%d", unit.power(n).element[SIZE-1][SIZE-1] );<br />
return 0;<br />
}</code></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/914/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux 系统内核的调试技巧[zz]</title>
		<link>http://yaronspace.cn/blog/archives/911</link>
		<comments>http://yaronspace.cn/blog/archives/911#comments</comments>
		<pubDate>Fri, 29 Oct 2010 08:40:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[kgdb]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=911</guid>
		<description><![CDATA[调试是软件开发过程中一个必不可少的环节，在 Linux 内核开发的过程中也不可避免地会面对如何调试内核的问题。但是，Linux 系统的开发者出于保证内核代码正确性的考虑，不愿意在 Linux 内核源代码树中加入一个调试器。他们认为内核中的调试器会误导开发者，从而引入不良的修正[1]。所以对 Linux 内核进行调试一直是个令内核程序员感到棘手的问题，调试工作的艰苦性是内核级的开发区别于用户级开发的一个显著特点。 尽管缺乏一种内置的调试内核的有效方法，但是 Linux 系统在内核发展的过程中也逐渐形成了一些监视内核代码和错误跟踪的技术。同时，许多的补丁程序应运而生，它们为标准内核附加了内核调试的支持。尽管这些补丁有些并不被 Linux 官方组织认可，但他们确实功能完善，十分强大。调试内核问题时，利用这些工具与方法跟踪内核执行情况，并查看其内存和数据结构将是非常有用的。 本文将首先介绍 Linux 内核上的一些内核代码监视和错误跟踪技术，这些调试和跟踪方法因所要求的使用环境和使用方法而各有不同，然后重点介绍三种 Linux 内核的源代码级的调试方法。 1. Linux 系统内核级软件的调试技术 printk() 是调试内核代码时最常用的一种技术。在内核代码中的特定位置加入printk() 调试调用，可以直接把所关心的信息打打印到屏幕上，从而可以观察程序的执行路径和所关心的变量、指针等信息。 Linux 内核调试器（Linux kernel debugger，kdb）是 Linux 内核的补丁，它提供了一种在系统能运行时对内核内存和数据结构进行检查的办法。Oops、KDB在文章掌握 Linux 调试技术有详细介绍，大家可以参考。 Kprobes 提供了一个强行进入任何内核例程，并从中断处理器无干扰地收集信息的接口。使用 Kprobes 可以轻松地收集处理器寄存器和全局数据结构等调试信息，而无需对Linux内核频繁编译和启动，具体使用方法，请参考使用 Kprobes 调试内核。 以上介绍了进行Linux内核调试和跟踪时的常用技术和方法。当然，内核调试与跟踪的方法还不止以上提到的这些。这些调试技术的一个共同的特点在于，他们都不能提供源代码级的有效的内核调试手段，有些只能称之为错误跟踪技术，因此这些方法都只能提供有限的调试能力。下面将介绍三种实用的源代码级的内核调试方法。 原文地址]]></description>
			<content:encoded><![CDATA[<p style="font-family: arial, nsimsun, sans-serif; padding-top: 0.3em; padding-right: 5px; padding-bottom: 0.7em; padding-left: 5px; font-size: 0.76em; margin: 0px;">调试是软件开发过程中一个必不可少的环节，在 Linux 内核开发的过程中也不可避免地会面对如何调试内核的问题。但是，Linux 系统的开发者出于保证内核代码正确性的考虑，不愿意在 Linux 内核源代码树中加入一个调试器。他们认为内核中的调试器会误导开发者，从而引入不良的修正[1]。所以对 Linux 内核进行调试一直是个令内核程序员感到棘手的问题，调试工作的艰苦性是内核级的开发区别于用户级开发的一个显著特点。</p>
<p style="font-family: arial, nsimsun, sans-serif; padding-top: 0.3em; padding-right: 5px; padding-bottom: 0.7em; padding-left: 5px; font-size: 0.76em; margin: 0px;">尽管缺乏一种内置的调试内核的有效方法，但是 Linux 系统在内核发展的过程中也逐渐形成了一些监视内核代码和错误跟踪的技术。同时，许多的补丁程序应运而生，它们为标准内核附加了内核调试的支持。尽管这些补丁有些并不被 Linux 官方组织认可，但他们确实功能完善，十分强大。调试内核问题时，利用这些工具与方法跟踪内核执行情况，并查看其内存和数据结构将是非常有用的。</p>
<p style="font-family: arial, nsimsun, sans-serif; padding-top: 0.3em; padding-right: 5px; padding-bottom: 0.7em; padding-left: 5px; font-size: 0.76em; margin: 0px;">本文将首先介绍 Linux 内核上的一些内核代码监视和错误跟踪技术，这些调试和跟踪方法因所要求的使用环境和使用方法而各有不同，然后重点介绍三种 Linux 内核的源代码级的调试方法。</p>
<p style="font-family: arial, nsimsun, sans-serif; padding-top: 0.3em; padding-right: 5px; padding-bottom: 0.7em; padding-left: 5px; font-size: 0.76em; margin: 0px;"><a name="N10060"><span style="font-size: 1.5em; font-weight: bold;">1.	Linux 系统内核级软件的调试技术</span></a></p>
<p style="font-family: arial, nsimsun, sans-serif; padding-top: 0.3em; padding-right: 5px; padding-bottom: 0.7em; padding-left: 5px; font-size: 0.76em; margin: 0px;">printk() 是调试内核代码时最常用的一种技术。在内核代码中的特定位置加入printk() 调试调用，可以直接把所关心的信息打打印到屏幕上，从而可以观察程序的执行路径和所关心的变量、指针等信息。 Linux 内核调试器（Linux kernel debugger，kdb）是 Linux 内核的补丁，它提供了一种在系统能运行时对内核内存和数据结构进行检查的办法。Oops、KDB在文章掌握 <a style="color: #4c6e94;" href="http://www.ibm.com/developerworks/cn/linux/l-kdbug/index.html">Linux 调试技术</a>有详细介绍，大家可以参考。 Kprobes 提供了一个强行进入任何内核例程，并从中断处理器无干扰地收集信息的接口。使用 Kprobes 可以轻松地收集处理器寄存器和全局数据结构等调试信息，而无需对Linux内核频繁编译和启动，具体使用方法，请参考<a style="color: #4c6e94;" href="http://www.ibm.com/developerworks/cn/linux/l-kprobes.html">使用 Kprobes 调试内核</a>。</p>
<p style="font-family: arial, nsimsun, sans-serif; padding-top: 0.3em; padding-right: 5px; padding-bottom: 0.7em; padding-left: 5px; font-size: 0.76em; margin: 0px;">以上介绍了进行Linux内核调试和跟踪时的常用技术和方法。当然，内核调试与跟踪的方法还不止以上提到的这些。这些调试技术的一个共同的特点在于，他们都不能提供源代码级的有效的内核调试手段，有些只能称之为错误跟踪技术，因此这些方法都只能提供有限的调试能力。下面将介绍三种实用的源代码级的内核调试方法。</p>
<h1><a href="http://www.ibm.com/developerworks/cn/linux/l-kdb/index.html" target="_blank">原文地址</a></h1>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/911/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>对需求管理和范围管理的理解</title>
		<link>http://yaronspace.cn/blog/archives/905</link>
		<comments>http://yaronspace.cn/blog/archives/905#comments</comments>
		<pubDate>Wed, 27 Oct 2010 07:35:16 +0000</pubDate>
		<dc:creator>Yvonne</dc:creator>
				<category><![CDATA[Project Management]]></category>
		<category><![CDATA[范围管理]]></category>
		<category><![CDATA[需求管理]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=905</guid>
		<description><![CDATA[1. 什么是需求管理 需求是指项目接受并生产出的产品和产品构建。需求管理是为确保各方对需求理解一致而进行的管理和控制活动。 2. 需求管理包含哪些方面 1)         制定计划：准备所需的软硬件资源、跟踪矩阵、变更申请等，便于管理需求并保持需求管理工作一致。 2)         各方对需求达成共识：各方干系人对确立的需求进行确认，建立一致。 3)         控制需求变更：项目进行期间当发生需求变更将对整个项目产生影响，如果需要变更，要先提出申请说明变更需求的来源，相关人员综合各方面因素审核是否实施变更。 3. 什么是范围管理 项目范围管理界定了为成功完成项目所需要的一系列过程，确保项目包含且仅包含必须完成的工作。即定义和控制项目内包含什么，不包含什么。 4. 范围管理包含哪些方面 在软件开发项目管理中，范围通常包括产品范围和项目范围。 产品范围：表示产品或服务的特性和功能。如需求、目标、工作产品、交付成果； 项目范围：指为了完成产品范围内规定的特征和功能，所必须完成的工作，如确定干系人、WBS、资源安排、时间分配等； 产品范围是否完成以产品需求作为衡量标准；项目范围的完成以项目管理计划作为衡量标准。二者相结合确保项目在规定的时间内、使用特定的资源、按照约定的质量交付约定好的成果。 5. 范围管理与需求管理的关系 1)         范围管理包括需求管理：范围管理需要清楚的定义项目的具体工作范围和工作内容。 2)         需求管理为范围管理提供依据：在需求开发确定的项目需求基础上确定项目的范围，制定工作内容、项目预算、估算时间和资源；根据需求的级别安排资源投入工作；当需求有变更时会引起项目范围和时间的变更，对需求变更的管理可以减小项目管理的风险。]]></description>
			<content:encoded><![CDATA[<h3>1. 什么是需求管理</h3>
<p>需求是指项目接受并生产出的产品和产品构建。需求管理是为确保各方对需求理解一致而进行的管理和控制活动。</p>
<h3>2. 需求管理包含哪些方面</h3>
<p>1)         制定计划：准备所需的软硬件资源、跟踪矩阵、变更申请等，便于管理需求并保持需求管理工作一致。</p>
<p>2)         各方对需求达成共识：各方干系人对确立的需求进行确认，建立一致。</p>
<p>3)         控制需求变更：项目进行期间当发生需求变更将对整个项目产生影响，如果需要变更，要先提出申请说明变更需求的来源，相关人员综合各方面因素审核是否实施变更。</p>
<h3>3. 什么是范围管理</h3>
<p>项目范围管理界定了为成功完成项目所需要的一系列过程，确保项目包含且仅包含必须完成的工作。即定义和控制项目内包含什么，不包含什么。</p>
<h3>4. 范围管理包含哪些方面</h3>
<p>在软件开发项目管理中，范围通常包括产品范围和项目范围。</p>
<p><strong>产品范围</strong>：表示产品或服务的特性和功能。如需求、目标、工作产品、交付成果；</p>
<p><strong>项目范围</strong>：指为了完成产品范围内规定的特征和功能，所必须完成的工作，如确定干系人、WBS、资源安排、时间分配等；</p>
<p>产品范围是否完成以产品需求作为衡量标准；项目范围的完成以项目管理计划作为衡量标准。二者相结合确保项目在规定的时间内、使用特定的资源、按照约定的质量交付约定好的成果。</p>
<h3>5. 范围管理与需求管理的关系</h3>
<p>1)         范围管理包括需求管理：范围管理需要清楚的定义项目的具体工作范围和工作内容。</p>
<p>2)         需求管理为范围管理提供依据：在需求开发确定的项目需求基础上确定项目的范围，制定工作内容、项目预算、估算时间和资源；根据需求的级别安排资源投入工作；当需求有变更时会引起项目范围和时间的变更，对需求变更的管理可以减小项目管理的风险。</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/905/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>yaronspace.cn 一周年</title>
		<link>http://yaronspace.cn/blog/archives/897</link>
		<comments>http://yaronspace.cn/blog/archives/897#comments</comments>
		<pubDate>Wed, 27 Oct 2010 03:13:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[生活感悟]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=897</guid>
		<description><![CDATA[2009-10-27买了yaronspace.cn域名和空间，纪念下~ 再接再厉！！ 下面是一年来流量变化情况，数据来自google analytics]]></description>
			<content:encoded><![CDATA[<p>2009-10-27买了yaronspace.cn域名和空间，纪念下~</p>
<p>再接再厉！！</p>
<p>下面是一年来流量变化情况，数据来自google analytics</p>
<p><img class="size-full wp-image-900 alignright" title="pv" src="http://www.yaronspace.cn/blog/wp-content/uploads/2010/10/pv.png" alt="pv" width="971" height="232" /><img class="alignnone size-full wp-image-901" title="pv2" src="http://www.yaronspace.cn/blog/wp-content/uploads/2010/10/pv2.png" alt="pv2" width="960" height="165" /><img class="alignnone size-full wp-image-902" title="pv3" src="http://www.yaronspace.cn/blog/wp-content/uploads/2010/10/pv3.png" alt="pv3" width="485" height="236" /></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/897/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>yaronli排名还不错</title>
		<link>http://yaronspace.cn/blog/archives/891</link>
		<comments>http://yaronspace.cn/blog/archives/891#comments</comments>
		<pubDate>Tue, 26 Oct 2010 07:14:05 +0000</pubDate>
		<dc:creator>Yvonne</dc:creator>
				<category><![CDATA[业界趣闻轶事]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=891</guid>
		<description><![CDATA[Yaronli 在百度 Yaronli 在google 排名很靠前~~]]></description>
			<content:encoded><![CDATA[<p>Yaronli 在百度</p>
<p><img class="size-medium wp-image-890 alignnone" title="baidu" src="http://www.yaronspace.cn/blog/wp-content/uploads/2010/10/baidu1-300x75.jpg" alt="baidu" width="300" height="75" /></p>
<p>Yaronli 在google</p>
<p><img class="size-medium wp-image-886 alignnone" title="google" src="http://www.yaronspace.cn/blog/wp-content/uploads/2010/10/google2-300x220.jpg" alt="google" width="300" height="220" /></p>
<p>排名很靠前~~</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/891/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>产品经理能力模型[转]</title>
		<link>http://yaronspace.cn/blog/archives/877</link>
		<comments>http://yaronspace.cn/blog/archives/877#comments</comments>
		<pubDate>Tue, 26 Oct 2010 03:25:18 +0000</pubDate>
		<dc:creator>Yvonne</dc:creator>
				<category><![CDATA[业界趣闻轶事]]></category>
		<category><![CDATA[产品经理]]></category>
		<category><![CDATA[产品经理能力模型]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=877</guid>
		<description><![CDATA[偶然看到这篇文章，写的很实在，不喜欢理论性太强的，转过来~~ 由 Minijuly 撰写 http://www.minijuly.com/?p=830 随着行业发展，产品经理这个群体在IT行业也越来越受到关注，各种产品交流学习组织蓬勃兴起，作为其中的一员，一直以来就想写写自己对于产品经理这一角色的认识。 俗话说，一个成功的男人身后必然有一个默默的女人，那么一款产品背后是否也有一位潜心学习不断专研的产品经理呢？答案是肯定的，而且经常性的还不只是一位产品经理在支持着一款成功的产品。 业内对于产品经理能力模型的归纳也并不鲜见，因此我只是从个人理解的层面去讲述这些能力，我个人主要倾向于把产品经理能力分为两大部分：A、产品能力；B、管理能力。 A、产品能力 一、工具性能力 产品经理对产品负责，相应的产品能力必须是首要的能力，而在这些具体的素质里面，工具性能力又堪称基础性能力，在一个产品策划的生命周期里面，最常见的工具一般有以下几种：word、ppt、mindmanager、visio、axure、excel。 1、Word、excel和ppt，产品经理在策划一款产品的过程中，往往需要同多部门进行沟通协调，于是撰写文档以提高沟通效率便成为一项重要能力，无论是撰写产品需求文档还是市场需求文档、分析后期统计数据都需要熟练使用office系列文件。 2、Mindmanager，作为常用的头脑风暴软件，mindmanager便于产品经理更好的梳理产品管理和逻辑，对于理清产品思路具有重要意义，特别是在绘制产品roadmap其方便快捷的操作可以让产品经理绘制出结构和逻辑性都较好的展示图表。 3、Visio，visio作为一款优秀的流程软件，对于产品经理梳理产品内在逻辑和用户操作流程具有重要意义，特别是在产品文档撰写过程 中，visio绘制的用户操作流程图可以帮助工程师更好理解产品逻辑从而实施产品开发。Visio丰富的插件还可以用户绘制ueser case，方便产 品项目组人员更好的理解用户，从而指导产品设计。 4、Axure，近年来axure凭借其优秀和交互能力和良好的操作性开始逐渐取代visio用于原型绘制，原型绘制作为产品设计的重要一环使得axure的使用能力也成为产品经理的标配能力之一。 二、产品感 “产品感”，一词来源于前辈郭子威，第一次看到这个词的时候我就眼睛一亮，当时看到的想法就是：bingo，这个词才是我心中产品经理需要的核心能 力、一个优秀的产品经理必须对于产品敏感，而这种敏感性就来源于良好的产品感。产品经理是一个综合性角色，即需要有开阔的视野，又必须时刻关注细节，而这 些都包含在产品感里面。当然产品感并不是天生的，良好的产品感来源于长期的产品设计积累和对于互联网产品的大量使用。如果你没有“网瘾”，我觉得产品感会 变成一个无稽之谈。 a、规划力  这是一个产品经理较高层面上的能力，而具备这种能力的产品经理，通常会具备很多思想家的特质。从产品外部体系上，规划力代表了产品经 理对整个价值市场的认同，对企业产品线的布局，对自身产品的定位以及对每一款产品的发展思路。当然，对于大部分产品经理而言，战略层面的东西可能还接触不 到，特别是对于大型公司，决策层对于战略的考虑会大大多于产品经理，而产品经理在这样的情况下对于战略的执行多于对战略的思考。 b、设计力  这里所说的设计能力并不单指对于产品功能和原型的设计，而更大一部分在于是否能够根据公司战略及用户需求找到最好的契合度，规划出即满足公司商业需求又符合市场定位和用户需求的能力。包括产品远景规划和近期的功能规划都属于设计力的范畴。 三、商业感 一个优秀的产品经理必须具有关注整个宏观市场环境的视野和能力，虽然在现实中大部分产品经理依旧在做执行层面的很多问题，对于大环境的关注可能在产 品总监或更高领导层面。但是对于一个产品经理的长期成长而言，对于整个大市场环境的关注不但可以使产品经理具有更好的产品视野，也会让产品经理在产品设计 的过程中更加敏锐，可以更好的对于产品远景规划作出正确的判断。 B、管理能力 一、自我管理能力 如果用足球比喻产品各个环节的职务角色，产品经理应该是最适合的中场球员，在一场球赛中，中场对于组织进攻，协调防守都具有核心意义。产品经理作为 一个协调性角色，对于前方需要协调包括BD、市场、销售在内的各个角色，对于后方又要组织协调好UED、程序等，另外还必须承受来自于用户的指责和质疑， 面临的压力可想而知。因此从个人素质上讲一个善于调节情绪，能够自我释放的产品经理才能经的起考验。 二、时间管理能力 产品经理在整个产品生命周期中都扮演者核心角色，并且由于时刻需要针对不同需求去协调不同的部门，产品经理总是最活跃产品角色，既要处理外部问题又 要时刻紧盯产品的设计，是否具有良好工作安排协调能力对于产品经理正常完成工作具有重要意义，产品经理最怕跟各部门陷入无休止的扯皮而疲于顾及产品的核心 设计工作。 三、知识管理能力 日新月异对于互联网行业来说是最好的形容，如果你不关注市场，关注新技术，说不定某天起床的时候你就会发现自己已经跟不上时代的需求。而良好的学习 能力对于产品经理而言将是保持创新活力的基础，面对不断的新技术、新产品产品经理不能目瞪口呆，而应觉得理所当然；其次产品经理本身是综合性角色，对于市 场研究、用户调研、产品策划、开发技术、品牌管理、项目管理、心理学、设计科学都必须有所涉猎。只有具有综合的能力，才能立于各部门的沟通中游刃有余。 四、产品管理能力 产品经理必须对整个产品生命周期负责，从前期产品策划中协调各种资源进行开发设计开发，跟进产品上线。到产品上线后的运营推广，产品经理都必须予以 关注，以便协调不同的部门安排工作。同事在运营中对于来自各方需求以及市场的新变化都必须时刻关注以便安排产品的迭代更新。产品经理对于一款产品来说就是 既当爹又当妈。 五、团队管理能力 1、沟通能力 产品经理对于需求的实现都必须依赖技术和UED部门进行，因此良好的无授权领导力成为是否完成工作的主要条件，因此产品经理必须是一个活力角色，只有这样才能调动各部门投入产品设计和开发，从而形成一个核心的产品项目团队，产品经理不能孤军奋战。 2、执行能力 产品经理的执行能力不但指个人范围内的工作情况，也包括协调程序、UED部门投入工作的能力，当然这一点又必须依赖于良好的沟通能力。 3、另外产品经理也必须肩负一定的产品团队培养能力，使得产品梯队具有良性的接力效应，从而必须人才青黄不接，导致项目不能正常完成。]]></description>
			<content:encoded><![CDATA[<p>偶然看到这篇文章，写的很实在，不喜欢理论性太强的，转过来~~</p>
<p><span>由 <a title="查看 Minijuly 的所有日志" href="http://www.minijuly.com/?author=1">Minijuly</a> 撰写</span> <a title="产品经理能力模型" rel="bookmark" href="http://www.minijuly.com/?p=830">http://www.minijuly.com/?p=830</a></p>
<p><a rel="attachment wp-att-834" href="http://www.yaronspace.cn/blog/index.php/archives/832/832-autosave"><img title="pm" src="http://www.minijuly.com/wp-content/uploads/2010/10/pm4.jpg" alt="" width="469" height="384" /></a><br />
随着行业发展，产品经理这个群体在IT行业也越来越受到关注，各种产品交流学习组织蓬勃兴起，作为其中的一员，一直以来就想写写自己对于产品经理这一角色的认识。</p>
<p>俗话说，一个成功的男人身后必然有一个默默的女人，那么一款产品背后是否也有一位潜心学习不断专研的产品经理呢？答案是肯定的，而且经常性的还不只是一位产品经理在支持着一款成功的产品。</p>
<p>业内对于产品经理能力模型的归纳也并不鲜见，因此我只是从个人理解的层面去讲述这些能力，我个人主要倾向于把产品经理能力分为两大部分：A、产品能力；B、管理能力。</p>
<ul>
<li><strong><span style="color: #0000ff;">A、产品能力</span></strong></li>
</ul>
<p><span style="color: #0000ff;">一、工具性能力</span></p>
<p>产品经理对产品负责，相应的产品能力必须是首要的能力，而在这些具体的素质里面，工具性能力又堪称基础性能力，在一个产品策划的生命周期里面，最常见的工具一般有以下几种：word、ppt、mindmanager、visio、axure、excel。</p>
<p>1、Word、excel和ppt，产品经理在策划一款产品的过程中，往往需要同多部门进行沟通协调，于是撰写文档以提高沟通效率便成为一项重要能力，无论是撰写产品需求文档还是市场需求文档、分析后期统计数据都需要熟练使用office系列文件。</p>
<p>2、Mindmanager，作为常用的头脑风暴软件，mindmanager便于产品经理更好的梳理产品管理和逻辑，对于理清产品思路具有重要意义，特别是在绘制产品roadmap其方便快捷的操作可以让产品经理绘制出结构和逻辑性都较好的展示图表。</p>
<p>3、Visio，visio作为一款优秀的流程软件，对于产品经理梳理产品内在逻辑和用户操作流程具有重要意义，特别是在产品文档撰写过程 中，visio绘制的用户操作流程图可以帮助工程师更好理解产品逻辑从而实施产品开发。Visio丰富的插件还可以用户绘制ueser case，方便产 品项目组人员更好的理解用户，从而指导产品设计。</p>
<p>4、Axure，近年来axure凭借其优秀和交互能力和良好的操作性开始逐渐取代visio用于原型绘制，原型绘制作为产品设计的重要一环使得axure的使用能力也成为产品经理的标配能力之一。</p>
<p><span style="color: #0000ff;">二、产品感</span></p>
<p>“产品感”，一词来源于前辈郭子威，第一次看到这个词的时候我就眼睛一亮，当时看到的想法就是：bingo，这个词才是我心中产品经理需要的核心能 力、一个优秀的产品经理必须对于产品敏感，而这种敏感性就来源于良好的产品感。产品经理是一个综合性角色，即需要有开阔的视野，又必须时刻关注细节，而这 些都包含在产品感里面。当然产品感并不是天生的，良好的产品感来源于长期的产品设计积累和对于互联网产品的大量使用。如果你没有“网瘾”，我觉得产品感会 变成一个无稽之谈。</p>
<p>a、规划力  这是一个产品经理较高层面上的能力，而具备这种能力的产品经理，通常会具备很多思想家的特质。从产品外部体系上，规划力代表了产品经 理对整个价值市场的认同，对企业产品线的布局，对自身产品的定位以及对每一款产品的发展思路。当然，对于大部分产品经理而言，战略层面的东西可能还接触不 到，特别是对于大型公司，决策层对于战略的考虑会大大多于产品经理，而产品经理在这样的情况下对于战略的执行多于对战略的思考。</p>
<p>b、设计力  这里所说的设计能力并不单指对于产品功能和原型的设计，而更大一部分在于是否能够根据公司战略及用户需求找到最好的契合度，规划出即满足公司商业需求又符合市场定位和用户需求的能力。包括产品远景规划和近期的功能规划都属于设计力的范畴。</p>
<p><span style="color: #0000ff;">三、商业感<span id="more-877"></span></span></p>
<p>一个优秀的产品经理必须具有关注整个宏观市场环境的视野和能力，虽然在现实中大部分产品经理依旧在做执行层面的很多问题，对于大环境的关注可能在产 品总监或更高领导层面。但是对于一个产品经理的长期成长而言，对于整个大市场环境的关注不但可以使产品经理具有更好的产品视野，也会让产品经理在产品设计 的过程中更加敏锐，可以更好的对于产品远景规划作出正确的判断。</p>
<ul>
<li><span style="color: #0000ff;"><strong>B、管理能力</strong></span></li>
</ul>
<p><span style="color: #0000ff;">一、自我管理能力</span></p>
<p>如果用足球比喻产品各个环节的职务角色，产品经理应该是最适合的中场球员，在一场球赛中，中场对于组织进攻，协调防守都具有核心意义。产品经理作为 一个协调性角色，对于前方需要协调包括BD、市场、销售在内的各个角色，对于后方又要组织协调好UED、程序等，另外还必须承受来自于用户的指责和质疑， 面临的压力可想而知。因此从个人素质上讲一个善于调节情绪，能够自我释放的产品经理才能经的起考验。</p>
<p><span style="color: #0000ff;">二、时间管理能力</span></p>
<p>产品经理在整个产品生命周期中都扮演者核心角色，并且由于时刻需要针对不同需求去协调不同的部门，产品经理总是最活跃产品角色，既要处理外部问题又 要时刻紧盯产品的设计，是否具有良好工作安排协调能力对于产品经理正常完成工作具有重要意义，产品经理最怕跟各部门陷入无休止的扯皮而疲于顾及产品的核心 设计工作。</p>
<p><span style="color: #0000ff;">三、知识管理能力</span></p>
<p>日新月异对于互联网行业来说是最好的形容，如果你不关注市场，关注新技术，说不定某天起床的时候你就会发现自己已经跟不上时代的需求。而良好的学习 能力对于产品经理而言将是保持创新活力的基础，面对不断的新技术、新产品产品经理不能目瞪口呆，而应觉得理所当然；其次产品经理本身是综合性角色，对于市 场研究、用户调研、产品策划、开发技术、品牌管理、项目管理、心理学、设计科学都必须有所涉猎。只有具有综合的能力，才能立于各部门的沟通中游刃有余。</p>
<p><span style="color: #0000ff;">四、产品管理能力</span></p>
<p>产品经理必须对整个产品生命周期负责，从前期产品策划中协调各种资源进行开发设计开发，跟进产品上线。到产品上线后的运营推广，产品经理都必须予以 关注，以便协调不同的部门安排工作。同事在运营中对于来自各方需求以及市场的新变化都必须时刻关注以便安排产品的迭代更新。产品经理对于一款产品来说就是 既当爹又当妈。</p>
<p><span style="color: #0000ff;">五、团队管理能力</span></p>
<p>1、沟通能力 产品经理对于需求的实现都必须依赖技术和UED部门进行，因此良好的无授权领导力成为是否完成工作的主要条件，因此产品经理必须是一个活力角色，只有这样才能调动各部门投入产品设计和开发，从而形成一个核心的产品项目团队，产品经理不能孤军奋战。</p>
<p>2、执行能力 产品经理的执行能力不但指个人范围内的工作情况，也包括协调程序、UED部门投入工作的能力，当然这一点又必须依赖于良好的沟通能力。</p>
<p>3、另外产品经理也必须肩负一定的产品团队培养能力，使得产品梯队具有良性的接力效应，从而必须人才青黄不接，导致项目不能正常完成。</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/877/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>systemTap 工具介绍[zz]</title>
		<link>http://yaronspace.cn/blog/archives/875</link>
		<comments>http://yaronspace.cn/blog/archives/875#comments</comments>
		<pubDate>Mon, 25 Oct 2010 07:39:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[systemTap]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=875</guid>
		<description><![CDATA[SystemTap 是监控和跟踪运行中的 Linux 内核的操作的动态方法。这句话的关键词是动态，因为 SystemTap 没有使用工具构建一个特殊的内核，而是允许您在运行时动态地安装该工具。它通过一个名为Kprobes 的应用编程接口（API）来实现该目的，本文将探索这个 API。我们首先了解以前的一些内核跟踪方法，然后在深入探讨 SystemTap 的架构及其使用。 内核跟踪 SystemTap 与一种名为 DTrace 的老技术相似，该技术源于 Sun Solaris 操作系统。在 DTrace 中，开发人员可以用 D 编程语言（C语言的子集，但修改为支持跟踪行为）编写脚本。DTrace 脚本包含许多探针和相关联的操作，这些操作在探针 “触发” 时发生。例如，探针可以表示简单的系统调用，也可以表示更加复杂的交互，比如执行特定的代码行。清单 1 显示了 DTrace 脚本的一个简单例子，它计算每个进程发出的系统调用的数量（注意，使用字典将计数和进程关联起来）。该脚本的格式包含探针（在发出系统调用时触发）和操作（对应的操作脚本）。 清单 1. 计算每个进程的系统调用的简单 DTrace 脚本 syscall:::entry { @num[pid,execname] = count(); } DTrace 是 Solaris 最引人注目的部分，所以在其他操作系统中开发它并不奇怪。DTrace 是在 Common Development and Distribution License (CDDL) 之下发行的，并且被移植到 FreeBSD 操作系统中。 另一个非常有用的内核跟踪工具是 ProbeVue，它是 IBM]]></description>
			<content:encoded><![CDATA[<p style="font-family: arial, nsimsun, sans-serif; padding-top: 0.3em; padding-right: 5px; padding-bottom: 0.7em; padding-left: 5px; font-size: 0.76em; margin: 0px;">SystemTap 是监控和跟踪运行中的 Linux 内核的操作的动态方法。这句话的关键词是<em>动态</em>，因为 SystemTap 没有使用工具构建一个特殊的内核，而是允许您在运行时动态地安装该工具。它通过一个名为<em>Kprobes</em> 的应用编程接口（API）来实现该目的，本文将探索这个 API。我们首先了解以前的一些内核跟踪方法，然后在深入探讨 SystemTap 的架构及其使用。</p>
<p style="font-family: arial, nsimsun, sans-serif; padding-top: 0.3em; padding-right: 5px; padding-bottom: 0.7em; padding-left: 5px; font-size: 0.76em; margin: 0px;"><a name="kernel_tracing"><span style="font-size: 1.5em; font-weight: bold;">内核跟踪</span></a></p>
<p style="font-family: arial, nsimsun, sans-serif; padding-top: 0.3em; padding-right: 5px; padding-bottom: 0.7em; padding-left: 5px; font-size: 0.76em; margin: 0px;">SystemTap 与一种名为 <em>DTrace</em> 的老技术相似，该技术源于 Sun Solaris 操作系统。在 DTrace 中，开发人员可以用 D 编程语言（<code style="font-family: monospace; font-size: small !important;">C</code>语言的子集，但修改为支持跟踪行为）编写脚本。DTrace 脚本包含许多探针和相关联的操作，这些操作在探针 “触发” 时发生。例如，探针可以表示简单的系统调用，也可以表示更加复杂的交互，比如执行特定的代码行。清单 1 显示了 DTrace 脚本的一个简单例子，它计算每个进程发出的系统调用的数量（注意，使用字典将计数和进程关联起来）。该脚本的格式包含探针（在发出系统调用时触发）和操作（对应的操作脚本）。</p>
<p><a name="list1"><strong style="font-size: 0.76em; font-weight: bold; padding-top: 0.3em; padding-right: 5px; padding-bottom: 0.7em; padding-left: 5px; font-family: arial, sans-serif;">清单 1. 计算每个进程的系统调用的简单 DTrace 脚本</strong></a></p>
<table style="font-size: 0.8em;" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td style="font-family: arial, nsimsun, sans-serif; background-color: #f7f7f7 !important; padding-top: 2px; padding-right: 2px; padding-bottom: 5px; padding-left: 2px; border: 1px solid #cccccc;">
<pre style="width: 694px; margin-top: 0px; margin-bottom: 0px; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; font-size: 11px; overflow-x: auto; overflow-y: auto; background-image: initial !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: #f7f7f7 !important; color: #000000; background-position: initial initial !important; background-repeat: initial initial !important;">syscall:::entry
{ 

  @num[pid,execname] = count(); 

}</pre>
</td>
</tr>
</tbody>
</table>
<p style="font-family: arial, nsimsun, sans-serif; padding-top: 0.3em; padding-right: 5px; padding-bottom: 0.7em; padding-left: 5px; font-size: 0.76em; margin: 0px;">DTrace 是 Solaris 最引人注目的部分，所以在其他操作系统中开发它并不奇怪。DTrace 是在 Common Development and Distribution License (CDDL) 之下发行的，并且被移植到 FreeBSD 操作系统中。</p>
<p style="font-family: arial, nsimsun, sans-serif; padding-top: 0.3em; padding-right: 5px; padding-bottom: 0.7em; padding-left: 5px; font-size: 0.76em; margin: 0px;">另一个非常有用的内核跟踪工具是 <em>ProbeVue</em>，它是 IBM 为 IBM® AIX® 操作系统 6.1 开发的。您可以使用 ProbeVue 探查系统的行为和性能，以及提供特定进程的详细信息。这个工具使用一个标准的内核以动态的方式进行跟踪。清单 2 显示了 ProbeVue 脚本的一个例子，它指出发出 <code style="font-family: monospace; font-size: small !important;">sync</code> 系统调用的特定进程。</p>
<p><a name="list2"><strong style="font-size: 0.76em; font-weight: bold; padding-top: 0.3em; padding-right: 5px; padding-bottom: 0.7em; padding-left: 5px; font-family: arial, sans-serif;">清单 2. 指出哪个进程调用 sync 的简单 ProbeVue 脚本</strong></a></p>
<table style="font-size: 0.8em;" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td style="font-family: arial, nsimsun, sans-serif; background-color: #f7f7f7 !important; padding-top: 2px; padding-right: 2px; padding-bottom: 5px; padding-left: 2px; border: 1px solid #cccccc;">
<pre style="width: 694px; margin-top: 0px; margin-bottom: 0px; font-family: 'Andale Mono', 'Lucida Console', Monaco, Liberation, fixed, monospace; font-size: 11px; overflow-x: auto; overflow-y: auto; background-image: initial !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important; background-color: #f7f7f7 !important; color: #000000; background-position: initial initial !important; background-repeat: initial initial !important;">@@syscall:*:sync:entry
{
  printf( "sync() syscall invoked by process ID %d\n", __pid );
  exit();
}</pre>
</td>
</tr>
</tbody>
</table>
<p style="font-family: arial, nsimsun, sans-serif; padding-top: 0.3em; padding-right: 5px; padding-bottom: 0.7em; padding-left: 5px; font-size: 0.76em; margin: 0px;">考虑到 DTrace 和 ProbeVue 在各自的操作系统中的巨大作用，为 Linux 操作系统策划一个实现该功能的开源项目是势不可挡的。SystemTap 从 2005 年开始开发，它提供与 DTrace 和 ProbeVue 类似的功能。许多社区还进一步完善了它，包括 Red Hat、Intel、Hitachi 和 IBM 等。</p>
<p style="font-family: arial, nsimsun, sans-serif; padding-top: 0.3em; padding-right: 5px; padding-bottom: 0.7em; padding-left: 5px; font-size: 0.76em; margin: 0px;">这些解决方案在功能上都是类似的，在触发探针时使用探针和相关联的操作脚本。现在，我们看一下 SystemTap 的安装，然后探索它的架构和使用。</p>
<h1><a href="http://www.ibm.com/developerworks/cn/linux/l-systemtap/index.html" target="_blank">原文地址</a></h1>
<p><a href="http://www.xmsc.com.cn/InfoView/Article_79967_4.html">http://www.xmsc.com.cn/InfoView/Article_79967_4.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/875/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>主流文本编辑器学习曲线[zz]</title>
		<link>http://yaronspace.cn/blog/archives/873</link>
		<comments>http://yaronspace.cn/blog/archives/873#comments</comments>
		<pubDate>Wed, 20 Oct 2010 04:41:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[业界趣闻轶事]]></category>
		<category><![CDATA[emacs]]></category>
		<category><![CDATA[notepad]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=873</guid>
		<description><![CDATA[有意思 主流编辑器学习曲线图 注1：Pico(PIne COmposer)是Unix操作系统中最常见的三种文字处理软件之一，具有文字编辑、搜索、拼写检查、文件浏览和段对齐功能，适合高效地编辑短小的文件。Pico是由华盛顿大学开发的免费软件，随着pine电子邮件处理软件发布。它是在Emacs的基础上以pine的邮件编辑为目标而开发的，所以其指令集是Emacs的子集，但是由于在界面上有提示快捷键，相对于vi和Emacs来说更加容易使用。由于Pico虽然是免费软件，但是它并不是开源软件，所以很多Linux版本并不包含Pico。这些版本通常提供一个界面类似的开源软件nano——Pico的克隆版。 注2：图中的纵横坐标没有标明。我所理解的是——X轴是熟练程度，Y轴是技能。于是对于notepad 来说，技能和熟练程度呈正比。对于VS来说，熟练程度越大，所需要技能先是越来越多，而随着熟练程度的增长，你需要的技能也越少。而对于VI来说，一开始就需要相当大的技能，但一旦掌握这些技能，则你将会越来越熟练。而对于emacs来说，技能和熟练程度是呈旋涡状。 原文地址：http://coolshell.cn/articles/3125.html]]></description>
			<content:encoded><![CDATA[<p>有意思<br />
<img style="margin-top: 0px; margin-right: 5px; margin-bottom: 0px; margin-left: 5px; max-width: 600px; border: 0px initial initial;" title="主流编辑器学习曲线图" src="http://coolshell.cn/wp-content/uploads/2010/10/horrorstories.txt.jpg" alt="" width="600" height="400" /></p>
<p style="padding-top: 3px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; text-align: center; margin: 0px;">主流编辑器学习曲线图</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;"><strong>注1</strong>：<strong>Pico</strong>(<strong>PI</strong>ne <strong>CO</strong>mposer)是Unix操作系统中最常见的三种文字处理软件之一，具有文字编辑、搜索、拼写检查、文件浏览和段对齐功能，适合高效地编辑短小的文件。Pico是由华盛顿大学开发的免费软件，随着<a style="color: #2970a6; text-decoration: none;" title="Pine（尚未撰写）" href="http://www.washington.edu/pine/" target="_blank">pine</a>电子邮件处理软件发布。它是在Emacs的基础上以pine的邮件编辑为目标而开发的，所以其指令集是Emacs的子集，但是由于在界面上有提示快捷键，相对于vi和Emacs来说更加容易使用。由于Pico虽然是免费软件，但是它并不是开源软件，所以很多Linux版本并不包含Pico。这些版本通常提供一个界面类似的开源软件<a style="color: #2970a6; text-decoration: none;" title="Nano" href="http://www.nano-editor.org/" target="_blank">nano</a>——Pico的克隆版。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;"><strong>注2</strong>：图中的纵横坐标没有标明。我所理解的是——X轴是熟练程度，Y轴是技能。于是对于notepad 来说，技能和熟练程度呈正比。对于VS来说，熟练程度越大，所需要技能先是越来越多，而随着熟练程度的增长，你需要的技能也越少。而对于VI来说，一开始就需要相当大的技能，但一旦掌握这些技能，则你将会越来越熟练。而对于emacs来说，技能和熟练程度是呈旋涡状。</p>
<p>原文地址：<a href="http://coolshell.cn/articles/3125.html">http://coolshell.cn/articles/3125.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/873/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>osdi 会议链接</title>
		<link>http://yaronspace.cn/blog/archives/871</link>
		<comments>http://yaronspace.cn/blog/archives/871#comments</comments>
		<pubDate>Tue, 19 Oct 2010 14:14:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[业界趣闻轶事]]></category>
		<category><![CDATA[osdi]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=871</guid>
		<description><![CDATA[http://www.usenix.org/events/osdi10/tech/ 里面有GOOGLE  Microsoft 和VMware 等公司的文章，很值得一看，记录下]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.usenix.org/events/osdi10/tech/" target="_blank">http://www.usenix.org/events/osdi10/tech/</a></p>
<p>里面有GOOGLE  Microsoft 和VMware 等公司的文章，很值得一看，记录下</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/871/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vim templates模板用法介绍</title>
		<link>http://yaronspace.cn/blog/archives/868</link>
		<comments>http://yaronspace.cn/blog/archives/868#comments</comments>
		<pubDate>Mon, 18 Oct 2010 05:31:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux编程]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[模板]]></category>
		<category><![CDATA[自动载入]]></category>

		<guid isPermaLink="false">http://www.yaronspace.cn/blog/?p=868</guid>
		<description><![CDATA[今天看到一个同学问vim 中新建文件时自动生成如作者、时间等信息的vim 插件，想到之前也试过一些template插件，都没有成功，最后使用doxgen取代之，今天就想试下，google半天终于解决了 下载template.rar 文件，第三方提供 下载地址 1、将文件放入 plugin（~/.vim/plugin/ 或者 $HOME/vimfiles/plugin/）目录 2、.vimrc 加入 let g:template_load = 1 let g:template_tags_replacing = 1 let g:T_AUTHOR = &#8220;liyangguang&#8221; let g:T_AUTHOR_EMAIL = &#8220;liyangguang@software.ict.ac.cn&#8221; let g:T_AUTHOR_WEBSITE = &#8220;http://www.yaronspace.cn/blog&#8221; let g:T_DATE_FORMAT = &#8220;%Y-%m-%d %H:%M:%S&#8221; 3、新建一个模板文件存为 templates/tpl.c（例如~/.vim/templates/tpl.c） 模板名的取名规则是 tpl.extension，新建*.h的时候，tpl.h 被读入 C CODE/* * Author: &#60;T_AUTHOR&#62; &#60;&#60;T_AUTHOR_EMAIL&#62;&#62; * &#60;T_AUTHOR_WEBSITE&#62; * * File: &#60;T_FILENAME&#62; *]]></description>
			<content:encoded><![CDATA[<p>今天看到一个同学问vim 中新建文件时自动生成如作者、时间等信息的vim 插件，想到之前也试过一些template插件，都没有成功，最后使用<a href="http://www.yaronspace.cn/blog/index.php/archives/682" target="_blank">doxgen</a>取代之，今天就想试下，google半天终于解决了</p>
<p>下载template.rar 文件，第三方提供</p>
<h2><a href="http://www.yaronspace.cn/blog/my_upload/868/template_loader.rar" target="_blank">下载地址</a></h2>
<p>1、将文件放入 plugin（~/.vim/plugin/ 或者 $HOME/vimfiles/plugin/）目录</p>
<p>2、.vimrc 加入</p>
<blockquote>
<p>    let g:template_load = 1</p>
<p>let g:template_tags_replacing = 1</p>
<p>let g:T_AUTHOR = &#8220;liyangguang&#8221;</p>
<p>let g:T_AUTHOR_EMAIL = &#8220;liyangguang@software.ict.ac.cn&#8221;</p>
<p>let g:T_AUTHOR_WEBSITE = &#8220;http://www.yaronspace.cn/blog&#8221;</p>
<p>let g:T_DATE_FORMAT = &#8220;%Y-%m-%d %H:%M:%S&#8221;</p></blockquote>
<p>3、新建一个模板文件存为 templates/tpl.c（例如~/.vim/templates/tpl.c）<br />
模板名的取名规则是 tpl.extension，新建*.h的时候，tpl.h 被读入</p>

<div class="wp_syntax"><div class="code_title">C CODE</div><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/*
 * Author: &lt;T_AUTHOR&gt; &lt;&lt;T_AUTHOR_EMAIL&gt;&gt;
 * &lt;T_AUTHOR_WEBSITE&gt;
 *
 * File: &lt;T_FILENAME&gt;
 * Create Date: &lt;T_CREATE_DATE&gt;
 *
 */</span>
<span style="color: #993333;">int</span> 
main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #808080; font-style: italic;">/* vim: set ts=4 sw=4: */</span></pre></div></div>

<p>Ok，启动vim，看看是否加载模板成功</p>
<p>ps: 可能会遇到^M是非法字符的错误，使用vim 打开，在命令模式下输入:set ff=unix  :w 重启vim即可</p>
]]></content:encoded>
			<wfw:commentRss>http://yaronspace.cn/blog/archives/868/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

