• 进程间通信


    Windows系统下,在进程间通信或共享数据的方式如下:
    邮槽:最简单的进程间数据共享方式,一个进程创建并拥有一个邮槽,其他进程都可以打开这个邮槽并向其发送消息。
    管道:其实质是一种共享的内存,由一个进程创建其他进程连接,并可以进行双向的通信。
    剪贴板:重要的进程间数据共享方式,所有的进程都可以设置和修改剪贴板,也都可以从剪贴板获取内容。
    WM_COPYDATA消息:消息巨涌参数wParam和lParam,但wParam和lParam最多是32位的。而WM_COPYDATA消息的参数不受wParam和lParam数据大小的限制,可以用于在进程间传递数据。
    Windows套接字:可以在不同主机上不同程序间通信,当然也可以在相同主机上的不同程序间通信。
    FileMapping:文件映射方式。
    动态数据交换(DDE):通过维护全局分配内存使的应用程序间传递成为可能,其方式是再一块全局内存中手工放置大量的数据,然后使用窗口消息传递内存 指针.这是16位WIN时代使用的方式,因为在WIN32下已经没有全局和局部内存 了,现在的内存只有一种就是虚存。 
    RPC:远程过程调用,很少使用,因其与UNIX的RPC不兼容。
    串行/并行通信(Serial/Parallel Communication):它允许应用程序通过串行或并行端口与其他应用程序通信。
    COM/DCOM:通过COM系统的代理存根方式进程进程间数据交换,但只能够表现在对接口函数的调用时传递数据,通过DCOM可以在不同主机间传递数据。
    
    邮槽:使用邮槽通信的进程分为服务端和客户端。邮槽有服务端创建,在创建时需要制定邮槽名,创建后服务端得到邮槽的句柄。在邮槽创建后,客户端可以通过邮槽名,打开邮槽,在获得句柄后可以向邮槽写入消息。缺点:通信时单向的只有服务端才能从邮槽中读取消息,客户端只能写入消息,消息是先入先出的;通过邮槽通信的数据可以是任意格式的,但是一条消息不给大于424字节;数据时通过网络传播是使用的是数据报协议,是种不可靠的通信;通过网络通信时,客户端必须知道服务端的主机名或域名。优点:除了在本机内进行进程间通信外,在主机间也可以通信。
    CreateMailslot 服务端创建一个邮槽对象。
    GetMailslotInfo 服务端获取邮槽的相关信息。
    SetMailslotInfo 服务端修改读操作时间、超时时间。
    服务器端使用ReadFile读取消息,客户端使用CreateFile打开邮槽,WriteFile写入消息。
    
    管道:一种用于在进程间共享数据的机制,其实质是一段共享内存。Windows系统为这段共享内存设计采用数据流I/O的方式来访问。由一个进程读、另一个进程写,类似一个管道两端。管道分为匿名管道和命名管道。匿名管道只能栽父子进程间进行通信,不能再网络间通信,而且数据传输时单项的,只能一段写,另一端读。命名管道可以在任意进程间通信,通信时双向的,任意一端都可读可写,但同一时间只能有一端读一端写。
    
    命名管道
    CreateNamedPipe 创建命名管道。
    ConnectToNewClient pipe服务端监听客户端的链接。
    DisconnectNamedPipe 关闭管道链接。
    
    客户端打开管道使用CreateFile,调用CreateFile时服务端会收到客户端的连接,打开成功后连接管道,并设置管道的读写模式。
    WaitNamedPipe 等待一个管道变为可用状态。
    SetNamedPipeHandleState 设置管道的读写模式。
    
    
    剪贴板由系统定义,并不属于任何一个特定的进程。系统中所有的进程都可以访问和设置剪贴板。最大特点是数据传输没有明确的目标,枚举是被动访问的,设置剪贴板的程序并不知道所设置的数据什么时候被哪个进程访问,剪贴板中的内容也可以多次访问,直到新的数据写入。由于任何一个进程都可以无限制地访问剪贴板,故也是种不可靠的通信方式。
    
    OpenClipboard 打开剪贴板,获得剪贴板的句柄。
    EmptyClipboard 清空剪贴板中的内容
    SetClipboardData 设置剪贴板的内容。
    GetClipboardData 获取剪贴板中的数据,可设置获取数据的格式。
    SetClipboardViewer 设置剪贴板的监视窗口,当剪贴板内容发生变化时,会收到WM_CHANGECBCHAIN和WM_DRAWCLIPBOARD消息。
    GetPriorityClipboardFormat 检测剪贴板中是否有特定格式的数据。
    CountClipboardFomat 获取当前剪贴板中具有的不同格式的数据。
    EnumClipboardFormats 列举当前剪贴板中的所有格式。
    GetUpdateClipboardFormats 获取当前剪贴板的所有格式。
    
    WM_COPYDATA:是个非常特殊的消息,该消息可以携带一个比较大的消息参数,而其他消息都只能携带两个固定大小的参数。发送WM_COPYDATA消息时,wParam参数应该赋值为发送此消息的窗口,而lParam消息参数指向一个COPYDATASTRUCT结构类型的变量。消息发送时,系统会将COPYDATASTRUCT及lpData所指向的内容全部发送给目标进程。目标进程在收到WM_COPYDATA后,可以从lParam参数中提取数据。
    
    DDE可能是最强大的进程间通信方式,实现也非常复杂。通信的两端分为服务端和客户端,两端都需要有窗口。
    DDE会话由客户端发起,先初始化一个会话。DDE客户端会向服务端发送一个WM_DDE_INITIATE窗口消息。服务窗口收到此消息后,根据条件判断是否需要响应此消息,如果服务端确定会客户端建立会话,那么会返回WM_DDE_ACK消息。如果客户端成功的收到了服务端发送的WM_DDE_ACK窗口消息,那么会话就已经简历,之后就进行数据传输。
    数据传输分为很多方式,可以只传送一个单独的数据项,也可以再简历一个永久数据连接。如果进行独立数据项传输,数据传输的单位是数据项。客户端使用WM_DDE_REQUEST和WM_DDE_POKE消息向服务器接收和发送数据项。数据的传输使用WM_DDE_DATA消息。而永久数据连接的简历也是通过客户端发起,客户端向服务端发送WM_DDE_ADVISE消息,服务端根据情况作出回应,根据是否能够简历连接而返回不同的WM_DDE_ACK消息。终止数据连接使用消息WM_DDE_UNADVISE。
    客户端还可以使用WM_DDE_EXECUTE请服务器发送命令。几乎所有的过程都是客户端发起请求的,而服务端响应,服务端响应的方向大多是发送一个WM_DDE_ACK消息。
    
    共享文件时一种功效的进程间通信方式,因为直接共享内存,所有访问速度非常快,而且允许大量数据传输。和其他进程间通信方式相比,限制条件要少,比如邮槽对数据大小和流向都有限制,管道只能采用半双工通信形式等,剪贴板容易受其他进程影响等。但也有缺点,最大的缺点是无法实现实时性,一个进程无论是写入还是读出数据后,另一个进程都不知道对方的操作是否已经完成。因此在要求实施数据传输时,File Mapping通常与其他进程通信方式配合使用,用于传输大量的数据。
    
    WinSock方式略。
  • 相关阅读:
    Angular2学习笔记四(之Http通信)
    立即掌握SSM框架的要诀
    How to delete the eclipse plugin.
    eclipse(Version: Mars.2 Release (4.5.2)) groovy plugin install process.
    初学ssm框架的信息
    Maven安装教程
    基于Java Mail 进行发送(带附件和压缩附件)的邮件
    基于POI和DOM4将Excel(2007)文档写进Xml文件
    datatables 行创建回调
    datatables表格中 嵌套表格问题
  • 原文地址:https://www.cnblogs.com/IMyLife/p/4826012.html
Copyright © 2020-2023  润新知