<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[mmap详解 ]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Thu, 21 Oct 2010 07:05:47 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	<br/>mmap函数是unix/linux下的系统调用，来看《Unix Netword programming》卷二12.2节有详细介绍。<br/>mmap系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式，进程可以像读写内存一样对普通文件的操作。而Posix或系统V的共享内存IPC则纯粹用于共享目的，当然mmap()实现共享内存也是其主要应用之一。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后，进程可以像访问普通内存一样对文件进行访问，不必再调用read()，write（）等操作。mmap并不分配空间, 只是将文件映射到调用进程的地址空间里, 然后你就可以用memcpy等操作写文件, 而不用write()了.写完后用msync()同步一下, 你所写的内容就保存到文件里了. 不过这种方式没办法增加文件的长度, 因为要映射的长度在调用mmap()的时候就决定了.<br/><br/>简单说就是把一个文件的内容在内存里面做一个映像，内存比磁盘快些。<br/>基本上它是把一个档案对应到你的virtual memory 中的一段，并传回一个指针。<br/><br/>以后对这段 memory 做存取时，其实就是对那个档做存取。<br/>它就是一种快速 file I/O 的东东，而且使用上和存取 memory 一样方便，只不过会占掉你的 virutal memory。<br/>#include &lt;sys/types.h&gt;<br/>#include &lt;sys/stat.h&gt; //文件状态结构<br/>#include &lt;unistd.h&gt;<br/>#include &lt;sys/mman.h&gt; //mmap头文件<br/><br/>void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);<br/><br/>mmap开启记忆体对映。<br/>start指定记忆体位置，通常都是用NULL。offset指定档案要在那里开始对映，通常都是用0。<br/><br/>int munmap(void *start, size_t length);<br/><br/>int msync(const void *start, size_t length, int flags);<br/>如果开启记忆体对映是希望写入档案中，那麽修改过的记忆体会在一段时间内与档案稍稍有点不同。如果您希望立即将资料写入档案中，可使用msync。<br/><br/>start为记忆体开始位置，length为长度。<br/><br/>flags则有三个：<br/>MS_ASYNC : 请Kernel快将资料写入。<br/>MS_SYNC : 在msync结束返回前，将资料写入。<br/>MS_INVALIDATE : 让核心自行决定是否写入，仅在特殊状况下使用<br/><br/>例子:<br/>if( (fp = open(&quot;./data.bin&quot;,O_RDONLY) ) &lt; 0 )<br/>&#123;<br/>cout&lt;&lt;&quot; Can not open !&quot;&lt;&lt;endl;<br/>exit(0);<br/>&#125;<br/>if( (fstat(fp,&amp;stat_data) ) &lt; 0 )<br/>&#123;<br/>cout&lt;&lt;&quot; fstat error !&quot;;<br/>exit(0);<br/>&#125;<br/>if( ( start_fp = mmap(NULL,stat_data.st_size,<br/>PROT_READ,MAP_SHARED,fd_denseindex,0 )) == (void *)-1)<br/>&#123;<br/>cout&lt;&lt;&quot; mmap error !&quot;&lt;&lt;endl;<br/>exit(0);<br/>&#125;<br/>这样便能从start_fp开始读取数据啦!<br/>来源：http://hi.baidu.com/yoursguang/blog/item/81f77f387720022296ddd814.html
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] mmap详解 ]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>