进程间的通信
进程间的通信方法很多,这里不一一说明,只说一些常见的和使用的API函数。只是个人心得,或许说的不是很好,贴出来只是为了备份。
第一种:邮槽(MailSlot)
使用邮槽通信,必须要有服务端和客户端,而且这种通信时单向的即服务端只能读,客户端只能写,遵循先入先出,必须先写才能读。这中方法可以用在本机进程与本机进程间的通信,也可以用在主机间的进程通信。主机间的进程通信要使用UDP协议,所以是一种不可靠的通信。
主要API函数:
(1)HANDLE WINAPI CreateMailslot( LPCTSTR lpname, //邮槽名
DWORDnMaxMessageSize,//
DWORDlReadTimeout,
LPSECURITY_ATTRIBUTESlpSecurityAttributes)
参数说明:
LPCTSTR lpname //邮槽名
DWORD nMaxMessageSize //最大消息长度
DWORD lReadTimeout //限制读取时间(ms),如果设置为 0(无消息则立即返回)或 //MAILSLOT_WAIT_FOREVER (直到读到消息才返回)
LPSECURITY_ATTRIBUTESlpSecurityAttributes //安全属性
(2)GetMailslotInfo( HANDLE hMailslot,
LPDWORDlpMaxMessagesize,
LPDOWDlpNexrSize,
LPDWORDlpMessageCount
LPDWORDlpReadTimeout)
参数说明:
HANDLE hMailslot //邮槽句柄
LPDWORD lpMaxMessagesize, //返回的消息最大长度
LPDOWD lpNexrSize, //返回下一个消息长度
LPDWORD lpMessageCount //返回消息的数量
LPDWORD lpReadTimeout //返回读取超时时间
(3)BOOL WINAPISetMailslot(HANDLEhMailslot, DWORD lReadTimeout)
参数说明:
HANDLE hMailslot, //邮槽句柄
DWORD lReadTimeout //设置超时时间
邮槽的信息读、写是通过API函数 ReadFile() 和 WriteFile()实现的,这里不多解释了。
关闭使用CloseHandle()
第二种:管道
管道也是基于服务端和客户端的实现的,管道是通过进程间的共享数据实现的,就是一段共享内存。管道分为匿名管道和命名管道。
匿名管道适用于父进程与子进程的通信,不能进行网络通信,也是单向通信,一端写一端读。
命名管道可以在任意进程间进行通信,通信时双向的,任意一端可读可写,但不能是同一时间哟!
主要API函数
(1)HANDLE WINAPICreatNamePipe( LPCSTR lpName,
DWORDdwOpenMode,
DWORDdwPipeMode,
DWORDnMaxInstances
DWORDnOutBufferSize,
DWORDnInBufferSize
DWORDnDefaultTimeOut
LPSECURITY_ATTRIBUTESlpSecurityAtribures)
参数说明:
LPCSTR lpName //管道名
DWORD dwOpenMode //打开模式包括存取模式、I/O模式详见MSDN
DWORD dwPipeMode //管道模型,包括管道类型、管读模式、管道等待模式
DWORD nMaxInstances//指定一个pipe能创建最多的实例
DWORD nOutBufferSize, //输出缓存大小
DWORD nInBufferSize//输入缓存大小
DWORD nDefaultTimeOut//超时时间
LPSECURITY_ATTRIBUTES lpSecurityAtribures//安全属性
返回值:管道句柄
(2)管道监听
BOOL WINAPI ConnectNamePipe(HANDLEhNamePipe, LPOVERLAPPED lpOverlapped)
参数说明:
HANDLE hNamePipe //管道句柄,在使用CreateNamePipe函数就获得了
LPOVERLAPPED lpOverlapped //指向OVERLAPPED结构的指针,创建管道式说明了是I/O重叠模式,就要只定这个函数,否则置为NULL。
关闭使用CloseHandle()
管道的读写,也是同过ReadFileEx()WriteFileEx()实现的
第三种:剪贴板
剪贴板是最常见的系统特种之一,无论是windows 还是Linux系统都会使用到。典型的例子就是我们使用复制、粘贴。剪贴板的特点就是数据传输没有明确的目标,数据时被动访问,不知道哪个程序或者哪个进程什么时候访问,数据可以多次的访问,知道有新的数据被写入。可以通过咱们的复制粘贴进行理解,这个很好说明不多介绍了。
第四种:FileMapping
这个我自己也不是非常清楚,只知道是一种通过共享内存的高效进程通信方式。因为是贡献内存,所以读写速度非常快,允许大量数据传输。
最后一种:Socket
这种方式完全使用Socket通信原理,其实任何可以在两台主机间进行网络数据通信的机制都可以用于进程通信。这里也不多说,我想Socket每个大学生都会有这个课程设计了。如果忘记了,回去翻翻你以前做过的局域网聊天工具吧!