17进程间通信.txt

时间:2022-05-12 14:31:27
因为位于同一进程中的多个线程共享一个地址空间,因此线程间通信非常简单。
然而,每个进程拥有4GB地址空间都是私有的,一个进程不能访问另一个进程地址空间的数据,因此进程间通信困难些。
网络程序是在两个进程,或多个进程间的通信。
4种进程间通信方式:剪切板、匿名管道、命名管道、邮槽。
剪切板:
(延迟提交技术,为了提高资源利用率,避免浪费内存空间,第一次调用SetClipboardData函数,将hMem参数设置为NULL,在剪切板上以指定的剪切板格式设置一个空剪切板数据块。然后直到其他进程需要数据或自身进程需要终止运行时再次调用SetClipboardData函数,这时才真正提交数据.)
在把数据放置到剪切板之后,一定要记得调用CloseClipboard函数关闭剪切板,否则其他进程将无法打开剪切板。
匿名管道:
是一个未命名的、单项管道,通常用来在一个父进程和一个子进程之间传输数据。匿名管道只能实现本地机器上两个进程间的通信,而不能实现跨网络的通信。
CreatePipe
匿名管道主要用来在父子进程间进行通信,利用匿名管道实现父子进程间通信时,需要注意一点:因为匿名管道没有名称,所以只能在父进程中调用CreatePipe函数创建子进程,将管道的读、写句柄传递给子进程。
命名管道:
命名管道通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节,在不了解网络协议的情况下,也可以利用命名管道来实现进程间通信。
  命名管道和匿名管道的区别:
匿名管道只能在本地机器上的父子进程间进行通信,而命名管道不仅可以再本机上实现两个进程间的通信,还可以跨网络实现两个进程间的通信。
命名管道式围绕Windows文件系统设计的一种机制,采用"命名管道文件系统(Named Pipe File System,NPFS)",客户机和服务器可利用标准Win32文件系统函数(ReadFile,WriteFile)。
命名管道服务器和客户机的区别在于:服务器是唯一一个有权创建命名管道的过程,只有它才能接受管道客户机的连接请求,客户机只能同一个现成的命名管道服务器建立连接。管道服务器只能在Windows NT或Windows 2000.客户机可以使windows 95或98.但服务器必须是NT或2000.
命名管道提供两种基本通信模式:字节模式和消息模式.
  字节模式:数据以一个连续的字节流的形式在客户机和服务器之间流动.
  消息模式:客户机和服务器则通过一系列不连续的数据单位,进行数据的收发,每次在管道上发出了一个消息后,它必须作为一条完整的消息读入。
CreateNamedPipe
创建类向导还是不太清楚 哎???????
利用C语言编程时,如果想要指定两个反斜杠,那么在代码中就需要输入四个反斜杠。
对同一个命名管道实例来说,在某一时刻,它只能和一个客户端进行通信。
  具体是:在服务器端调用CreateNamedPipe创建命名管道之后,调用ConnectNamedPipe函数让服务器端进程等待客户端进程连接到该命名管道实例上。在客户端,首先调用WaitNamedPipe函数判断当前是否可以利用命名管道实例,如有,CreateFile打开实例,建立连接。
邮槽:
邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输。邮槽是一种单向通信机制,创建邮槽的服务器进程读取数据,打开邮槽的客户机进程写入数据。(为保证邮槽在各种Windows平台下都能够正常工作,在传输消息的时候,应将消息长度限制在424字节一下)
CreateMaillot
邮槽只能进行单向通信,想技能读,又能发送,在同一个程序同时实现邮槽的服务器端(读取端)和客户端(发送端)。邮槽是基于广播通信的(可实现一对多的单向通信)。
总结:
剪切板和匿名管道只能实现同一台机器上两个进程间的通信,而不能实现跨网络的通信;命名管道和邮槽不仅可以实现同一台机器上两个进程的通信,还可以实现跨网络的进程间通信;另外,邮槽可以实现一对多通信,而命名管道只能是点对点的单一的通信,但邮槽的缺点是数据量较小,通常都是424字节一下,如果数据量大,可以命名管道。