var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-333696-1']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
  • 2008年09月09日

    进程间通信

    分类:

    进程间通信(IPCInter-Process Communication),其机制包括:文件、文件映射(Memory-Mapped Files)、套接字(Sockets)、远程过程调用(RPC)、消息管道(Anonymous/Named Pipes)、共享内存(Shared Memory)COM/DCOM、窗口消息(WM_COPYDATA)和邮件槽(Mailslots)等等。

     

    WM_COPYDATA是位移一个可以在16位和32位程序间搬移数据的方法;缺点一,效率不高,任何你要传递的数据都需要先被拷贝到另一个进程中;缺点二,没法使用PostThreadMessage(),只能用于SendMessage()

     

    1.     剪贴板

    当用户在应用程序中执行剪切或复制操作时,应用程序把选取的数据用一种或多种格式放在剪贴板上。然后任何其它应用程序都可以从剪贴板上拾取数据,从给定格式中选择 适合自己的格式。

    OpenClipboard->EmptyClipboard->SetClipboardData->CloseClipboard

    2.     匿名管道

    在父进程和子进程之间,或同一父进程的两个子进程之间传输数据的无名字的单向管道。通常由父进程创建管道,然后由要通信的子进程继承通道的读端点句柄或写端点句柄,然后实现通信。父进程还可以建立两个或更多个继承匿名管道读和写句柄的子进程。这些子进程可以使用管道直接通信,不需要通过父进程。

    CreatePipe

    3.     命名管道

    服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。命名管道提供两种基本通信模式:字节模式和消息模式。

    CreateNamedPipe

    4.     邮件槽

    基于广播式通讯,采用无连接不可靠的数据传输,提供进程间单向通信能力。类似信箱,任何人都可以寄信给你,但只有你才能够从信箱中取信。

    CreateMailslot

     

    剪贴板和匿名管道只能实现同一机器上两个进程间的通信,而不能实现跨网络的通信;而命名管道和邮槽不仅可以实现同一机器上两个进程间的通信,还可以实现跨网络的通信;另外,邮槽可以实现一对多通信,而命名管道只能点对点单一通信,但邮槽的缺点是数据量较小,通常在424字节以下,如果数据量大于424字节,则应采用命名管道或Windows Sockets的方式来完成。

    分享到:

    历史上的今天: