﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-洗尘斋-随笔分类-unix</title><link>http://www.cppblog.com/lmlf001/category/5149.html</link><description>三悬明镜垂鸿韵，九撩清泉洗尘心
</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 08:46:25 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 08:46:25 GMT</pubDate><ttl>60</ttl><item><title>信号量与PV操作</title><link>http://www.cppblog.com/lmlf001/archive/2007/09/20/32542.html</link><dc:creator>芥之舟</dc:creator><author>芥之舟</author><pubDate>Thu, 20 Sep 2007 06:21:00 GMT</pubDate><guid>http://www.cppblog.com/lmlf001/archive/2007/09/20/32542.html</guid><wfw:comment>http://www.cppblog.com/lmlf001/comments/32542.html</wfw:comment><comments>http://www.cppblog.com/lmlf001/archive/2007/09/20/32542.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lmlf001/comments/commentRss/32542.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lmlf001/services/trackbacks/32542.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->//信号量与PV操作的一个例子，模拟借书还书操作，共4个用户，每用户最多借15本书，书库共40本书，在书库没书时，该用户处于睡眠等待状态，直到有其他用户还书，若所有用户均处于等待状态，则产生了死锁int&...&nbsp;&nbsp;<a href='http://www.cppblog.com/lmlf001/archive/2007/09/20/32542.html'>阅读全文</a><img src ="http://www.cppblog.com/lmlf001/aggbug/32542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lmlf001/" target="_blank">芥之舟</a> 2007-09-20 14:21 <a href="http://www.cppblog.com/lmlf001/archive/2007/09/20/32542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>msgsnd与msgrcv函数出现invalid参数的问题</title><link>http://www.cppblog.com/lmlf001/archive/2007/09/19/32486.html</link><dc:creator>芥之舟</dc:creator><author>芥之舟</author><pubDate>Wed, 19 Sep 2007 09:52:00 GMT</pubDate><guid>http://www.cppblog.com/lmlf001/archive/2007/09/19/32486.html</guid><wfw:comment>http://www.cppblog.com/lmlf001/comments/32486.html</wfw:comment><comments>http://www.cppblog.com/lmlf001/archive/2007/09/19/32486.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lmlf001/comments/commentRss/32486.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lmlf001/services/trackbacks/32486.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 今天写了一个小程序，使用了消息队列的msgsnd msgrcv函数，由msgsnd函数循环处理由终端输入的消息，然后把它发送到消息队列，而另一个进程则循环读取消息，进行处理。<br>&nbsp;&nbsp;&nbsp; 这时，问题出现了，每次调用msgrcv函数的时候，它总是第一次调用成功，而第二次返回错误，察看errno=22，打印出来是invalid argument，无效参数。<br>&nbsp;&nbsp;&nbsp; 凭它的说明，可以看出可能是我调用函数的时候参数错误，但为什么第一次能调用成功呢？<br>&nbsp;&nbsp;&nbsp; 检查了一下，没看出问题。然后google之，发现许多人和我出现了同样的问题，但没有人给出解答。<br>&nbsp;&nbsp;&nbsp; 自己鼓捣了好久，还是没搞定。<br>&nbsp;&nbsp;&nbsp; 然后man 2 msgsnd，一下午不知打了多少遍了，这一次从头到尾一个字一个字的读了下去。<br>&nbsp;&nbsp;&nbsp; 终于发现问题了。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;msgsnd(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;msqid,&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">msgp,&nbsp;size_t&nbsp;msgsz,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;msgflg);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssize_t&nbsp;msgrcv(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;msqid,&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">msgp,&nbsp;size_t&nbsp;msgsz,&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;msgtyp,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;msgflg);</span></div>
&nbsp;&nbsp;&nbsp; man文档里有一句话：<span style="color: red;">The&nbsp; mtext&nbsp; field&nbsp; is an array (or other structure) whose size is specified by msgsz</span>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 一直没认真去看，想当然的以为msgsz就是msgp的大小了，原来人家不是，自己自作多情了。。。<br><br>&nbsp;&nbsp;&nbsp; 这么一个小问题花了我半个下午，但现在发现总比以后出错要好多了~&nbsp; <br>&nbsp;&nbsp;&nbsp; 写出来，给那些第一次使用的朋友们看~~<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; 把修改后的代码贴出来：<br> <br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;s_msg{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;type;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;mtext[</span><span style="color: #000000;">256</span><span style="color: #000000;">];<br>};</span></div>
<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">//snd<br>
int</span><span style="color: #000000;">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;mid;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">((mid</span><span style="color: #000000;">=</span><span style="color: #000000;">msgget(</span><span style="color: #000000;">4446</span><span style="color: #000000;">,IPC_CREAT</span><span style="color: #000000;">|</span><span style="color: #000000;">0666</span><span style="color: #000000;">))</span><span style="color: #000000;">==-</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perr_exit(</span><span style="color: #000000;">"</span><span style="color: #000000;">msgget:</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;buf[BUFSIZE];<br>&nbsp;&nbsp;&nbsp;&nbsp;memset(buf,</span><span style="color: #000000;">'</span><span style="color: #000000;">\0</span><span style="color: #000000;">'</span><span style="color: #000000;">,BUFSIZE);<br>&nbsp;&nbsp;&nbsp;&nbsp;s_msg&nbsp;mymsg;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(fgets(buf,BUFSIZE,stdin)</span><span style="color: #000000;">!=</span><span style="color: #000000;">NULL){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(strlen(buf)</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">2</span><span style="color: #000000;">)</span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[strlen(buf)]</span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">\0</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(sscanf(buf,</span><span style="color: #000000;">"</span><span style="color: #000000;">%d%s</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">mymsg.type,mymsg.mtext)</span><span style="color: #000000;">!=</span><span style="color: #000000;">2</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perr_exit(</span><span style="color: #000000;">"</span><span style="color: #000000;">Invalid&nbsp;input:</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(msgsnd(mid,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">mymsg,</span><span style="color: #000000;">256</span><span style="color: #000000;">,IPC_NOWAIT))&nbsp;&nbsp;  &nbsp;&nbsp;  //msgsiz 为sizeof(mtext[]),而非sizeof(s_msg)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perr_exit(</span><span style="color: #000000;">"</span><span style="color: #000000;">msgsnd:</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(buf,</span><span style="color: #000000;">'</span><span style="color: #000000;">\0</span><span style="color: #000000;">'</span><span style="color: #000000;">,BUFSIZE);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br></span></div>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">//rcv<br>
int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">argv)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;mid;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">((mid</span><span style="color: #000000;">=</span><span style="color: #000000;">msgget(</span><span style="color: #000000;">4446</span><span style="color: #000000;">,IPC_CREAT</span><span style="color: #000000;">|</span><span style="color: #000000;">0666</span><span style="color: #000000;">))</span><span style="color: #000000;">==-</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perr_exit(</span><span style="color: #000000;">"</span><span style="color: #000000;">msgget:</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;s_msg&nbsp;mymsg;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(msgrcv(mid,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">mymsg,</span><span style="color: #000000;">256</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,MSG_NOERROR)</span><span style="color: #000000;">==-</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;&nbsp;  //就是这里出错的，记住你了<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perr_exit(</span><span style="color: #000000;">"</span><span style="color: #000000;">msgrcv</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(mymsg.type</span><span style="color: #000000;">!=</span><span style="color: #000000;">4446</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">mymsg.type</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">mymsg.mtext</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">4446&nbsp;quit\n</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">mymsg,</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(mymsg));<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br></span></div>
<br> <img src ="http://www.cppblog.com/lmlf001/aggbug/32486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lmlf001/" target="_blank">芥之舟</a> 2007-09-19 17:52 <a href="http://www.cppblog.com/lmlf001/archive/2007/09/19/32486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mmap进行文件映射可能遇到的问题</title><link>http://www.cppblog.com/lmlf001/archive/2007/09/13/32112.html</link><dc:creator>芥之舟</dc:creator><author>芥之舟</author><pubDate>Thu, 13 Sep 2007 02:56:00 GMT</pubDate><guid>http://www.cppblog.com/lmlf001/archive/2007/09/13/32112.html</guid><wfw:comment>http://www.cppblog.com/lmlf001/comments/32112.html</wfw:comment><comments>http://www.cppblog.com/lmlf001/archive/2007/09/13/32112.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lmlf001/comments/commentRss/32112.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lmlf001/services/trackbacks/32112.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; mmap函数实现把一个文件映射到一个内存区域，从而我们可以像读写内存一样读写文件，他比单纯调用read/write也要快上许多。在某些时候我们可以把内存的内容拷贝到一个文件中实现内存备份，当然，也可以把文件的内容映射到内存来恢复某些服务。另外，mmap实现共享内存也是其主要应用之一，mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。<br>关于mmap的内容请看《Unix环境高级编程》12章。在这里，说一下使用mmap函数时可能遇到的问题：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //下面的代码把文件1.ls中的内容通过mmap函数写入2.ls中，忽略出错处理</span><span style="color: #0000ff;"><br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int</span><span style="color: #000000;">&nbsp;fd</span><span style="color: #000000;">=</span><span style="color: #000000;">open(</span><span style="color: #000000;">"</span><span style="color: #000000;">1.ls</span><span style="color: #000000;">"</span><span style="color: #000000;">,O_RDONLY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;fd2</span><span style="color: #000000;">=</span><span style="color: #000000;">open(</span><span style="color: #000000;">"</span><span style="color: #000000;">2.ls</span><span style="color: #000000;">"</span><span style="color: #000000;">,O_CREAT</span><span style="color: #000000;">|</span><span style="color: #000000;">O_RDWR</span><span style="color: #000000;">|</span><span style="color: #000000;">O_TRUNC,S_IRUSR</span><span style="color: #000000;">|</span><span style="color: #000000;">S_IWUSR);</span><span style="color: #008000;">//</span><span style="color: #008000;">必须设置读写权限,若只有写权限,会产生SIGSEGV信号<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">mmap进行文件映射时必须先读取文件`</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;stat&nbsp;st;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fstat(fd,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">st);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lseek(fd2,st.st_size</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">,SEEK_SET);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write(fd2,</span><span style="color: #000000;">""</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">必须的，如果不设置，当写入数据的时候会遇到文件结束符，产生SIGBUS信号</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">_src</span><span style="color: #000000;">=</span><span style="color: #000000;">mmap(NULL,st.st_size,PROT_READ,MAP_SHARED,&nbsp;fd,</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">_des</span><span style="color: #000000;">=</span><span style="color: #000000;">mmap(NULL,st.st_size,PROT_WRITE,MAP_SHARED,fd2,</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(fd);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">关闭文件后&nbsp;依然可修改文件内容</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(fd2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(_des,_src,st.st_size);</span></div>
<br>总结一下，可能产生的问题如下：<br>&nbsp;&nbsp;&nbsp; 1.进行文件映射的描述符必须拥有读权限，否则会产生SIGSEGV信号<br>&nbsp;&nbsp;&nbsp; 2.把内存内容写入映射文件时，必须确保被写文件当前位置到文件结尾的长度不小于所写内容长度，否则产生SIGBUS信号<br>&nbsp;&nbsp;&nbsp; 3.关闭文件描述符并不能保证文件内容不被修改<br>&nbsp;&nbsp;&nbsp; 4.munmap并不能使映射的内容写回磁盘<br><br> <img src ="http://www.cppblog.com/lmlf001/aggbug/32112.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lmlf001/" target="_blank">芥之舟</a> 2007-09-13 10:56 <a href="http://www.cppblog.com/lmlf001/archive/2007/09/13/32112.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>