﻿<?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++博客-书呆子 的 notepad-随笔分类-os</title><link>http://www.cppblog.com/GUO/category/14889.html</link><description>   look to the master,
    follow the master,
    walk with the master,
    see through the master,
    become the master.</description><language>zh-cn</language><lastBuildDate>Thu, 09 Sep 2010 17:16:57 GMT</lastBuildDate><pubDate>Thu, 09 Sep 2010 17:16:57 GMT</pubDate><ttl>60</ttl><item><title>进程间通信的11种方法</title><link>http://www.cppblog.com/GUO/archive/2010/09/10/126277.html</link><dc:creator>书呆子</dc:creator><author>书呆子</author><pubDate>Thu, 09 Sep 2010 16:42:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/09/10/126277.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/126277.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/09/10/126277.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/126277.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/126277.html</trackback:ping><description><![CDATA[<p><font id="zoom" class="f14">摘自internet，查看更详细更精彩的知识讲解，请自己<a style="color: #ff0000;" target="_blank" href="http://www.google.com/">google</a></font>
<br></p>
<p>进程间通信有以下方法<br><br>Using named objects <br>Waiting for multiple objects <br>Waiting in a message loop <br>Using mutex objects <br>Using semaphore objects <br>Using event objects <br>Using critical section objects <br>Using timer queues <br>Using waitable timer objects <br>CreateFileMapping<br>我觉得还是用event比较方便<br><br>
<table border="0" cellpadding="0" cellspacing="0" width="580">
    <tbody>
        <tr>
            <td><br></td>
            <td colspan="3"><br></td>
        </tr>
    </tbody>
</table>
<strong> &nbsp; 进程间的通讯实现（IPC）的11种方法</strong> &nbsp;&nbsp;&nbsp;&nbsp; <br>
</p>
<p>&nbsp;进程通常被定义为一个正在运行的程序的实例，它由两个部分组成：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
另一个是地址空间，它包含所有的可执行模块或DLL模块的代码和数据。它还包含动态分配的空间。如线程堆栈和堆分配空间。每个进程被赋予它自己的虚拟地址
空间，当进程中的一个线程正在运行时，该线程可以访问只属于它的进程的内存。属于其它进程的内存则是隐藏的，并不能被正在运行的线程访问。<br>&nbsp;&nbsp; 为了能在两个进程之间进行通讯，由以下几种方法可供参考：</p>
<p>0。剪贴板Clipboard: 在16位时代常使用的方式，CWnd中提供支持</p>
<p>1。窗口消息 标准的Windows消息以及专用的WM_COPYDATA消息 SENDMESSAGE()接收端必须有一个窗口</p>
<p>2。使用共享内存方式（Shared Memory)<br>&nbsp;&nbsp; a.设定一块共享内存区域&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES, DWORD,&nbsp;DWORD, DWORD,&nbsp; LPCSTR) <br>&nbsp;&nbsp;&nbsp;&nbsp; 产生一个file-mapping核心对象<br>&nbsp;&nbsp;&nbsp;&nbsp; LPVOID MapViewOfFile(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HANDLE hFileMappingObject,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD&nbsp; dwDesiredAcess,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD&nbsp; dwFileOffsetHigh,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD&nbsp; dwFileOffsetLow,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD&nbsp; dwNumberOfBytesToMap<br>&nbsp;&nbsp;&nbsp;&nbsp; );<br>&nbsp;&nbsp;&nbsp; 得到共享内存的指针<br>&nbsp;&nbsp; b.找出共享内存<br>&nbsp;&nbsp;&nbsp; 决定这块内存要以点对点（peer to peer)的形式呈现<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个进程都必须有相同的能力，产生共享内存并将它初始化。每个进程<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 都应该调用CreateFileMapping(),然后调用GetLastError().如果传回的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 错误代码是ERROR_ALREADY_EXISTS,那么进程就可以假设这一共享内存区 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 域已经被别的进程打开并初始化了，否则该进程就可以合理的认为自己 排在第&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一位，并接下来将共享内存初始化。<br>&nbsp;&nbsp;&nbsp; 还是要使用client/server架构中<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只有server进程才应该产生并初始化共享内存。所有的进程都应该使用</p>
<p>HANDLE OpenFileMapping(DWORD dwDesiredAccess,<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; BOOL bInheritHandle,<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; LPCTSTR lpName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 再调用MapViewOfFile(),取得共享内存的指针<br>&nbsp;&nbsp; c.同步处理(Mutex)<br>&nbsp;&nbsp; d.清理(Cleaning up) BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CloseHandle()</p>
<p>3。动态数据交换（DDE）通过维护全局分配内存使的应用程序间传递成为可能<br>&nbsp;&nbsp; 其方式是再一块全局内存中手工放置大量的数据，然后使用窗口消息传递内存&nbsp;&nbsp;&nbsp; 指针.这是16位WIN时代使用的方式，因为在WIN32下已经没有全局和局部内存&nbsp;&nbsp;&nbsp; 了，现在的内存只有一种就是虚存。&nbsp;&nbsp; </p>
<p>4。消息管道(Message Pipe)<br>&nbsp;&nbsp; 用于设置应用程序间的一条永久通讯通道，通过该通道可以象自己的应用程序<br>&nbsp;&nbsp; 访问一个平面文件一样读写数据。<br>&nbsp;&nbsp; 匿名管道(Anonymous Pipes)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单向流动，并且只能够在同一电脑上的各个进程之间流动。<br>&nbsp;&nbsp; 命名管道(Named Pipes)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 双向，跨网络，任何进程都可以轻易的抓住，放进管道的数据有固定的格&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 式，而使用ReadFile()只能读取该大小的倍数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以被使用于I/O Completion Ports</p>
<p>5&nbsp;&nbsp; 邮件槽(Mailslots)<br>&nbsp;&nbsp;&nbsp; 广播式通信,在32系统中提供的新方法，可以在不同主机间交换数据，在&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WIN9X下只支持邮件槽客户</p>
<p>6。Windows套接字(Windows Socket)<br>&nbsp;&nbsp; 它具备消息管道所有的功能，但遵守一套通信标准使的不同操作系统之上的应&nbsp;&nbsp;&nbsp; 用程序之间可以互相通信。</p>
<p>7。Internet通信 它让应用程序从Internet地址上载或下载文件</p>
<p>8。RPC：远程过程调用，很少使用，因其与UNIX的RPC不兼容。</p>
<p>9。串行/并行通信(Serial/Parallel Communication)<br>&nbsp;&nbsp; 它允许应用程序通过串行或并行端口与其他的应用程序通信</p>
<p>10。COM/DCOM <br>&nbsp;&nbsp;&nbsp;&nbsp; 通过COM系统的代理存根方式进行进程间数据交换，但只能够表现在对接口&nbsp;&nbsp;&nbsp;&nbsp; 函数的调用时传送数据，通过DCOM可以在不同主机间传送数据。 </p>
<br> <img src ="http://www.cppblog.com/GUO/aggbug/126277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">书呆子</a> 2010-09-10 00:42 <a href="http://www.cppblog.com/GUO/archive/2010/09/10/126277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>