进程间通信
进程间通信(Inter-ProcessCommunication,IPC)要解决的问题是进程间的信息交流。这种信息交流的量可大可小。操作系统提供了多种进程间通信机制,可分别适用于多种不同的场合。前面所介绍的进程同步机制实际上就是进程间通信的一种,只不过交流的信息量非常少。按通信量的大小,我们可把进程间通信分成低级通信和高级通信。在低级通信中,进程间只能传递状态和整数值(控制信息),包括进程互斥和同步所采用的信号量机制。它的优点是速度快,缺点是传送信息量小、通信效率低、编程复杂。由于每次通信传递的信息量固定,因此如果传递较多信息则需要进行多次通信。用户直接实现通信的细节,编程复杂,容易出错。在高级通信中,进程间可传送任意数量的数据,包括共享存储区、管道和消息等机制。
按通信过程中是否有第三方作为中转,我们可把进程间通信分成直接通信和间接通信。直接通信是指发送方把信息直接传递给接收方。在直接通信方式中,发送方要指定接收方的地址或标识,也可以指定多个接收方或广播式地址;接收方可接收来自任意发送方的消息,并在读出消息的同时获取发送方的地址。间接通信是指通信过程要借助于收发双方进程之外的共享数据结构(如消息队列)作为通信中转。在间接通信方式中,接收方和发送方的数目可以是任意的。进程间通信还要考虑到通信过程中的一些其他特征,如通信链路特征、数据格式和收发双方的同步方式等。对进程间通信模式有影响的通信链路特征包括:链路是点对点还是广播链路;通信链路是否带缓冲区;链路是单向还是双向等。数据格式主要分成字节流和报文两类。采用字节流格式时,接收方不保留各次发送之间的分界;采用报文格式时,接收方保留各次发送之间的分界。报文方式还可进一步分成定长报文/不定长报文和可靠报文/不可靠报文。收发操作的同步方式可分成阻塞和不阻塞两种。阻塞操作是指操作方要等待操作结束;不阻塞操作是指操作提交后立即返回。
3.5.1 Windows2000/XP的信号
SetConsoleCtrlHandler在本进程的处理例程(HandlerRoutine)列表中定义或取销用户定义的处理例程;如:缺省时,它有一个CTRL+C输入的处理例程,我们可利用本调用SetConsoleCtrul来忽视或恢复CTRL+C输入的处理;GenerateConsoleCtrlEvent发送信号到与本进程共享同一控制台的控制台进程组。
signal和raise
signal设置中断信号处理例程;如:SIGINT(CTRL+C)、SIGABRT异常中止等信号的处理。
3.5.2 Windows2000/Xp基于文件映射的共享存储区
Windows 的文件映射采用文件映射(file mapping)机制:可以将整个文件映射为进程虚拟地址空间的一部分来加以访问。在CreateFileMapping和OpenFileMapping时可以指定对象名称。
–CreateFileMapping为指定文件创建一个文件映射对象,返回对象指针;
– OpenFileMapping打开一个命名的文件映射对象,返回对象指针;
– MapViewOfFile把文件映射到本进程的地址空间,返回映射地址空间的首地址;
• 这时可利用首地址进行读写;
– FlushViewOfFile可把映射地址空间的内容写到物理文件中;
– UnmapViewOfFile拆除文件映射与本进程地址空间间映射关系;
• 随后,可利用CloseHandle关闭文件映射对象;
3.5.3 Windows2000/XP的管道
命名管道:一个服务器端与一个客户进程间的通信通道;可用于不同机器上进程通信;类型分为:字节流,消息流(报文); 访问分为:单向读,单向写,双向;还有关于操作阻塞(wait/nowait) 的设置。相应有一个文件句柄 通常采用client-server 模式,连接本机或网络中的两个进程。管道名字:作为客户方(连接到一个命名管道实例的一方)时,可以是"//serverName/pipe/pipename"; 作为服务器方( 创建命名管道的一方) 时,只能取serverName 为//./pipe/PipeName, 不能在其它机器上创建管道
CreateNamedPipe 在服务器端创建并返回一个命名管道句柄; ConnectNamedPipe 在服务器端等待客户进程的请求; CallNamedPipe 从管道客户进程建立与服务器的管道连接;
ReadFile、WriteFile( 用于阻塞方式)、ReadFileEx、WriteFileEx( 用于非阻塞方式)用于命名管道的读写。
3.5.4 Windows2000/Xp邮件槽
邮件槽(mailslot):驻留在OS核心,不定长数据块(报文),不可靠传递通常采用client-server模式:单向的,从client发往server;server负责创建邮件槽,它可从邮件槽中读消息;client可利用邮件槽的名字向它发送消息;邮件槽名字:作为client(发送方)打开邮件槽时,可以是"//range/mailslot/[path]name",这里range可以是localcomputer), computerName, domainName, *(primary domain);作为server(接收方)只能在本机建立邮件槽,名字可为"//mailslot/[path]name/";
有关的API如:
–CreateMailslot服务器方创建邮件槽,返回其句柄;
–GetMailslotInfo服务器查询邮件槽的信息,如:消息长度、消息数目、读操作等待时限等;
–SetMailslotInfo服务器设置读操作等待时限;
–ReadFile服务器读邮件槽;
–CreateFile客户方打开邮件槽;
–WriteFile客户方发送消息;
在邮件槽的所有服务器句柄关闭后,邮件槽被关闭。这时,未读出的报文被丢弃,所有客户句柄都被关闭。
3.5.5 套接字
通过网络在不同计算机上进行双向通信,数据格式为字节流(一对一)或报文(多对一,一对多);主要用于网络通信;
•支持client-server模式和peer-to-peer模式,本机或网络中的两个或多个进程进行交互。提供TCP/IP协议支持
•UNIX套接字(基于TCP/IP):send, sendto, recv, recvfrom;
•在Windows NT中的规范称为"Winsock"(与协议独立,或支持多种协议):WSASend, WSASendto, WSARecv, WSARecvfrom;