进程间通信

进程间通信

    进程间通信(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; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值